【发布时间】:2015-06-09 20:08:14
【问题描述】:
我想将类别描述添加到 Magento 的顶部菜单导航中。
我已经尝试使用 CMS 块进行破解,但它不能正常工作(它显示类别但在顶部菜单之外) 您对如何轻松做到这一点有任何线索吗?
感谢您的帮助。
【问题讨论】:
-
请显示代码...?
标签: magento navigation categories
我想将类别描述添加到 Magento 的顶部菜单导航中。
我已经尝试使用 CMS 块进行破解,但它不能正常工作(它显示类别但在顶部菜单之外) 您对如何轻松做到这一点有任何线索吗?
感谢您的帮助。
【问题讨论】:
标签: magento navigation categories
快速总结:(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(),其中 $this 是 Mage_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->_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 注入菜单。主要缺点是每次菜单布局更改时都需要重新编译。
【讨论】:
感谢您的回答。
现在可以显示模板中的顶部菜单了。
我不太明白的是如何获得描述值。
是否
$children = $menuTree->getChildren();
对象包含描述?
我尝试使用 $child->getDescription() 调用它,但没有成功。
【讨论】: