【问题标题】:Magento: How To add category Description in topmenu?Magento:如何在顶部菜单中添加类别描述?
【发布时间】:2015-06-09 20:08:14
【问题描述】:

我想将类别描述添加到 Magento 的顶部菜单导航中。

我已经尝试使用 CMS 块进行破解,但它不能正常工作(它显示类别但在顶部菜单之外) 您对如何轻松做到这一点有任何线索吗?

感谢您的帮助。

【问题讨论】:

  • 请显示代码...?

标签: magento navigation categories


【解决方案1】:

快速总结:(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"

然后我将从复制到您的主题路径 page/html/topmenu/renderer.phtml 的 RWD renderer.phml 文件的副本开始

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-&gt;_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;
        }
    }

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

【讨论】:

    【解决方案2】:

    感谢您的回答。
    现在可以显示模板中的顶部菜单了。
    我不太明白的是如何获得描述值。
    是否 $children = $menuTree->getChildren(); 对象包含描述?
    我尝试使用 $child->getDescription() 调用它,但没有成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多