Magento:如何在topmenu中添加类别描述?

时间:2015-06-09 20:08:14

标签: magento navigation categories

我想将类别说明添加到Magento的topmenu导航中。

我尝试过使用CMS阻止的黑客攻击但它没有正常工作(它显示了类别,但在topmenu之外) 你有什么关于如何轻松做到这一点的线索吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

快速摘要:(Magento 1.8.2.0及更高版本)(参见早期版本的最后一段)

在主题的local.xml中的top.menu块下添加子块,并创建(或从RWD主题复制)自定义renderer.phtml文件,以生成包含类别描述的自定义菜单HTML。

renderer.phtml的推荐路径为app/design/frontend/yourpackage/default/template/page/html/topmenu/renderer.phtml

<强>详情:

如果你有Magento 1.8.2.0或更高版本,你应该设法实现一个菜单renderer.phtml文件,因为这段代码:

file: app/Mage/Page/Block/Html/Topmenu.php
class: Mage_Page_Block_Html_Topmenu extends Mage_Core_Block_Template
function: getHtml()

    public function getHtml($outermostClass = '', $childrenWrapClass = '')
    {
    //...

        if ($renderer = $this->getChild('catalog.topnav.renderer')) {
            $renderer->setMenuTree($this->_menu)->setChildrenWrapClass($childrenWrapClass);
            $html = $renderer->toHtml();
        } else {
            $html = $this->_getHtml($this->_menu, $childrenWrapClass);
        }
    //...
    }

你可以在这里看到,如果有一个名为catalog.topnav.renderer的子块,那么Magento将使用它,否则它会优雅地使用$this->_getHtml(),其中$thisMage_Page_Block_Html_Topmenu

不幸的是,Magento默认主题不使用新的渲染器功能,因此基本主题中没有示例。然而,Magento标配的最优秀的RWD主题确实使用菜单渲染器,我强烈建议您研究RWD主题代码,以了解如何使用菜单渲染器的phtml文件。

具体来说,您应该在local.xml中创建一个额外的条目来定义菜单渲染器:

file: app/design/frontend/yourpackage/default/layout/local.xml

            <block type="page/html_header" name="header" as="header">
                <block type="core/text_list" name="top.menu" as="topMenu" translate="label">
                    <label>Navigation Bar</label>
                    <block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
                        <block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
                    </block>
                </block>
            </block>

或类似的东西,以适合您的主题布局。特别注意到最重要的硬编码子块名称name="catalog.topnav.renderer"

然后我会从复制到主题路径renderer.phml

的RWD page/html/topmenu/renderer.phtml文件的副本开始
file: app/design/frontend/rwd/default/template/page/html/topmenu/renderer.phtml

<?php
/** @var Mage_Page_Block_Html_Topmenu_Renderer $this */
/** @var Varien_Data_Tree_Node $menuTree */
/** @var string $childrenWrapClass */

$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;
    $_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 .' view-all">';
        $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); //THIS IS THE RECURSION
        $html .= '</ul>';
    }

    if (!empty($childrenWrapClass)) {
        $html .= '</div>';
    }

    $html .= '</li>';

    $counter++;
}

return $html;

通过研究该文件,您可以开始了解各种修改对菜单HTML的影响。

请注意Mage_Page_Block_Html_Topmenu_Renderer::render()用于处理rendrerer.phtml文件的代码:对于Magento来说,它是一个直接的include $this->_templateFile并返回字符串或ob_get_cleaned缓冲区:

file: /app/code/core/Mage/Page/Block/Html/Topmenu/Renderer.php
class: Mage_Page_Block_Html_Topmenu_Renderer
function: render()

    public function render(Varien_Data_Tree_Node $menuTree, $childrenWrapClass)
    {
        ob_start();
        $html = include $this->_templateFile;
        $directOutput = ob_get_clean();

        if (is_string($html)) {
            return $html;
        } else {
            return $directOutput;
        }
    }

如果您使用版本prioir到1.8.2.0,则需要重写类Mage_Page_Block_Html_Topmenu并覆盖其函数_getHtml()以将额外的HTML注入菜单。主要缺点是每次菜单布局更改时都需要重新编译。

答案 1 :(得分:0)

谢谢你的回答。
现在没关系,我从模板中显示topmenu 我真正不了解的是如何获得描述值。
是吗?     $ children = $ menuTree-&gt; getChildren(); 对象包含描述?
我试图用$ child-&gt; getDescription()调用它,但它没有用。