Zend Framework 2导航子子菜单

Ban*_*00n 6 navigation zend-framework2

假设我有以下导航:

Home
Internal
    Folders
        New Folder
    Configuration
        Categories
            New
        Tags
            New
        Options
            New
    Contact
External
Run Code Online (Sandbox Code Playgroud)

我在layout.phtml中使用的代码显示了这个菜单:

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

所以它显示如下:

Folders
    New Folder
Configuration
    Categories
    Tags
    Options
Contact
Run Code Online (Sandbox Code Playgroud)

目前我正在获得一个体面的菜单,显示所有父母和第一个孩子,所以"新"导航永远不会显示.

但是,如果我在页面'类别'上我也想展示他们的孩子,那么'类别'下的'新'应该显示,如下所示:

Folders
    New Folder
Configuration
    Categories
        New
    Tags
    Options
Contact
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法来尝试这个,并检查了所有选项(setMinDepth,setMaxDepth,renderSubMenu,setParentMenu),你可以给layout.phtml中的菜单,没有成功.它包括"新",或者不包括在内,而不是介于两者之间.

关于ZF2的文档并没有给我任何关于如何使这个子菜单工作,除了部分.

那么,部分是唯一的选择吗?

提前致谢!

Jur*_*man 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此视图助手将“内部”呈现为调用中的顶部菜单项sprintf(),但您可以轻松更改此行为。你可以直接回显$html,然后这就是你真正需要的。