我们使用Sonassi here概述的方法扩展了Magento类Mage_Page_Block_Template_Links
。
编辑_construct
功能以包含我们的自定义模板: -
protected function _construct()
{
$this->setTemplate('page/template/links_nested.phtml');
}
编辑函数addLink
以包含$childMenu
变量并允许它在XML布局中使用: -
public function addLink($label, $url = '', $title = '', $prepare = false, $urlParams = array(), $position = null, $liParams = null, $aParams = null, $beforeText = '', $afterText = '', $childMenu = false)
{
if (is_null($label) || false === $label) {
return $this;
}
$link = new Varien_Object(array(
'label' => $label,
'url' => ($prepare ? $this->getUrl($url, (is_array($urlParams) ? $urlParams : array())) : $url),
'title' => $title,
'li_params' => $this->_prepareParams($liParams),
'a_params' => $this->_prepareParams($aParams),
'before_text' => $beforeText,
'after_text' => $afterText,
'child_menu' => ($childMenu ? $this->getLayout()->getBlock($childMenu) : '')
));
$this->_links[$this->_getNewPosition($position)] = $link;
if (intval($position) > 0) {
ksort($this->_links);
}
return $this;
}
然后我们希望在top.xml中的item中包含<childMenu>
参数: -
<reference name="top.links">
<action method="addLink" translate="label title before_text">
<label>Account</label>
<url />
<title>Account</title>
<prepare />
<urlParams />
<position>10</position>
<liParams>id="account-dropdown"</liParams>
<aParams />
<before_text />
<after_text />
<childMenu>account-submenu</childMenu>
</action>
</reference>
然后将childMenu构造为account-submenu
: -
<reference name="top.links">
<block type="page/template_links" name="submenu" as="submenu">
<action method="setName">
<name>account-submenu</name>
</action>
<action method="addLink" translate="label title before_text">
<label>Contact Us</label>
<url />
<title>Contact Us</title>
<prepare />
<urlParams />
<position>110</position>
<liParams />
<before_text />
<after_text />
</action>
</block>
</reference>
然后我们对模板文件进行了一些修改,以便在声明时呈现childMenu
: -
<?php $_links = $this->getLinks(); ?>
<?php if(count($_links)>0): ?>
<ul class="links nav"<?php if($this->getName()): ?> id="<?php echo $this->getName() ?>"<?php endif;?>>
<?php foreach($_links as $count=>$_link): ?>
<?php if ($_link instanceof Mage_Core_Block_Abstract):?>
<?php echo $_link->toHtml() ?>
<?php else: ?>
<li<?php if($_link->getIsFirst()||$_link->getIsLast()||$count): ?> class="<?php if($_link->getIsFirst()): ?>first<?php endif; ?><?php if($_link->getIsLast()): ?> last<?php endif; ?> link-<?php echo $count ?>"<?php endif; ?> <?php echo $_link->getLiParams() ?>>
<?php echo $_link->getBeforeText() ?><a href="<?php echo $_link->getUrl() ?>" title="<?php echo $_link->getTitle() ?>" <?php echo $_link->getAParams() ?>><?php echo $_link->getLabel() ?></a><?php echo $_link->getAfterText() ?>
<?php var_dump($_link->getChildMenu()); ?>
<?php echo ($_link->getChildMenu()) ? $_link->getChildMenu()->toHtml() : ''; ?>
</li>
<?php endif;?>
<?php endforeach; ?>
</ul>
<?php endif; ?>
除了childMenu
在前端根本不呈现任何内容之外,所有内容都按预期工作,因此“我的帐户”顶部链接不包含子菜单。
模板文件中对childMenu
的调用是否有问题?
<?php echo ($_link->getChildMenu()) ? $_link->getChildMenu()->toHtml() : ''; ?>
答案 0 :(得分:1)
在布局XML中,您应该先将子菜单块(<block>
节点)定义,然后再将其添加到顶部链接(<action method="addLink">
中的<reference name="top.links">
)。当Magento处理节点时,他不知道该块是否存在
答案 1 :(得分:0)
对任何有此问题的人 - 我以为我会发布我的解决方案。
我认为将核心的Page / Block / Template / Links.php文件从app / code / core复制到app / code / local并对该文件进行调整是不明智的。 (如果在未来的Magento更新中更新此Links.php文件会发生什么情况,您需要确保您的覆盖符合核心的新更新文件)。
无论如何,这里的问题肯定是指令缺少一个步骤 - 一切都有意义,他们引用(无处)块&#34; mymainmenu.links&#34; - 这个区块并不存在于任何地方,因此它不会起作用。如果您继续将链接添加到&#34; top.links&#34; 块,Magento将继续使用默认块来显示您的链接。所以这里显而易见的答案是创建一个新的块。
在你的布局文件中添加以下块(我使用local.xml) app / design / frontend /( package )/( theme )/ layout.xml 强>
<?xml version="1.0"?>
<layout version="0.1.0">
<default>
<reference name="header"> <!-- You could also use root here to give it a larger scale access -->
<block type="templatelinks/page_template_links" name="mymainmenu.links" as="mymainmenuLinks">
<action method="setName">
<name>mymainmenu-links</name>
</action>
<action method="addLink" translate="label title">
....
</action>
</block>
</reference>
</default>
</layout>
将块类型设置为(自定义模块名称)/(块位置)实例化我们的自定义模块,并通过该模块处理我们的操作
您还必须记住在我们的模板中显示您新创建的(在此实例中为 mymainmenuLinks )块 - 在大多数情况下,它会成为您的 app / design / frontend /( package )/( theme )/ template / page / html / header.phtml file
找到
<?php echo $this->getChildHtml('topLinks') ?>
并替换为您的新块名称
<?php echo $this->getChildHtml('mymainmenuLinks') ?>