2

我只是不明白这个;我使用的是标准的基于 XML 的 Zend_Navigation impl,可以说是开箱即用 - 每个页面似乎都有每个菜单选项。我已经尝试了一切——activeOnly、renderSubMenu、renderParent,但它们都返回我的一切或什么都没有。我假设我误解了,因为我想要的(在“主页”页面上可见的“主页”节点中的项目等)似乎是我认为的默认行为。如果我必须开始将内容设置为“活动”,为什么需要在 XML 中指定 URL 或容器设置 - Zend 肯定“知道”什么是活动的......

例如,使用此页面http://my.opera.com/spadille/blog/zend-navigation-with-xml(这是非常标准的),我希望所有顶级节点都是可见的(Home/About /Product/CONtact),但仅限于“活动”页面的子级。这不是默认行为吗?

我需要一个部分来实现这一点吗?

非常感谢,

麦克风

编辑

这是 XML

     <?xml version="1.0" encoding="UTF-8"?>
     <configdata>
 <nav>
    <home>
        <label>Home</label>
        <controller>index</controller>
        <action>index</action>
        <module>default</module>
        <route>home</route>
    </home>
    <admin>         
        <label>Admin</label>
        <controller>admin</controller>
        <action>index</action>
        <module>default</module>
        <route>admin</route>
    </admin>
            <results>           
        <label>Results</label>
        <controller>result</controller>
        <action>index</action>
        <module>default</module>
        <route>results</route>
        <pages>
            <t>
            <label>Charts</label>
            <controller>result</controller>
            <action>graph</action>
            <module>default</module>
            <route>charts</route>
        </t>
        </pages>
    </results>
</nav>
    </configdata>

路线.ini

    routes.home.route = "/"
    routes.home.defaults.controller = index
    routes.home.defaults.action = index


    routes.admin.route = "/admin"
    routes.admin.defaults.controller = admin
    routes.admin.defaults.action = index

    routes.results.route = "/results"
    routes.results.defaults.controller = result
    routes.results.defaults.action = index

    routes.charts.route = "/results/charts"
    routes.charts.defaults.controller = result
    routes.charts.defaults.action = chart

还有我的引导程序

    protected function _initNavigation()
{
    $this->_bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml(
            APPLICATION_PATH . '/configs/navigation.xml','nav');


    $navigation = new Zend_Navigation($config);

    $view->navigation($navigation);
}

还有我的看法。我试过了...

    $this->navigation()->menu()

然后这个;以下行隐藏了 Results Nav 的子项,但是当您单击它时,您只会得到 Item 和子项,而不是顶层(因为 maxDepth)

    $this->navigation()->menu()->renderMenu(null,array("minDepth"=>0,"maxDepth"=>1,"onlyActiveBranch"=>true,"renderParents"=>true))

编辑。

这让我得到了我想要的东西,但感觉就像一个黑客?这合适吗?

     <div class="top_menu">
            <?php echo $this->navigation()->menu()->renderMenu(null,array("minDepth"=>0,"maxDepth"=>0,"onlyActiveBranch"=>1,"renderParents"=>true)) ?>
        </div>
        <div class="sub_menu">
            <?php echo $this->navigation()->menu()->renderMenu(null,array("minDepth"=>1,"maxDepth"=>4,"onlyActiveBranch"=>true,"renderParents"=>false)) ?>
        </div>
4

1 回答 1

2

好的,我怀疑 Zend_Navigation 的“默认行为”是需要在每个页面上呈现整个菜单树的用例。在这个用例中,菜单的子项将使用 CSS/JS 显示为下拉菜单。在这种情况下,您描述的“奇怪”行为实际上是有道理的。

您的用例不同,因为您使用的是主菜单和子菜单。这类似于 topbar + sidebar 的实现。在这种情况下,显然不希望在每个页面上都呈现整个菜单树。

为了进一步混淆这个问题,renderSubmenu() 似乎有一些意想不到的行为,即当活动分支没有子级时,它将呈现菜单的根级别。有些人将此行为报告为错误在这里,您会发现一条评论建议类似于您的“hack”

因此,总而言之,您的“hack”似乎是一种有效的方法,可以为您的特定用例正确渲染单个容器。如果你真的想要更优雅的东西,你也许可以考虑:

  1. 根据示例 40,使用其中一种 findBy* 方法将您的子菜单“提取”为新容器
  2. 将主菜单和子菜单拆分为单独的容器,并在某处的一段代码中管理关系
  3. 扩展 Zend_Navigation_Container 以强制执行所需的行为
  4. 使用部分
于 2012-07-04T18:37:14.897 回答