понедельник, 16 декабря 2013 г.

Делаем меню с категориями AdsManager внутри компонента

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

Техническое задание:
 1. На страницах категорий сделать меню с ссылками на опубликованные категории AdsManager;
 2. Меню должно отображаться на всех страницах с категориями (в списках объявлений), а также на странице "Все объявления";
 3. При переходе в какую-либо категорию должен раскрываться список подкатегорий этой категории;
 4. Если посетитель находится в подкатегории, список категорий и список соседних подкатегорий должны отображаться.

Сведения:
Версия Joomla 1.5.15
Версия AdsManager 2.6.5

  Задача, казалось бы, простая, ведь на то есть отдельный модуль в стандартной сборке AdsManager. Можно установить его, но в этом случае модуль будет отображаться на всех страницах компонента и придётся искать условия, которые бы позволили скрывать категории на главной странице компонента и на страницах объявлений, а можно приложить немного усилий и встроить функции из этого модуля в сам компонент.

  Мне нужно было выводить данное меню только на страницах категорий, поэтому для работы понадобились файлы шаблона list: components/com_adsmanager/views/list/view.html.php и components/com_adsmanager/views/list/tmpl/default.php.

  Сначала нам нужно создать саму функцию в файле view.html.php, а также написать несколько строк кода, чтобы заносить в нужные переменные нужные для работы данные.

Открываем файл view.html.php, ищем функцию display() и, например, после строчки
$contents = $contentmodel->getContents($filters,$limitstart, $limit,$filter_order,$filter_order_Dir);
вставляем следующее
$cats_menu = $catmodel->getCatTree(true,true,$nbcontents);
$this->assignRef('cats_menu',$cats_menu);

$ccats = $catmodel->getCategories();
$orderlist = array();
foreach($ccats as $v) { $orderlist[$v->id] = $v; }
$this->assignRef('orderlist',$orderlist);
  В этом же файле переходим к последней фигурной скобке и вставляем перед ней этот код
function displayMenuCats($id, $level, &$children, $itemid, $current_list) {
    if (@$children[$id]) {
        foreach($children[$id] as $row) { ?>
            <li>
            <?php
            $link = JRoute::_("index.php?option=com_adsmanager&view=list&catid=".$row->id."&Itemid=$itemid");
            echo '<a href="'.$link.'">'.$row->name.'</a>';
            if(@$current_list[count($current_list) - 1 - $level] == $row->id) {
                echo '<ul>';
                $this->displayMenuCats($row->id, $level+1, $children, $itemid, $current_list);
                echo '</ul>';
            }
            ?>
            </li>
            <?php
        }
    }
}
  Затем открываем файл default.php и в месте, где собираемся выводить меню, вставляем
<ul><?php
$current_list[] = $this->catid;
if ($this->catid != -1) {
    $current = $this->catid;
    while((isset($this->orderlist[$current])) && ($this->orderlist[$current]->parent != 0)) {
        $current_list[] = $this->orderlist[$current]->parent;
        $current = $this->orderlist[$current]->parent;
    }
}
$this->displayMenuCats(0, 0, $this->cats_menu, $this->Itemid, $current_list);
?></ul>
  Сохраняем оба файла, загружаем на хостинг и радуемся удобному меню, доступному только на страницах категорий и раскрывающемуся при переходе к подкатегориям. А место на главной странице компонента и страницах объявлений, которое бы занимал модуль mod_adsmanager_menu, лучше занять какой-то более полезной информацией. У меня, например, на главной странице уже есть список всех категорий, поэтому список разделов был совершенно бесполезным; освободившееся пространство я занял «новыми объявлениями».

  P. S. Чтобы подстроить меню под дизайн сайта, да и вообще как-то украсить ссылки в нём, не забудьте прописать стили для созданных списков ul.

2 комментария:

  1. здравствуйте, такой вопрос. статья конечно отличная. ток вот у мня задача другая. объявления каждой категории выводятся отдельно, а вот подкатегории почему-то привязаны к главному меню, т.е. к HOME adsmanagera. как можно решить вопрос вывода объяв из подкатегорий так же как и родительских объяв. а то у мня получается в сайдбаре то что на главке одна горизонтальная полоса топ объявлений, а на других страницах хотелось бы полосу случайных. так вот с подкатегориями получается привязка топа с главки.С уважением, kosmonavtik@inbox.ru

    ОтветитьУдалить
  2. Большое спасибо! В версии AdsManager 2.8 также работает

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