将链接添加到类别菜单


20

我知道这是一个有很多答案的老问题,其中大多数建议编辑菜单模板,但这对我不起作用。无需解释为什么,让我有点强迫症,以“正确”的方式做事。
这个问题可以作为有需要的其他人的材料。开始。
从Magento 1.7开始,使用以下事件构建顶部菜单:page_block_html_topmenu_gethtml_beforeMage_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类别添加为类别树的第一个类别。这不是一个选择(就像我说的...我对这些事情的强迫症一样)。


是否有理由不创建空类别,而仅显示CMS阻止?-我接受“是”作为答案,可以肯定的是,您对此有所考虑:)
Fabian Blechschmidt 2013年

1
@FabianBlechschmidt。“是”。详细介绍没有意义,但是有一些原因(其中一些可能很愚蠢)。我没有在这一项上做“规则”。因此,必须这样做。
马里乌斯

@FabianBlechschmidt:在这里清除一些“雾”是一个很好的理由,所以您不会说我很固执(即使我是)。对于所有商店视图,定制链接(品牌,新商品,销售商品和其他商品)不在同一位置。但是所有商店视图都使用相同的类别。因此,我不想为每个商店视图创建不同的树。通过使用观察者,我可以阅读一些配置设置并根据需要排列项目。我什至可以根据商店视图ID添加菜单项。
马吕斯

同样有兴趣的是,我有同样的问题,我的解决方案是重写Varien_Data_Tree_Node_Collection并在此处添加一种根据需要对节点进行排序的方法,但我正在寻找一种更简洁的方法。
Fab

Answers:


10

经过一番努力后,我找到了解决方案。我让观察者一进去就执行了Mage_Catalog,决定完全重新创建菜单。
主要思想是将所有现有菜单项放置在一个临时数组中,将其从菜单中删除,然后在现有项之间添加我的链接,最后将所有项再次添加到菜单中。像这样:

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);
    //temporary array with nodes
    $menuItems = array();
    //my first menu item
    $menuItems[] = $brandNode;
    //loop through existing menu items, add them to the array and remove them from the    menu
    foreach ($menu->getChildren() as $child){
        //add the item to the temp array
        $menuItems[] = $child;
        //remove item from the menu
        $menu->removeChild($child);
        //I need to add a new menu item after the category with id 6
        //don't worry the id is not hard coded. it comes from a config setting
        //I just added 6 here to make it easier to read
        if ($child->getId() == 'category-node-6'){
            //create a new node as $brandNode called $newNode
            ...
            //add the node to my temp array
            $menuItems[] = $newNode;
        }
    }
    //add other nodes at the end of my temp array
    ...
    //recreate the menu in the order I need
    foreach ($menuItems as $child){
        $menu->addChild($child);
    }
}

这可以解决我的问题,但是我希望能找到一种更优雅的方法。


除了page_block_html_topmenu_gethtml_before之外,Marius还有其他观察者可以添加到类别菜单的链接吗?
Pradeep Sanku 2015年

原因是我使用了相同的观察者,但我对megamenu进行了扩展,未调用page_block_html_topmenu_gethtml_before.please me me
Pradeep

@PradeepSanku。我什么都不知道 也许您使用的扩展名将完全替换主菜单。您应该向开发人员寻求支持。
马里斯(Marius)

4

由于没有办法(我不知道)对事件上观察者的顺序进行排序……我有问题。

啊,但是有!在模块声明文件中,设置模块的依赖关系Mage_Catalog,例如:

<modules>
    <Your_Module>
        <active>true</active>
        <codePool>local</codePool>
    </Your_Module>
    <Mage_Catalog>
        <depends>
            <Your_Module/>
        </depends>
    </Mage_Catalog>
</modules>

另外,您可以(我认为)将目录观察器配置复制到frontend事件区域并在该global区域中将其停用。我的假设是global事件先于frontend事件处理。(我不知道为什么global首先要配置此事件。)

当然,还有其他选项可以通过重写和PHP来实现。


谢谢。您在这里拥有我的+1。我实际上将我的事件移到了<global>标签内,我声明Mage_Catalog要依赖我的模块(即使这样做我觉得有点“肮脏”)也可以,但是我遇到了另一个问题。我需要将其他一些菜单项放置在某些类别之间以及菜单的末尾,因此我仍然需要能够将它们左右移动。我将更新问题。
马里乌斯

-1
  1. 创建新的子类别
  2. 使用javascript更改链接,例如新类别为“ 75”
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

https:// YourNewLinkink ”;});


如果该元素可以与任何ID一起使用,我又如何知道该元素的ID?这不是可行的解决方案。我什至不称其为解决方法。
马里乌斯

它适用于我的代码... :)
zatanabee

id显示@ Catalogue>管理类别
zatanabee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.