Ich weiß, dass dies eine alte Frage mit vielen Antworten ist. Die meisten schlagen vor, die Menüvorlage zu bearbeiten, aber das funktioniert bei mir nicht. Es ist nicht nötig zu erklären, warum, sagen wir, ich bin ein bisschen übertrieben, wenn es darum geht, Dinge "richtig" zu machen.
Diese Frage kann als Material für andere Bedürftige dienen. Hier geht.
Beginnend mit Magento 1.7 Das Hauptmenü wird ein Ereignis gebaut werden: page_block_html_topmenu_gethtml_before
. Dies wird vom Mage_Catalog
Modul verwendet, um die Kategorien hinzuzufügen. Ich möchte das nutzen. Dazu habe ich in meinem Modul einen Beobachter angelegt:
<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>
In der Observer.php
Klasse habe ich
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;
}
Mein Beobachter hat einen anderen Code, der alle Marken als Unterpunkte des Brands
Menüs hinzufügt, aber das ist hier nicht erforderlich.
Dies funktioniert perfekt und fügt ein Menü Brands
als letzten Punkt im Menü hinzu.
Das Problem ist, dass ich dies als erstes Menü möchte und mein Beobachter nach dem Beobachter aufgerufen wird Mage_Catalog
, der die Kategorien hinzufügt. Da es keine Möglichkeit gibt (von der ich nichts weiß), die Reihenfolge der Beobachter auf einem Ereignis zu sortieren ... Ich habe ein Problem
[
BEARBEITEN ] Wie @Benmarks vorschlug, habe ich das gemachtMage_Catalog
Modul hängt von meinem Modul ab und jetzt ist mein Menüpunkt der erste in der Liste. Aber ich muss immer noch Menüs zwischen den Kategorien und am Ende hinzufügen. Ein neues Modul anlegen würde das Problem mit den Einzelteilen am Ende des Menüs wahrscheinlich lösen, aber ich habe immer noch ein Problem , mit denen zwischen den Kategorien,
[/ EDIT]
Also im Grunde wieder meine Frage " (Wie) kann ich Kind bewegen Knoten eines Varien_Data_Tree_Node
in einem Varien_Data_Tree
Objekt? "
Bitte schlagen Sie nicht vor, die Brands
als erste Kategorie im Kategoriebaum hinzuzufügen . Dies ist keine Option (wie ich schon sagte ... meine OCD über diese Dinge).
quelle
Antworten:
Nach ein wenig Mühe ist hier die Lösung, die ich gefunden habe. Ich ließ meinen Beobachter nach dem einen ausführen
Mage_Catalog
und beschloss, das Menü komplett neu zu erstellen.Die Hauptidee ist, alle vorhandenen Menüelemente in ein temporäres Array zu setzen, sie aus dem Menü zu entfernen, dann meine Links zwischen den vorhandenen Elementen hinzuzufügen und am Ende alle Elemente erneut zum Menü hinzuzufügen. Etwas wie das:
Dies scheint mein Problem zu lösen, aber ich hoffe auf eine elegantere Methode, um es zu tun.
quelle
Ah, aber es gibt! Stellen Sie in Ihrer Moduldeklarationsdatei die Abhängigkeit
Mage_Catalog
Ihres Moduls ein, z.Sie können (glaube ich) auch die Katalogbeobachter-Konfiguration in den
frontend
Ereignisbereich kopieren und dort deaktivierenglobal
. Ich gehe davon aus, dassglobal
Ereignisse vorfrontend
Ereignissen verarbeitet werden. (Ich habe keine Ahnung, warum dieses Ereignis überhaupt unter konfiguriert istglobal
.)Und natürlich gibt es noch andere Optionen, die Sie durch Umschreiben und PHP beeinflussen können.
quelle
<global>
Tag verschoben , ich habe erklärt, dass ichMage_Catalog
von meinem Modul abhängen soll (auch wenn ich mich dabei ein wenig "dreckig" fühle), und es funktioniert, aber am Ende habe ich ein anderes Problem. Ich benötige einige andere Menüpunkte, die sich zwischen einigen Kategorien und am Ende des Menüs befinden, damit ich sie immer noch verschieben kann. Ich werde die Frage aktualisieren.quelle