Я знаю, что это старый вопрос с множеством ответов, большинство из них предлагают редактировать шаблон меню, но это не работает для меня. Нет необходимости объяснять, почему, скажем, я немного пристрастен к тому, чтобы делать вещи «правильным» способом.
Этот вопрос может служить материалом для других нуждающихся. Вот оно.
Начиная с Magento 1.7 Верхнее меню строится с помощью события: page_block_html_topmenu_gethtml_before
. Это используется Mage_Catalog
модулем для добавления категорий. Я хочу использовать это. Для этого я создал наблюдателя в моем модуле так:
<global>
<events>
<page_block_html_topmenu_gethtml_before>
<observers>
<my_observer>
<class>mymodule/observer</class>
<method>addItemsToTopmenuItems</method>
</my_observer>
</observers>
</page_block_html_topmenu_gethtml_before>
</events>
</global>
В Observer.php
классе у меня
public function addItemsToTopmenuItems($observer){
//get the menu object: //Type Varien_Data_Tree_Node
$menu = $observer->getMenu();
//get the tree object in the menu //type Varien_Data_Tree
$tree = $menu->getTree();
//get current page handler
$action = Mage::app()->getFrontController()->getAction()->getFullActionName();
$brandNodeId = 'category-node-brand';
//set the node id, label and url
$data = array(
'name' => Mage::helper('catalog')->__('Brands'),
'id' => $brandNodeId,
'url' => Mage::getUrl('brands'),
'is_active' => ($action == 'brands')
);
//create a node object
$brandNode = new Varien_Data_Tree_Node($data, 'id', $tree, $menu);
//add the node to the menu
$menu->addChild($brandNode);
return $this;
}
У моего обозревателя есть какой-то другой код, который добавляет все бренды в качестве подпунктов Brands
меню, но здесь в этом нет необходимости.
Это прекрасно работает и добавляет меню Brands
в качестве последнего пункта в меню.
Проблема в том, что я хочу это как первое меню, и мой наблюдатель вызывается после того, как наблюдатель Mage_Catalog
добавляет эти категории. Поскольку нет способа (не то, что я знаю) сортировать порядок наблюдателей на событии ... У меня есть проблема
[РЕДАКТИРОВАТЬ]
Как @Benmarks предположил, что я сделалMage_Catalog
модуль зависит от моего модуля и теперь мой пункт меню является первым в списке. Но я все еще должен добавить меню между категориями и в конце. Создание нового модуля, вероятно, решило бы проблему с элементами в конце меню, но у меня все еще есть проблема с элементами между категориями,
[/ EDIT]
Так что в основном мой вопрос возвращается к « (Как) я могу перемещаться вокруг ребенка? узлы Varien_Data_Tree_Node
в Varien_Data_Tree
объекте? "
Пожалуйста, не предлагайте добавлять Brands
первую категорию в дерево категорий. Это не вариант (как я уже сказал ... мой OCD об этих вещах).
источник
Ответы:
После небольшой борьбы вот решение, которое я нашел. Я позволил своему наблюдателю выполнить его после того, как он вошел,
Mage_Catalog
и решил заново создать меню полностью.Основная идея состоит в том, чтобы получить все существующие пункты меню, поместить их во временный массив, удалить их из меню, затем добавить мои ссылки между существующими элементами и в конце добавить все элементы в меню снова. Что-то вроде этого:
Это похоже на решение моей проблемы, но я надеюсь на более элегантный способ сделать это.
источник
Ах, но есть! В файле объявления вашего модуля установите зависимость от
Mage_Catalog
вашего модуля, например:Кроме того, вы можете (я думаю) скопировать конфигурацию наблюдателя каталога в область
frontend
событий и деактивировать ее в этойglobal
области. Я предполагаю, чтоglobal
события обрабатываются доfrontend
событий. (Я понятия не имею, почему это событие настраиваетсяglobal
в первую очередь.)И, конечно, есть и другие варианты, которые вы можете применить через переписывание и PHP.
источник
<global>
тега, я объявил,Mage_Catalog
что он зависит от моего модуля (даже если я чувствую себя немного «грязным» при этом), и это работает, но в итоге я столкнулся с другой проблемой. Мне нужны другие пункты меню, расположенные между некоторыми категориями и в конце меню, поэтому мне все еще нужно иметь возможность перемещать их по кругу. Я обновлю вопрос.источник