Кастомизация Topmenu в Magento
10 нояб. 2014
Одной из вещей, которые могут казаться легкими при кастомизации вашего сайта на Magento, является работа с главным меню - topmenu. Но это не совсем так. Особенный метод создания пунктов меню из категорий делает эту задачу не такой простой, как кажется с первого взгляда.
Логика Magento позволяет появляться в главной навигации только товарным категориям - при создании новой категории она автоматически появляется в верхнем меню. Но что делать, если мы хотим вставить в это меню произвольную ссылку? Как вариант можно создать "поддельную" категорию и поставить редирект на нашу произвольную страницу, но есть и более универсальный способ, который мы и опишем.
Config.xml
Сперва создадим структуру директорий app/code/local/My/Module/etc, поместим туда config.xml и добавим в него код:
<config>
<frontend>
<events>
<page_block_html_topmenu_gethtml_before>
<observers>
<my_module>
<class>my_module/observer</class>
<method>addToTopmenu</method>
</my_module>
</observers>
</page_block_html_topmenu_gethtml_before>
</events>
</frontend>
</config>
Инициализация модуля
В директории app/etc/modules создаем xml-файл My_Module.xml со следующим содержанием:
<config>
<modules>
<my_module>
<active>true</active>
<codePool>local</codePool>
</my_module>
</modules>
</config>
Observer.php
Теперь создадим файл observer.php в директории app/code/local/My/Module/Model, определенный в config.xml. Observer содержит метод addToTopmenu. Код ниже добавляет главный пункт меню под названием "Категории" вместе с его дочерними пунктами:
class My_Module_Model_Observer
{
public function addToTopmenu(Varien_Event_Observer $observer)
{
$menu = $observer->getMenu();
$tree = $menu->getTree();
$node = new Varien_Data_Tree_Node(array(
'name' => 'Категории',
'id' => 'categories',
'url' => Mage::getUrl(), // point somewhere
), 'id', $tree, $menu);
$menu->addChild($node);
// Children menu items
$collection = Mage::getResourceModel('catalog/category_collection')
->setStore(Mage::app()->getStore())
->addIsActiveFilter()
->addNameToResult()
->setPageSize(3);
foreach ($collection as $category) {
$tree = $node->getTree();
$data = array(
'name' => $category->getName(),
'id' => 'category-node-'.$category->getId(),
'url' => $category->getUrl(),
);
$subNode = new Varien_Data_Tree_Node($data, 'id', $tree, $node);
$node->addChild($subNode);
}
}
}