我只是没有得到这个;我使用的是标准的基于 XML 的 Zend_Navigation impl,可以这么说 - 每个页面似乎都有每个菜单选项。我已经尝试了所有内容 - activeOnly,renderSubMenu,renderParent,但它们都返回我的所有内容或什么都不返回。我假设我误解了,因为我想要的("主页"节点中的项目在"主页"页面上可见等)似乎是我认为的默认行为。如果我必须开始将内容设置为"活动",为什么您需要在 XML 中指定 URL 或容器设置 - Zend 肯定"知道"什么是活动的......
例如,使用此页面 http://my.opera.com/spadille/blog/zend-navigation-with-xml(这是非常标准的),我希望所有顶级节点都可见(主页/关于/产品/控制),但只有"活动"页面的子节点可见。这不是默认行为吗?
我需要部分才能实现此目的吗?
非常感谢,
话筒
编辑
这是 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()
然后这个;以下行隐藏了结果导航的子项,但是当您单击它时,您只会获得项和子项,而不是顶层(因为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>
我怀疑Zend_Navigation的"默认行为"是需要在每个页面上呈现整个菜单树的用例。在此用例中,菜单的子项将使用 CSS/JS 显示为下拉列表。在这种情况下,您描述的"奇怪"行为实际上是有意义的。
您的用例不同,因为您使用的是主菜单和子菜单。这类似于顶栏 + 侧边栏实现。在这种情况下,显然不希望在每个页面上呈现整个菜单树。
为了进一步混淆这个问题,renderSubmenu() 似乎有一些意外的行为,因为当活动分支没有子分支时,它将呈现菜单的根级别。有些人将此行为报告为错误。在这里,您会发现一条评论,建议类似于您的"黑客"
因此,总而言之,您的"黑客"似乎是为您的特定用例正确呈现单个容器的有效方法。如果你真的想要更优雅的东西,你也许可以考虑:
- 使用findBy*方法之一将子菜单"提取"为新容器,如示例40所示
- 将主菜单和子菜单拆分为单独的容器,并在某处的一段代码中管理关系
- 扩展Zend_Navigation_Container以强制执行所需的行为
- 使用部分