Hinzufügen von Links zum Kategoriemenü

20

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_CatalogModul 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.phpKlasse 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 BrandsMenüs hinzufügt, aber das ist hier nicht erforderlich.
Dies funktioniert perfekt und fügt ein Menü Brandsals 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_CatalogModul 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_Nodein einem Varien_Data_TreeObjekt? "
Bitte schlagen Sie nicht vor, die Brandsals erste Kategorie im Kategoriebaum hinzuzufügen . Dies ist keine Option (wie ich schon sagte ... meine OCD über diese Dinge).

Marius
quelle
Gibt es einen Grund, keine leeren Kategorien zu erstellen und nur einen CMS-Block anzuzeigen? - Ich akzeptiere "Ja" als Antwort, nur um sicherzugehen, dass Sie darüber nachgedacht haben :)
Fabian Blechschmidt
1
@FabianBlechschmidt. "Ja". Es macht keinen Sinn, auf Details einzugehen, aber es gibt Gründe (einige von ihnen mögen ziemlich dumm sein). Ich mache hier nicht die "Regeln". Also muss es so gemacht werden.
Marius
@FabianBlechschmidt: Den "Nebel" hier zu beseitigen, ist ein guter Grund, also wirst du nicht sagen, dass ich stur bin (auch wenn ich es bin). Die benutzerdefinierten Links (Marken, Neuheiten, Verkäufe und andere) befinden sich nicht in allen Geschäftsansichten an derselben Stelle. Alle Geschäftsansichten verwenden jedoch dieselben Kategorien. Daher möchte ich nicht für jede Geschäftsansicht einen anderen Baum erstellen. Mithilfe eines Beobachters kann ich einige Konfigurationseinstellungen lesen und die Elemente so anordnen, wie ich es möchte. Ich kann die Menüpunkte sogar abhängig von der ID der Geschäftsansicht hinzufügen.
Marius
Auch interessiert, ich habe das gleiche Problem, meine Lösung ist, Varien_Data_Tree_Node_Collection zu überschreiben und hier eine Methode hinzuzufügen, um Knoten zu sortieren, wie ich will, aber ich bin auf der Suche nach einem saubereren Weg.
Fab

Antworten:

10

Nach ein wenig Mühe ist hier die Lösung, die ich gefunden habe. Ich ließ meinen Beobachter nach dem einen ausführen Mage_Catalogund 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:

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);
    //temporary array with nodes
    $menuItems = array();
    //my first menu item
    $menuItems[] = $brandNode;
    //loop through existing menu items, add them to the array and remove them from the    menu
    foreach ($menu->getChildren() as $child){
        //add the item to the temp array
        $menuItems[] = $child;
        //remove item from the menu
        $menu->removeChild($child);
        //I need to add a new menu item after the category with id 6
        //don't worry the id is not hard coded. it comes from a config setting
        //I just added 6 here to make it easier to read
        if ($child->getId() == 'category-node-6'){
            //create a new node as $brandNode called $newNode
            ...
            //add the node to my temp array
            $menuItems[] = $newNode;
        }
    }
    //add other nodes at the end of my temp array
    ...
    //recreate the menu in the order I need
    foreach ($menuItems as $child){
        $menu->addChild($child);
    }
}

Dies scheint mein Problem zu lösen, aber ich hoffe auf eine elegantere Methode, um es zu tun.

Marius
quelle
Marius gibt es einen anderen Beobachter als page_block_html_topmenu_gethtml_before, um Links zum Kategoriemenü hinzuzufügen?
Pradeep Sanku
Grund ist, dass ich den gleichen Beobachter verwendet hatte, aber ich hatte eine Erweiterung für megamenu, die nicht page_block_html_topmenu_gethtml_before.please aufruft, lassen Sie es mich wissen
Pradeep Sanku
@PradeepSanku. Ich kenne kein anderes Ereignis. Möglicherweise ersetzt die von Ihnen verwendete Erweiterung das Hauptmenü vollständig. Sie sollten den Entwickler um Unterstützung bitten.
Marius
4

Da es keine Möglichkeit gibt (die ich nicht kenne), die Reihenfolge der Beobachter eines Ereignisses zu sortieren ... Ich habe ein Problem.

Ah, aber es gibt! Stellen Sie in Ihrer Moduldeklarationsdatei die Abhängigkeit Mage_CatalogIhres Moduls ein, z.

<modules>
    <Your_Module>
        <active>true</active>
        <codePool>local</codePool>
    </Your_Module>
    <Mage_Catalog>
        <depends>
            <Your_Module/>
        </depends>
    </Mage_Catalog>
</modules>

Sie können (glaube ich) auch die Katalogbeobachter-Konfiguration in den frontendEreignisbereich kopieren und dort deaktivieren global. Ich gehe davon aus, dass globalEreignisse vor frontendEreignissen verarbeitet werden. (Ich habe keine Ahnung, warum dieses Ereignis überhaupt unter konfiguriert ist global.)

Und natürlich gibt es noch andere Optionen, die Sie durch Umschreiben und PHP beeinflussen können.

benmarks
quelle
Vielen Dank. Du hast meine +1 hier. Ich habe mein Event tatsächlich in das <global>Tag verschoben , ich habe erklärt, dass ich Mage_Catalogvon 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.
Marius
-1
  1. Neue Unterkategorie erstellen
  2. ändere den Link mit Javascript, ex deine neue Kategorie ist "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });

zatanabee
quelle
und woher weiß ich die ID des Elements, wenn es mit einer ID funktionieren soll? Dies ist keine praktikable Lösung. Ich werde es nicht einmal als Workaround bezeichnen.
Marius
es funktioniert mit meinem Code ... :)
zatanabee
the id show @ Catalogue> Kategorien verwalten
zatanabee