【问题标题】:Zend Framework 2 Navigation Sub-Sub menuZend Framework 2 Navigation Sub-Sub 菜单
【发布时间】:2013-04-20 05:54:51
【问题描述】:

假设我有以下导航:

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

我已经尝试了很多方法来尝试这个,并检查了所有选项(setMinDepth、setMaxDepth、renderSubMenu、setParentMenu),你可以在 layout.phtml 中给菜单,但没有成功。要么包含“新”,要么不包含,而不是介于两者之间。

除了制作部分菜单外,关于 ZF2 的文档没有告诉我如何让这个子菜单工作。

那么,制作局部是唯一的选择吗?

提前致谢!

【问题讨论】:

    标签: navigation zend-framework2


    【解决方案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,这就是你真正需要的。

    【讨论】:

    • 仅供参考,几天前我在 Soflomo\Common 库中包含了这个助手。确保您至少依赖 0.3.1:github.com/Soflomo/Common
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多