5

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

谁能告诉我该怎么做?:)

任何帮助表示赞赏:)

4

3 回答 3

13

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

在您的模块上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 */

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

于 2013-01-09T15:42:54.510 回答
8

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

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

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

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');
于 2012-10-31T15:17:27.233 回答
1

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

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

Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select));
于 2016-11-02T04:31:19.690 回答