向Magento顶部菜单或者主菜单中添加东西听起来很简单。但是,我们这里谈论的是Magento,它并不像听起来的那么容易。一种特殊的方式创建菜单项(不使用后台categories)让这个听起来简单的任务成了一场噩梦。幸运的是,Magento中藏有这么一个方法。 Magento的逻辑只允许类别(categories)出现在顶部导航。当创建一个类别的时候只要设置Include in Navigation Menu就会显示在导航里。Magento已经解释了通过创建一个假的类别和重定向一个特殊的页面来添加一个菜单项。但他们也给了个事件挂钩去对顶部菜单做更灵活的事情。 Config首先,在config.xml中通过添加下面的代码来定义挂钩。通过这个我们简单地添加当一个时间,当挂钩、模型、方法名被请求时调度事件就会去掉它。 <config> <frontend> <events> <page_block_html_topmenu_gethtml_before> <observers> <my_module> <class>my_module/observer</class> <method>addToTopmenu</method> </my_module> </observers> </page_block_html_topmenu_gethtml_before> </events> </frontend> </config> Observer现在,一个包含addTopmenu方法的观察者已经在config.xml中被定义。下面的代码只是个例子,添加一个名为 “Categories”的顶部菜单项以及子分类项,类别名。好了,这样我们就能创建嵌套菜单项。 public function addToTopmenu(Varien_Event_Observer $observer) { $menu = $observer->getMenu(); $tree = $menu->getTree(); $node = new Varien_Data_Tree_Node(array( 'name' => 'Categories', 'id' => 'categories', 'url' => Mage::getUrl(), // point somewhere ), 'id', $tree, $menu); $menu->addChild($node); // Children menu items $collection = Mage::getResourceModel('catalog/category_collection') ->setStore(Mage::app()->getStore()) ->addIsActiveFilter() ->addNameToResult() ->setPageSize(3); foreach ($collection as $category) { $tree = $node->getTree(); $data = array( 'name' => $category->getName(), 'id' => 'category-node-'.$category->getId(), 'url' =>> $category->getUrl(), ); $subNode = new Varien_Data_Tree_Node($data, 'id', $tree, $node); $node->addChild($subNode); } }(责任编辑:好模板) |