我创建了一个自定义类别属性。 现在我需要从Topmenu.php中的_getHtml()函数中访问它的值。
谁能告诉我怎么做?:)
感谢任何帮助:)
答案 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));