Sei que essa é uma pergunta antiga com muitas respostas, a maioria delas sugere editar o modelo de menu, mas isso não funciona para mim. Não há necessidade de explicar por que, digamos, eu sou um pouco viciado em fazer as coisas da maneira "certa".
Esta questão pode servir como material para outras pessoas necessitadas. Aqui vai.
Começando com Magento 1.7 no menu superior é construído usando um evento: page_block_html_topmenu_gethtml_before
. Isso é usado pelo Mage_Catalog
módulo para adicionar as categorias. Eu quero usar isso. Para isso, criei um observador no meu 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>
Na Observer.php
aula eu tenho
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;
}
Meu observador tem algum outro código que adiciona todas as marcas como subitens do Brands
menu, mas não há necessidade disso aqui.
Isso funciona perfeitamente e adiciona um menu Brands
como último item no menu.
A questão é que eu quero isso como o primeiro menu e meu observador é chamado após o observador Mage_Catalog
que adiciona as categorias. Como não há nenhuma maneira (não que eu saiba) de classificar a ordem dos observadores em um evento ... Eu tenho um problema
[EDIT]
Como o @Benmarks sugeriu, eu fiz oMage_Catalog
O módulo depende do meu módulo e agora meu item de menu é o primeiro da lista. Mas ainda tenho que adicionar menus entre as categorias e no final. Criando um novo módulo provavelmente iria resolver o problema com os itens no final do menu, mas ainda tenho um problema com os entre categorias,
[/ EDIT]
Então, basicamente a minha pergunta currículos para " (Como) eu posso me movimentar criança nós de a Varien_Data_Tree_Node
em um Varien_Data_Tree
objeto? "
Por favor, não sugira adicionar Brands
como a primeira categoria na árvore de categorias. Esta não é uma opção (como eu disse ... meu TOC sobre essas coisas).
fonte
Respostas:
Depois de lutar um pouco, aqui está a solução que encontrei. Deixei meu observador executar o que estava lá
Mage_Catalog
e decidi recriar o menu completamente.A idéia principal é colocar todos os itens de menu existentes em um array temporário, removê-los do menu e adicionar meus links entre os itens existentes e, no final, adicionar todos os itens ao menu novamente. Algo assim:
Isso parece resolver o meu problema, mas espero um método mais elegante de fazer isso.
fonte
Ah, mas existe! No arquivo de declaração do módulo, defina a dependência do
Mage_Catalog
seu módulo, por exemplo:Além disso, você pode (acho) copiar a configuração do observador de catálogo para a
frontend
área de eventos e desativá-la naglobal
área. Minha suposição é que osglobal
eventos são processados antes dosfrontend
eventos. (Não faço ideia do porquê desse evento estar configuradoglobal
em primeiro lugar.)E, claro, existem outras opções que você pode efetuar através de reescritas e PHP.
fonte
<global>
tag, declareiMage_Catalog
depender do meu módulo (mesmo que me sinta um pouco 'sujo') e funciona, mas acabo com outro problema. Eu preciso de alguns outros itens de menu colocados entre algumas categorias e no final do menu, para que eu ainda possa movê-los. Vou atualizar a pergunta.fonte