Je sais que c'est une vieille question avec beaucoup de réponses, la plupart suggèrent de modifier le modèle de menu mais cela ne fonctionne pas pour moi. Il n'est pas nécessaire d'expliquer pourquoi, disons que je suis un peu TOC pour faire les choses de la "bonne" manière.
Cette question peut servir de matériel à d'autres personnes dans le besoin. Voici.
A partir de Magento 1.7 le menu du haut est construit en utilisant un événement: page_block_html_topmenu_gethtml_before
. Ceci est utilisé par le Mage_Catalog
module pour ajouter les catégories. Je veux l'utiliser. Pour cela, j'ai créé un observateur dans mon module comme ceci:
<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>
Dans la Observer.php
classe que j'ai
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;
}
Mon observateur a un autre code qui ajoute toutes les marques comme sous-éléments du Brands
menu, mais cela n'est pas nécessaire ici.
Cela fonctionne parfaitement et ajoute un menu Brands
comme dernier élément du menu.
Le problème est que je le veux comme premier menu et mon observateur est appelé après l'observateur Mage_Catalog
qui ajoute les catégories. Puisqu'il n'y a aucun moyen (pas que je sache) de trier l'ordre des observateurs sur un événement ... J'ai un problème
[EDIT]
Comme @Benmarks l'a suggéré, j'ai fait leMage_Catalog
module dépend de mon module et maintenant mon élément de menu est le premier de la liste. Mais je dois encore ajouter des menus entre les catégories et à la fin. La création d'un nouveau module résoudrait probablement le problème avec les éléments à la fin du menu, mais j'ai toujours un problème avec ceux entre les catégories,
[/ EDIT]
Donc, fondamentalement, ma question reprend " (Comment) puis-je me déplacer enfant nœuds d'un Varien_Data_Tree_Node
dans un Varien_Data_Tree
objet? "
Veuillez ne pas suggérer d'ajouter la Brands
première catégorie dans l'arborescence des catégories. Ce n'est pas une option (comme je l'ai dit ... mon TOC à propos de ces choses).
la source
Réponses:
Après un peu de difficulté, voici la solution que j'ai trouvée. Je laisse mon observateur exécuter après celui de
Mage_Catalog
et décidé de recréer entièrement le menu.L'idée principale est de placer tous les éléments de menu existants dans un tableau temporaire, de les supprimer du menu, puis d'ajouter mes liens entre les éléments existants et, à la fin, d'ajouter à nouveau tous les éléments au menu. Quelque chose comme ça:
Cela semble résoudre mon problème, mais j'espère une méthode plus élégante pour le faire.
la source
Ah, mais il y en a! Dans votre fichier de déclaration de module, définissez la dépendance de
Mage_Catalog
votre module, par exemple:En outre, vous pouvez (je pense) copier la configuration de l'observateur de catalogue dans la
frontend
zone d'événements et la désactiver dans laglobal
zone. Mon hypothèse est que lesglobal
événements sont traités avantfrontend
événements. (Je ne sais pas pourquoi cet événement est configuréglobal
en premier lieu.)Et bien sûr, il existe d'autres options que vous pouvez effectuer via les réécritures et PHP.
la source
<global>
balise, j'ai déclaréMage_Catalog
dépendre de mon module (même si je me sens un peu "sale" en faisant ça) et cela fonctionne, mais je me retrouve avec un autre problème. J'ai besoin d'autres éléments de menu placés entre certaines catégories et à la fin du menu, j'ai donc encore besoin de pouvoir les déplacer dans les environs. Je mettrai à jour la question.la source