Magento在Topmenu.php中获取类别属性值

时间:2012-10-31 09:24:22

标签: magento menu attributes categories

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

谁能告诉我怎么做?:)

感谢任何帮助:)

3 个答案:

答案 0 :(得分:13)

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

在您的模块上config.xml

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

这将确保在Mage_Catalog_Model_Resource_Category_Tree::_getDefaultCollection()上创建默认类别集合时加载您的属性。现在,当商店设置为 NOT 以使用类别平面表时,这种方法很有用。如果您想使用平面表,还需要在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 */

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

答案 1 :(得分:8)

除非您进行一些更改,否则您将无法在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');

答案 2 :(得分:1)

完成Gabriel Queiroz Silva的回答:

而不是编辑或覆盖Mage_Catalog_Model_Resource_Category_Flat :: _ loadNodes方法,您可以使用observer:

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