Sé que esta es una vieja pregunta con muchas respuestas, la mayoría de ellas sugiere editar la plantilla del menú, pero eso no funciona para mí. No hay necesidad de explicar por qué, digamos que soy un poco TOC por hacer las cosas de la manera "correcta".
Esta pregunta puede servir como material para otros necesitados. Aquí va.
A partir de Magento 1.7 el menú superior se construye utilizando un evento: page_block_html_topmenu_gethtml_before
. El Mage_Catalog
módulo lo usa para agregar las categorías. Quiero usar eso Para esto, he creado un observador en mi módulo como este:
<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>
En la Observer.php
clase que tengo
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;
}
Mi observador tiene otro código que agrega todas las marcas como subelementos del Brands
menú, pero no hay necesidad de eso aquí.
Esto funciona perfectamente y agrega un menú Brands
como último elemento en el menú.
El problema es que quiero esto como el primer menú y mi observador se llama después del observador Mage_Catalog
que agrega las categorías. Dado que no hay forma (no que yo sepa) de ordenar el orden de los observadores en un evento ... Tengo un problema
[EDITAR]
Como @Benmarks sugirió que hice elMage_Catalog
módulo depende de mi módulo y ahora mi elemento de menú es el primero en la lista. Pero todavía tengo que agregar menús entre las categorías y al final. La creación de un nuevo módulo probablemente resolvería el problema con los elementos al final del menú, pero todavía tengo un problema con los que están entre las categorías,
[/ EDIT]
Entonces, básicamente, mi pregunta se resume en " (¿Cómo) puedo moverme alrededor del niño? nodos de a Varien_Data_Tree_Node
en un Varien_Data_Tree
objeto? "
No sugiera agregar el Brands
como la primera categoría en el árbol de categorías. Esta no es una opción (como dije ... mi TOC sobre estas cosas).
fuente
Respuestas:
Después de luchar un poco, aquí está la solución que encontré. Dejé que mi observador se ejecutara después de la entrada
Mage_Catalog
y decidí volver a crear el menú por completo.La idea principal es hacer que todos los elementos del menú existentes los coloquen en una matriz temporal, eliminarlos del menú y luego agregar mis enlaces entre los elementos existentes y al final agregar todos los elementos al menú nuevamente. Algo como esto:
Esto parece resolver mi problema, pero espero un método más elegante para hacerlo.
fuente
Ah, pero lo hay! En el archivo de declaración de su módulo, configure la dependencia de
Mage_Catalog
su módulo, por ejemplo:Además, podría (creo) copiar la configuración del observador del catálogo en el
frontend
área de eventos y desactivarla en elglobal
área. Mi suposición es que losglobal
eventos se procesan antes que losfrontend
eventos. (No tengo idea de por qué este evento está configuradoglobal
en primer lugar).Y, por supuesto, hay otras opciones que puede realizar mediante reescrituras y PHP.
fuente
<global>
etiqueta, declaróMage_Catalog
que dependía de mi módulo (incluso si me siento un poco "sucio" haciendo eso) y funciona, pero termino con otro problema. Necesito algunos otros elementos del menú ubicados entre algunas categorías y al final del menú, así que todavía necesito poder moverlos alrededor. Actualizaré la pregunta.fuente