【发布时间】:2012-10-31 09:24:21
【问题描述】:
我创建了一个自定义类别属性。 现在我需要在 Topmenu.php 的 _getHtml() 函数中访问它的值。
谁能告诉我怎么做?:)
任何帮助表示赞赏:)
【问题讨论】:
-
你用的是什么版本?答案取决于您使用的是 1.7 还是更低版本
标签: magento menu attributes categories
我创建了一个自定义类别属性。 现在我需要在 Topmenu.php 的 _getHtml() 函数中访问它的值。
谁能告诉我怎么做?:)
任何帮助表示赞赏:)
【问题讨论】:
标签: magento menu attributes categories
安德鲁的回答是我通常这样做的方式。但是,重要的是要注意,如果您要添加自定义属性,并且如果您希望您的商店在启用和不启用类别平面表的情况下工作,您需要确保将以下内容添加到您的代码中:
在你模块的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 */
只有在那之后你的属性才会出现在观察者身上。不用说,使用覆盖,永远不要更改核心代码。
【讨论】:
除非您进行一些更改,否则您将无法在 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');
【讨论】:
只是为了完成 Gabriel Queiroz Silva 的回答:
您可以使用观察者,而不是编辑或覆盖 Mage_Catalog_Model_Resource_Category_Flat::_loadNodes 方法:
Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select));
【讨论】: