2013-02-12 120 views
6

说我有以下导航:Zend框架2导航子子菜单

Home 
Internal 
    Folders 
     New Folder 
    Configuration 
     Categories 
      New 
     Tags 
      New 
     Options 
      New 
    Contact 
External 

我在layout.phtml使用的代码显示菜单:

$internal = $this->navigation('navigation')->findOneByLabel('Internal'); 
echo $this->navigation('navigation') 
      ->menu() 
      ->setUlClass('nav nav-list') 
      ->setMaxDepth(1) 
      ->renderMenu($internal); 

因此它显示像这样:

Folders 
    New Folder 
Configuration 
    Categories 
    Tags 
    Options 
Contact 

在我得到一个体面的菜单,显示所有的家长和孩子的第一个瞬间,让“新” naviga重刑永远不会显示。

但是,如果我在页面上“类别”我想展示自己孩子的太多,所以“新建”下的“类别”应显示,如下所示:

Folders 
    New Folder 
Configuration 
    Categories 
     New 
    Tags 
    Options 
Contact 

我尝试了很多方法来尝试这一点,并且已经检查了所有可以在layout.phtml中给菜单的选项(setMinDepth,setMaxDepth,renderSubMenu,setParentMenu),而没有成功。它可以是包含或不包含的“新”,也不是介于两者之间的东西。

关于ZF2的文档没有给我任何关于如何让这个子菜单工作,除了做一个部分。

那么,是否只是部分唯一的选择呢?

在此先感谢!

回答

1

前段时间对于一个小项目,我做了一些很快的修复。我们一直在计划清理代码并使其可配置,但我们从未到达另一个需要相同代码的项目。

TL; DR:你不能使用正常的zf2视图助手,但你必须查找你想要显示的“顶层”页面(在你的情况下是内部的)并显示该页面下面的菜单。

<?php 

namespace Application\View\Helper; 

use Zend\View\Helper\AbstractHelper; 

class SubNavigation extends AbstractHelper 
{ 
    public function __invoke($class = null) 
    { 
     $view = $this->getView(); 
     $menu = $view->navigation()->menu(); 

     $container = $view->navigation()->getContainer(); 
     $active = $view->navigation()->setRenderInvisible(true)->findActive($container); 

     if (!$active) { 
      return; 
     } 

     $container = $active['page']; 
     $depth  = $active['depth']; 

     while (0 !== $depth) { 
      $container = $container->getParent(); 
      $depth--; 
     } 

     $visible = $container->isVisible(); 
     $html = $menu->setContainer($container->setVisible(true)) 
         ->setUlClass('') 
         ->setOnlyActiveBranch(false) 
         ->setMinDepth(null) 
         ->setMaxDepth(null) 
         ->render(); 

     $container->setVisible($visible); 

     if (strlen($html)) { 
      return sprintf('<ul %s><li%s><a href="%s">%s</a>%s</li></ul>', 
        (null !== $class) ? ' class="' . $class . '"' : null, 
        ($container->isActive())? ' class="active"' : null, 
        $container->getHref(), 
        $container->getLabel(), 
        $html); 
     } 
    } 
} 

这个视图助手致使“内部”作为sprintf()呼叫的顶部菜单项,但你可以很容易地改变这种行为。你可以回显$html,然后它就是你实际需要的。

+0

谢谢,这有帮助! :) – Bananam00n 2013-04-22 11:02:27

+0

仅供参考,我前几天在Soflomo \ Common图书馆收录了这个帮手。确保你至少依靠0.3.1:https://github.com/Soflomo/Common – 2013-04-23 14:22:27