扩展Magento顶部链接以包含嵌套/下拉子菜单

时间:2013-05-17 12:57:08

标签: magento magento-1.7

我们使用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() : ''; ?>

2 个答案:

答案 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') ?>