我想将类别说明添加到Magento的topmenu导航中。
我尝试过使用CMS阻止的黑客攻击但它没有正常工作(它显示了类别,但在topmenu之外) 你有什么关于如何轻松做到这一点的线索吗?
感谢您的帮助。
答案 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()
,其中$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"
然后我会从复制到主题路径renderer.phml
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()调用它,但它没有用。