Wiem, że to stare pytanie z dużą ilością odpowiedzi, większość z nich sugeruje edycję szablonu menu, ale to nie działa dla mnie. Nie trzeba wyjaśniać, dlaczego, powiedzmy, że jestem trochę obsesyjny na punkcie robienia rzeczy „we właściwy sposób”.
To pytanie może służyć jako materiał dla potrzebujących. Tutaj idzie.
Począwszy od Magento 1.7 top menu jest zbudowany przy użyciu zdarzenie: page_block_html_topmenu_gethtml_before. Jest to używane przez Mage_Catalogmoduł do dodawania kategorii. Chcę tego użyć. W tym celu stworzyłem obserwatora w moim module w następujący sposób:
<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>
W Observer.phpklasie mam
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;
}
Mój obserwator ma jakiś inny kod, który dodaje wszystkie marki jako podelementy Brandsmenu, ale tutaj nie ma takiej potrzeby.
Działa to doskonale i dodaje menu Brandsjako ostatnią pozycję w menu.
Problemem jest to, że chcę to jako pierwsze menu, a mój obserwator jest wywoływany po tym, jak obserwator Mage_Catalogdodaje kategorie. Ponieważ nie ma możliwości (nie wiem o tym) sortowania kolejności obserwatorów na zdarzeniu ... Mam problem
[EDYCJA]
Jak sugerował @Benmarks, zrobiłemMage_Catalogmoduł zależy od mojego modułu, a teraz mój element menu jest pierwszy na liście. Ale nadal muszę dodać menu między kategoriami i na końcu. Utworzenie nowego modułu prawdopodobnie rozwiązałoby problem z elementami na końcu menu, ale nadal mam problem z tymi między kategoriami,
[/ EDYCJA]
Tak więc w zasadzie moje pytanie powraca do „ (Jak) mogę poruszać się po dziecku węzły Varien_Data_Tree_Nodew Varien_Data_Treeobiekcie? ”
Nie sugeruj dodawania Brandspierwszej kategorii w drzewie kategorii. To nie jest opcja (jak powiedziałem ... mój OCD na te rzeczy).