说我有以下导航:
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
目前我正在获得一个体面的菜单,显示所有父母和第一个孩子,因此“新”导航永远不会显示。
但是,如果我在页面'类别'上我也想展示他们的孩子,那么'类别'下的'新'应该显示,如下所示:
Folders
New Folder
Configuration
Categories
New
Tags
Options
Contact
我尝试了很多方法来尝试这个,并检查了所有可以给layout.phtml中的菜单提供的选项(setMinDepth,setMaxDepth,renderSubMenu,setParentMenu),但没有成功。它包括“新”,或者不包括在内,而不是介于两者之间。
关于ZF2的文档并没有给我任何关于如何使这个子菜单工作的信息,除了部分。
那么,部分是唯一的选择吗?
提前致谢!
答案 0 :(得分: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
,然后就是你真正需要的东西。