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).
źródło
Odpowiedzi:
Po trudnych chwilach znalazłem rozwiązanie. Pozwoliłem mojemu obserwatorowi wykonać polecenie po tym, co się
Mage_Catalog
pojawiło i postanowiłem całkowicie utworzyć menu.Główną ideą jest umieszczenie wszystkich istniejących elementów menu w tymczasowej tablicy, usunięcie ich z menu, a następnie dodanie moich łączy między istniejącymi elementami, a na koniec dodanie wszystkich elementów do menu ponownie. Coś takiego:
To rozwiązuje mój problem, ale mam nadzieję na bardziej elegancką metodę.
źródło
Ach, ale jest! W pliku deklaracji modułu ustaw zależność
Mage_Catalog
modułu, np .:Można również (myślę) skopiować konfigurację obserwatora katalogu do obszaru
frontend
zdarzenia i dezaktywować go w tymglobal
obszarze. Zakładam, żeglobal
zdarzenia są przetwarzane przedfrontend
zdarzeniami. (Nie mam pojęcia, dlaczego to wydarzenie jest skonfigurowaneglobal
w pierwszej kolejności).Oczywiście są też inne opcje, które można wykonać poprzez przepisywanie i PHP.
źródło
<global>
tagu, zadeklarowałem, że jestemMage_Catalog
zależny od mojego modułu (nawet jeśli czuję się trochę „brudny”, robiąc to)) i działa, ale mam inny problem. Potrzebuję innych elementów menu umieszczonych między niektórymi kategoriami i na końcu menu, więc nadal muszę móc je przenosić. Zaktualizuję pytanie.źródło