Одной из вещей, которые могут казаться легкими при кастомизации вашего сайта на 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>


<p>Инициализация модуля</p>

В директории app/etc/modules создаем xml-файл My_Module.xml со следующим содержанием:


  <config>
    <modules>
      <my_module>
      <active>true</active>
      <codePool>local</codePool>
      </my_module>
    </modules>
  </config>


<p>Observer.php</p>

Теперь создадим файл 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);
    }
}
  
}