我知道这是一个有很多答案的老问题,其中大多数建议编辑菜单模板,但这对我不起作用。无需解释为什么,让我有点强迫症,以“正确”的方式做事。
这个问题可以作为有需要的其他人的材料。开始。
从Magento 1.7开始,使用以下事件构建顶部菜单:page_block_html_topmenu_gethtml_before
。Mage_Catalog
模块使用它来添加类别。我想用那个。为此,我在模块中创建了一个观察者,如下所示:
<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>
在Observer.php
课堂上我有
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;
}
我的观察者还有一些其他代码,可以将所有品牌添加为Brands
菜单的子项目,但此处无需这样做。
这样可以完美工作,并将菜单添加为菜单Brands
中的最后一项。
问题是我希望将其作为第一个菜单,然后在Mage_Catalog
添加类别的观察者之后调用观察者。由于无法(不是我所知道的)对事件上观察者的顺序进行排序...我有一个问题
[编辑]
正如@Benmarks所建议的,Mage_Catalog
模块取决于我的模块,现在我的菜单项是列表中的第一项。但是我仍然必须在类别之间和最后添加菜单。创建一个新模块可能会解决菜单末尾项目的问题,但是我仍然对类别之间的项目有疑问,
[/ EDIT]
因此,基本上我的问题恢复为“ (如何移动孩子?对象Varien_Data_Tree_Node
中的一个节点Varien_Data_Tree
?”
请不要建议将Brands
类别添加为类别树的第一个类别。这不是一个选择(就像我说的...我对这些事情的强迫症一样)。