Приветствую, читатели! Очередная статья в блоге будет посвящена компоненту AdsManager, а в частности - вопросу о том, как на странице объявления вывести похожие объявления. Под похожими будем понимать объявления из той же категории (рубрики).
Техническое задание:
1. На страницах объявлений сделать блок с объявлениями из этой же категории;
2. Выводимые объявления должны быть случайными (без сортировки по дате и какому-либо ещё полю);
3. В блоке должны выводиться изображения и заголовки объявлений;
4. В блоке не должно присутствовать объявление, которое просматривается на данный момент.
Сведения:
Версия Joomla 1.5.15
Версия AdsManager 2.6.5
Для решения подобной задачи разработчики компонента сделали отдельный модуль, однако, на мой взгляд, он не лишён недостатков. В частности, модуль встраивается на все страницы компонента, а не только на страницу объявления, и не фильтрует объявления по ID, что означает, что в список похожих может попасть и просматриваемое объявление.
Итак, приступим. Для начала нам необходимо написать функцию, которая будет извлекать из базы нужные нам объявления с заданными параметрами. Как и другие функции, связанные с контентом, эту нам нужно будет создать в файле administrator/components/com_adsmanager/models/content.php. Назовём новую функцию getMoreContent().
Далее. Идём в папку components/com_adsmanager/views/details и открываем для редактирования файл view.html.php. В нём находим функцию display() и, например, перед строчкой
Спускаемся в конец документа и перед закрывающей фигурной скобкой класса вставляем функцию, которая и будет выводить похожие объявления
Наконец, идём в папку components/com_adsmanager/views/details/tmpl и открываем для редактирования файл default.php. В месте, где требуется выводить похожие объявления, вызываем созданную на предыдущем этапе функцию:
P. S. Я не стал модернизировать под эти цели существующую функцию getLatestContents(), так как она слишком «тяжёлая» для столь простой задачи.
Техническое задание:
1. На страницах объявлений сделать блок с объявлениями из этой же категории;
2. Выводимые объявления должны быть случайными (без сортировки по дате и какому-либо ещё полю);
3. В блоке должны выводиться изображения и заголовки объявлений;
4. В блоке не должно присутствовать объявление, которое просматривается на данный момент.
Сведения:
Версия Joomla 1.5.15
Версия AdsManager 2.6.5
Для решения подобной задачи разработчики компонента сделали отдельный модуль, однако, на мой взгляд, он не лишён недостатков. В частности, модуль встраивается на все страницы компонента, а не только на страницу объявления, и не фильтрует объявления по ID, что означает, что в список похожих может попасть и просматриваемое объявление.
Итак, приступим. Для начала нам необходимо написать функцию, которая будет извлекать из базы нужные нам объявления с заданными параметрами. Как и другие функции, связанные с контентом, эту нам нужно будет создать в файле administrator/components/com_adsmanager/models/content.php. Назовём новую функцию getMoreContent().
function getMoreContents($nbcontents, $categoryid, $contentid) {Функция принимает три аргумента, а именно: количество объявлений, ID категории и ID просматриваемого объявления. Возвращает установленное аргументом $nbcontents количество случайных объявлений.
$sql = "SELECT a.*, adcat.catid AS catid FROM #__adsmanager_ads AS a INNER JOIN #__adsmanager_adcat AS adcat ON adcat.adid = a.id WHERE adcat.catid = $categoryid AND a.published = 1 AND a.id <> $contentid GROUP BY a.id ORDER BY RAND() LIMIT 0, $nbcontents";
$this->_db->setQuery($sql);
$contents = $this->_db->loadObjectList();
return $contents;
}
Далее. Идём в папку components/com_adsmanager/views/details и открываем для редактирования файл view.html.php. В нём находим функцию display() и, например, перед строчкой
parent::display($tpl);вставляем следующие строчки
$more_ads = $contentmodel->getMoreContents(5, $catid, $content->id);Цифра 5 задаёт количество объявлений, которые будут извлечены из базы. Передача переменной $catid добавляет в запрос к базе № категории. Переменная id объекта $content передаёт в функцию идентификатор просматриваемого объявления.
$this->assignRef('more_ads', $more_ads);
Спускаемся в конец документа и перед закрывающей фигурной скобкой класса вставляем функцию, которая и будет выводить похожие объявления
function displayMoreAds($contents, $itemid, $nbimages) {Не забудьте изменить путь к каталогу с изображениями, если он у вас отличается от папки по умолчанию. Также в этой функции необходимо будет прописать классы, чтобы выравнивать блоки с объявлениями с помощью стилей.
if (count($contents) > 0) {
?>
<div><?php
foreach($contents as $content) {
$linkTarget = JRoute::_("index.php?option=com_adsmanager&view=details&id=".$content->id."&catid=".$content->catid."&Itemid=".$itemid);
?>
<div>
<div><a href="<?php echo $linkTarget; ?>"><?php
$ok = 0; $i = 1;
while(!$ok) {
if ($i < $nbimages + 1) {
$ext_name = chr(ord('a')+$i-1);
$pic = JPATH_BASE."/images/com_adsmanager/ads/".$content->id.$ext_name."_t.jpg";
if(file_exists($pic)) {
echo '<img src="'.$this->baseurl.'images/com_adsmanager/ads/'.$content->id.$ext_name.'_t.jpg" alt="" />';
$ok = 1;
}
} else if ($nbimages != 0) {
echo '<img src="'.$this->baseurl.'components/com_adsmanager/images/'.JText::_('ADSMANAGER_NOPIC').'" alt="" />';
$ok = 1;
} else { $ok = 1; }
$i++;
}
?></a></div>
<div><a href="<?php echo $linkTarget; ?>"><?php echo $content->ad_headline; ?></a></div>
</div>
<?php
}
?></div>
<?php
}
}
Наконец, идём в папку components/com_adsmanager/views/details/tmpl и открываем для редактирования файл default.php. В месте, где требуется выводить похожие объявления, вызываем созданную на предыдущем этапе функцию:
<?phpСохраняем изменённые файлы, загружаем на хостинг, проверяем. На страницах объявлений должны появиться похожие объявления. Вам останется лишь написать стили, чтобы всё выглядело красиво.
$this->displayMoreAds($this->more_ads, $this->Itemid, $this->conf->nb_images);
?>
P. S. Я не стал модернизировать под эти цели существующую функцию getLatestContents(), так как она слишком «тяжёлая» для столь простой задачи.
Круто!
ОтветитьУдалитьПовторил на версии 3.03 - все гуд. Объявы выводятся списком. А нельзя ли к ним картинки по 1 шт. приаттачить?
Ну и в ссылке у меня к ним "?Itemid=" добавляется типо так: 1893-prodam-plm-suzuki-df15.html?Itemid=
Как бы убрать?
Спасибо!
Что значит «картинки приаттачить»?
УдалитьЧтобы убрать Itemid, попробуйте убрать этот параметр из ссылок. То есть вместо
$linkTarget = JRoute::_("index.php?option=com_adsmanager&view=details&id=".$content->id."&catid=".$content->catid."&Itemid=".$itemid);
Написать
$linkTarget = JRoute::_("index.php?option=com_adsmanager&view=details&id=".$content->id."&catid=".$content->catid);
Если вид ссылок удовлетворяет, то можно так и оставить. Мне параметр Itemid нужен был, чтобы Joomla могла сделать «человекопонятные» ссылки.
Поставил ваш код на версию 2.9.13,работает очень хорошо,только вот одна проблемка,не выводит загруженные пользователем картинки,вместо них выводит картинку ADSMANAGER_NOPIC ,т.е. типа нет изображения,как исправить?И ещё я добавил к последнему коду вывод текста (
ОтветитьУдалитьdisplayMoreAds($this->more_ads, $this->Itemid, $this->conf->nb_images);)
?>,а в языковой файл добавил ADSMANAGER_SIMILAR_ADS="Похожие объявления".Как всё таки вывести изображения в этой версии?подскажите пожалуйста.
что бы вывести картинку нужно вот здесь:
Удалить$pic = JPATH_BASE."/iмages/com_adsmanager/ads/".$content->id.$ext_name."_t.jpg";
if(file_exists($pic)) {
echo '';
а именно вот тут:"/images/com_adsmanager/ads/" прописать путь к тем картинкам, которые хранятся картинки объявлений от adsmanager.
и вот тут:'images/com_adsmanager/ads/' прописать аналогично.
Добрый день! Подскажите, а как из базы вывести поля от adsmanager, например имя, город, телефон и т.д. заранее спасибо!
ОтветитьУдалить