вторник, 15 июля 2014 г.

Выводим на странице объявления AdsManager похожие объявления

  Приветствую, читатели! Очередная статья в блоге будет посвящена компоненту AdsManager, а в частности - вопросу о том, как на странице объявления вывести похожие объявления. Под похожими будем понимать объявления из той же категории (рубрики).

Техническое задание:
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) {
    $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;
}
  Функция принимает три аргумента, а именно: количество объявлений, ID категории и ID просматриваемого объявления. Возвращает установленное аргументом $nbcontents количество случайных объявлений.

  Далее. Идём в папку components/com_adsmanager/views/details и открываем для редактирования файл view.html.php. В нём находим функцию display() и, например, перед строчкой
parent::display($tpl);
вставляем следующие строчки
$more_ads = $contentmodel->getMoreContents(5, $catid, $content->id);
$this->assignRef('more_ads', $more_ads);
  Цифра 5 задаёт количество объявлений, которые будут извлечены из базы. Передача переменной $catid добавляет в запрос к базе № категории. Переменная id объекта $content передаёт в функцию идентификатор просматриваемого объявления.

  Спускаемся в конец документа и перед закрывающей фигурной скобкой класса вставляем функцию, которая и будет выводить похожие объявления
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(), так как она слишком «тяжёлая» для столь простой задачи.

5 комментариев:

  1. Круто!
    Повторил на версии 3.03 - все гуд. Объявы выводятся списком. А нельзя ли к ним картинки по 1 шт. приаттачить?
    Ну и в ссылке у меня к ним "?Itemid=" добавляется типо так: 1893-prodam-plm-suzuki-df15.html?Itemid=
    Как бы убрать?
    Спасибо!

    ОтветитьУдалить
    Ответы
    1. Что значит «картинки приаттачить»?

      Чтобы убрать 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. Поставил ваш код на версию 2.9.13,работает очень хорошо,только вот одна проблемка,не выводит загруженные пользователем картинки,вместо них выводит картинку ADSMANAGER_NOPIC ,т.е. типа нет изображения,как исправить?И ещё я добавил к последнему коду вывод текста (
    displayMoreAds($this->more_ads, $this->Itemid, $this->conf->nb_images);)
    ?>,а в языковой файл добавил ADSMANAGER_SIMILAR_ADS="Похожие объявления".Как всё таки вывести изображения в этой версии?подскажите пожалуйста.

    ОтветитьУдалить
    Ответы
    1. что бы вывести картинку нужно вот здесь:
      $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/' прописать аналогично.

      Удалить
  3. Добрый день! Подскажите, а как из базы вывести поля от adsmanager, например имя, город, телефон и т.д. заранее спасибо!

    ОтветитьУдалить