2012-07-03 87 views
2

我只是没有得到这个;我正在使用标准的基于XML的Zend_Navigation impl,就这么简单 - 每个页面似乎都有各种菜单选项。我尝试了一切 - activeOnly,renderSubMenu,renderParent,但他们都返回我的一切或没有。我假设我误解了,因为我想要的(“家”节点中的项目在“主页”页面上可见)等似乎是我会考虑默认行为。如果我要开始设置内容为“主动”,为什么你需要在你的XML指定URL或容器的设置 - 当然Zend的“知道”什么是积极的......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> 

routes.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> 
+0

好听的名字的关系!..... –

+0

你正在创建什么类型的页面? Zend_Navigation_Page_Uri或Zend_Navigation_Page_Mvc –

+0

感谢@Christian,我使用MVC,像这样... \t \t \t \t \t \t \t \t \t 管理 \t \t \t 指数 \t \t \t 默认 \t \t \t 管理 \t \t MikeB

回答

2

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

您的使用案例与您使用主菜单和子菜单不同。这与topbar +侧边栏实现类似。在这种情况下,整个菜单树显示在每个页面上显然是不可取的。

为了进一步迷惑似乎renderSubmenu()的,它将使菜单的根级别,当一个活跃的分支有没有孩子的一些异常行为问题。有些人已将此行为报告为bugHere你会发现一条评论提示类似于你的“黑客”

所以总之,你的“黑客”似乎是一个有效的方法来使一个容器正确呈现给你的特定用例。如果你真的想要的东西更优雅,你也许可以考虑:

  1. 使用findBy的一个*方法来“解压”的子菜单中的新容器按Example 40
  2. 分裂的主菜单,子菜单到单独的容器中,管理的一段代码某处
  3. 扩展Zend_Navigation_Container执行所需的行为
  4. 使用部分
+0

奇妙的基督徒,这是非常有用的,谢谢加载看看... – MikeB