默认情况下,函数Mage_Catalog_Block_Navigation-> renderCategoriesMenuHtml渲染它。 现在我想改变目录导航渲染的方式。
那我应该做什么?
1)写自己的模块? - 然后我必须从类别模块中复制相同的文件。2)在模板中创建自己的逻辑? - 这是不正确的。模板内部没有逻辑。
3)那是哪些?
答案 0 :(得分:5)
您可以创建一个自己的模块并重写Block类,如下所述: http://www.exploremagento.com/magento/override-a-magento-core-block-class.php
模块的etc/config.xml
将包含以下内容:
<?xml version="1.0"?>
<config>
<global>
<blocks>
<catalog>
<rewrite>
<navigation>YourModule_Block_Catalog_Navigation</navigation>
</rewrite>
</catalog>
</blocks>
</global>
</config>
在YourModule/Block/Catalog/Navigation.php
:
class YourModule_Block_Catalog_Navigation extends Mage_Catalog_Block_Navigation
{
public function renderCategoriesMenuHtml() {
// your logic
// you might call
$parentResult = parent::renderCategoriesMenuHtml();
}
}
答案 1 :(得分:4)
有一种更简单的方法,没有任何自定义模块和Block类重写。
在模板布局的local.xml中添加:
<reference name="catalog.topnav">
<block type="page/html_topmenu_renderer"
name="catalog.topnav.renderer"
template="page/html/topmenu/renderer.phtml"/>
</reference>
然后,在限定位置创建renderer.phtml文件,其中包含:
<?php
$html = '';
$children = $menuTree->getChildren();
$parentLevel = $menuTree->getLevel();
$childLevel = is_null($parentLevel) ? 0 : $parentLevel + 1;
$counter = 1;
$childrenCount = $children->count();
$parentPositionClass = $menuTree->getPositionClass();
$itemPositionClassPrefix = $parentPositionClass ? $parentPositionClass . '-' : 'nav-';
foreach ($children as $child) {
$child->setLevel($childLevel);
$child->setIsFirst($counter == 1);
$child->setIsLast($counter == $childrenCount);
$child->setPositionClass($itemPositionClassPrefix . $counter);
$outermostClassCode = 'level'. $childLevel . ' ' . $child->getId();
$_hasChildren = ($child->hasChildren()) ? 'has-children' : '';
$html .= '<li '. $this->_getRenderedMenuItemAttributes($child) .'>';
$html .= '<a href="'. $child->getUrl() .'" class="'. $outermostClassCode .' '. $_hasChildren .'">'. $this->escapeHtml($this->__($child->getName())) .'</a>';
if (!empty($childrenWrapClass)) {
$html .= '<div class="'. $childrenWrapClass .'">';
}
$nextChildLevel = $childLevel + 1;
if (!empty($_hasChildren)) {
$html .= '<ul class="level'. $childLevel .'">';
$html .= '<li class="level'. $nextChildLevel .'">';
$html .= '<a class="level'. $nextChildLevel .'" href="'. $child->getUrl() .'">';
$html .= $this->__('View All ') . $this->escapeHtml($this->__($child->getName()));
$html .= '</a>';
$html .= '</li>';
$html .= $this->render($child, $childrenWrapClass);
$html .= '</ul>';
}
if (!empty($childrenWrapClass)) {
$html .= '</div>';
}
$html .= '</li>';
$counter++;
}
return $html;
然后根据需要自定义文件。