2013-02-12 2 views
6

Сказать, что у меня есть следующие навигации:Zend Framework 2 Navigation Sub-Sub меню

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 

I попробовали много способов попробовать это, и проверили все параметры (setMinDepth, setMaxDepth, renderSubMenu, setParentMenu), которые вы можете передать в меню в layout.phtml без каких-либо успехов. Это либо «Новый» включен, либо не включен, а не что-то среднее между ними.

Документация о 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

+0

FYI, я включил в библиотеку Soflomo \ Common этот помощник несколько дней назад. Убедитесь, что вы полагаетесь на минимум 0,3.1: https://github.com/Soflomo/Common –

 Смежные вопросы

  • Нет связанных вопросов^_^