Magento:如何编写自己的目录导航渲染功能?

时间:2011-12-08 18:13:44

标签: magento-1.5 magento

默认情况下,函数Mage_Catalog_Block_Navigation-> renderCategoriesMenuHtml渲染它。 现在我想改变目录导航渲染的方式。

那我应该做什么?

1)写自己的模块? - 然后我必须从类别模块中复制相同的文件。

2)在模板中创建自己的逻辑? - 这是不正确的。模板内部没有逻辑。

3)那是哪些?

2 个答案:

答案 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;

然后根据需要自定义文件。