Aggiunta di collegamenti al menu delle categorie


20

So che questa è una vecchia domanda con molte risposte, la maggior parte di loro suggerisce di modificare il modello di menu, ma per me non funziona. Non c'è bisogno di spiegare perché, diciamo che sono un po 'un DOC sul fare le cose nel modo "giusto".
Questa domanda può servire da materiale per gli altri bisognosi. Ecco qui.
A partire con Magento 1.7 il menu in alto è costruito utilizzando un evento: page_block_html_topmenu_gethtml_before. Questo è usato dal Mage_Catalogmodulo per aggiungere le categorie. Voglio usarlo. Per questo ho creato un osservatore nel mio modulo in questo modo:

<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>

Nella Observer.phpclasse che ho

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;
}

Il mio osservatore ha qualche altro codice che aggiunge tutte le marche come voci secondarie del Brandsmenu, ma qui non è necessario.
Funziona perfettamente e aggiunge un menu Brandscome ultima voce del menu.
Il problema è che voglio questo come primo menu e il mio osservatore viene chiamato dopo l'osservatore Mage_Catalogche aggiunge le categorie. Dal momento che non c'è modo (non che io sappia) di ordinare l'ordine degli osservatori su un evento ... Ho un problema
[EDIT]
Dato che @Benmarks mi ha suggerito di aver creato ilMage_CatalogIl modulo dipende dal mio modulo e ora la mia voce di menu è la prima nell'elenco. Ma devo ancora aggiungere menu tra le categorie e alla fine. La creazione di un nuovo modulo probabilmente risolverà il problema con gli elementi alla fine del menu, ma ho ancora un problema con quelli tra le categorie,
[/ EDIT]
Quindi in sostanza la mia domanda riprende a " (Come) posso spostarmi in giro bambino nodi di a Varien_Data_Tree_Nodein un Varien_Data_Treeoggetto? "
Non suggerire di aggiungere Brandsla prima categoria nell'albero delle categorie. Questa non è un'opzione (come ho detto ... il mio DOC su queste cose).


C'è un motivo per non creare categorie vuote e mostrare solo un blocco CMS? - Accetto "sì" come risposta, per essere sicuro, ci hai pensato :)
Fabian Blechschmidt,

1
@FabianBlechschmidt. "Sì". Non ha senso entrare nei dettagli, ma ci sono ragioni (alcuni di loro possono essere piuttosto stupidi). Non faccio le "regole" su questo. Quindi è stato fatto in questo modo.
Marius

@FabianBlechschmidt: Per eliminare un po 'di "nebbia" qui è una buona ragione, quindi non dirai che sono testardo (anche se lo sono). I collegamenti personalizzati (marchi, nuovi, vendite e altri) non si trovano nello stesso posto per tutte le visualizzazioni del negozio. Ma tutte le visualizzazioni dello store utilizzano le stesse categorie. Quindi non voglio creare un albero diverso per ogni vista del negozio. Usando un osservatore, posso leggere alcune impostazioni di configurazione e disporre gli elementi come voglio. Posso anche aggiungere le voci di menu a seconda dell'ID di visualizzazione dello store.
Marius

Anche interessato, ho lo stesso problema, la mia soluzione è quella di sovrascrivere Varien_Data_Tree_Node_Collection e aggiungere qui un metodo per ordinare i nodi come voglio, ma sto cercando un modo più pulito.
Fab

Risposte:


10

Dopo aver lottato un po 'ecco la soluzione che ho trovato. Ho lasciato eseguire il mio osservatore dopo quello in Mage_Cataloge ho deciso di ricreare del tutto il menu.
L'idea principale è di mettere tutte le voci di menu esistenti in una matrice temporanea, rimuoverle dal menu, quindi aggiungere i miei collegamenti tra le voci esistenti e alla fine aggiungere nuovamente tutte le voci al menu. Qualcosa come questo:

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);
    }
}

Questo giunge a risolvere il mio problema, ma spero in un metodo più elegante per farlo.


Marius c'è qualche altro osservatore diverso da page_block_html_topmenu_gethtml_prima di aggiungere collegamenti al menu delle categorie?
Pradeep Sanku,

Il motivo è che avevo usato lo stesso osservatore ma avevo un'estensione per megamenu che non chiama page_block_html_topmenu_gethtml_before.per favore fammi sapere
Pradeep Sanku

@PradeepSanku. Non conosco nessun altro evento. Forse l'estensione che stai usando sostituisce completamente il menu principale. Dovresti chiedere supporto allo sviluppatore.
Marius

4

Dal momento che non c'è modo (non che io sappia) di ordinare l'ordine degli osservatori su un evento ... Ho un problema.

Ah, ma c'è! Nel file di dichiarazione del modulo, impostare la dipendenza del Mage_Catalogmodulo, ad esempio:

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

Inoltre, potresti (penso) copiare la configurazione dell'osservatore del catalogo frontendnell'area dell'evento e disattivarla globalnell'area. La mia ipotesi è che gli globaleventi vengano elaborati prima degli frontendeventi. (Non ho idea del perché questo evento sia configurato globalin primo luogo.)

E, naturalmente, ci sono altre opzioni che puoi effettuare attraverso riscritture e PHP.


Grazie. Hai il mio +1 qui. In realtà ho spostato il mio evento all'interno del <global>tag, ho dichiarato Mage_Catalogdi dipendere dal mio modulo (anche se mi sento un po '"sporco" nel farlo) e funziona, ma finisco con un altro problema. Ho bisogno di alcune altre voci di menu posizionate tra alcune categorie e alla fine del menu, quindi devo essere ancora in grado di spostarle. Aggiornerò la domanda.
Marius

-1
  1. creare una nuova sottocategoria
  2. cambia il link con javascript, la tua nuova categoria è "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });


e come faccio a sapere l'id dell'elemento se dovrebbe funzionare con qualsiasi id? Questa non è una soluzione praticabile. Non lo chiamerò nemmeno una soluzione alternativa.
Marius

funziona sul mio codice ... :)
zatanabee,

id show @ Catalog> gestisci categorie
zatanabee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.