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_Catalog
moduł 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.php
klasie 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 Brands
menu, ale tutaj nie ma takiej potrzeby.
Działa to doskonale i dodaje menu Brands
jako 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_Catalog
dodaje 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_Catalog
moduł 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_Node
w Varien_Data_Tree
obiekcie? ”
Nie sugeruj dodawania Brands
pierwszej kategorii w drzewie kategorii. To nie jest opcja (jak powiedziałem ... mój OCD na te rzeczy).