【问题标题】:Magento get category attribute value in Topmenu.phpMagento 在 Topmenu.php 中获取类别属性值
【发布时间】:2012-10-31 09:24:21
【问题描述】:

我创建了一个自定义类别属性。 现在我需要在 Topmenu.php 的 _getHtml() 函数中访问它的值。

谁能告诉我怎么做?:)

任何帮助表示赞赏:)

【问题讨论】:

  • 你用的是什么版本?答案取决于您使用的是 1.7 还是更低版本

标签: magento menu attributes categories


【解决方案1】:

安德鲁的回答是我通常这样做的方式。但是,重要的是要注意,如果您要添加自定义属性,并且如果您希望您的商店在启用和不启用类别平面表的情况下工作,您需要确保将以下内容添加到您的代码中:

在你模块的config.xml:

...
<frontend>
    <category>
        <collection>
            <attributes>
                <my_attribute /><!-- your attribute code here -->
            </attributes>
        </collection>
    </category>
</frontend>
...

这将确保在Mage_Catalog_Model_Resource_Category_Tree::_getDefaultCollection() 上创建默认类别集合时加载您的属性。现在,当商店设置为 以使用类别平面表时,这很有效。如果您想使用平面表格,您还需要在Mage_Catalog_Model_Resource_Category_Flat::_loadNodes 中添加您的属性。在下面找到创建选择的代码,并在那里添加您的属性代码:

$select = $_conn->select()
    ->from(
        array('main_table' => $this->getMainStoreTable($storeId)),
        array('entity_id',
            new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('name')),
            new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('path')),
            'is_active',
            'is_anchor',
            'my_attribute')) /* add your attribute code here */

只有在那之后你的属性才会出现在观察者身上。不用说,使用覆盖,永远不要更改核心代码。

【讨论】:

  • 在 Andrew 的回答之上,我必须执行此处显示的 config.xml 部分才能使其正常工作。谢谢!
  • 是的,我同意 Anthony 的观点,除了 Andrew 的回答,我们也需要遵循这些变化。
【解决方案2】:

除非您进行一些更改,否则您将无法在 TopMenu 块中获取此类数据。

导航是使用通用树结构构建的,该树结构没有类别是什么的概念,但是这是在其他地方使用类别构建的。

如果您查看 Topmenu.php 内部,您将看到导航的构建位置:

Mage::dispatchEvent('page_block_html_topmenu_gethtml_before', array(
    'menu' => $this->_menu
));

这将触发一个事件,该事件附加了一个观察者,它将为我们构建导航项,这恰好是:

Model: Mage_Catalog_Model_Observer
Method: _addCategoriesToMenu()

然后您可以将新属性添加到节点数据中,然后可以在 Topmenu.php 中使用该属性

例子:

$categoryData = array(
    'name' => $category->getName(),
    'id' => $nodeId,
    'url' => Mage::helper('catalog/category')->getCategoryUrl($category),
    'is_active' => $this->_isActiveMenuCategory($category),
    'my_attribute' => $category->getData('my_attribute') // Add our data in...
);

你应该可以在 Topmenu::_getHtml() 中使用它

echo $child->getData('my_attribute');

【讨论】:

  • 谢谢,我自己搞定了,忘记在这里发帖了。但我希望这个答案能帮助其他试图实现同样目标的人。
【解决方案3】:

只是为了完成 Gabriel Queiroz Silva 的回答:

您可以使用观察者,而不是编辑或覆盖 Mage_Catalog_Model_Resource_Category_Flat::_loadNodes 方法:

Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select));

【讨论】:

  • 很高兴他们添加了这个事件,当我写答案时它并不存在......确实比覆盖要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多