我创建了一个自定义类别属性。现在我需要在 Topmenu.php 的 _getHtml() 函数中访问它的值。
谁能告诉我该怎么做?:)
任何帮助表示赞赏:)
我创建了一个自定义类别属性。现在我需要在 Topmenu.php 的 _getHtml() 函数中访问它的值。
谁能告诉我该怎么做?:)
任何帮助表示赞赏:)
安德鲁的回答是我通常这样做的方式。但是,重要的是要注意,如果您要添加自定义属性,并且如果您希望商店在启用和不启用类别平面表的情况下工作,则需要确保将以下内容添加到代码中:
在您的模块上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 内部,您将看到 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');
只是为了完成 Gabriel Queiroz Silva 的回答:
您可以使用观察者,而不是编辑或覆盖 Mage_Catalog_Model_Resource_Category_Flat::_loadNodes 方法:
Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select));