2013-02-12 29 views
6

nói rằng tôi có điều hướng sau:Zend Framework 2 Navigation Sub-Sub Menu

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

Code tôi sử dụng trong layout.phtml tôi để hiển thị menu này:

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

nên nó cho thấy như thế này:

Folders 
    New Folder 
Configuration 
    Categories 
    Tags 
    Options 
Contact 

Hiện tại tôi đang nhận được thực đơn phong phú, hiển thị tất cả cha mẹ và đứa con đầu tiên, vì vậy, 'mới' naviga tion không bao giờ hiển thị.

Tuy nhiên, nếu tôi đang trên trang 'Categories' Tôi muốn thể hiện Childs của họ quá, vì vậy 'mới' trong 'Categories' nên được hiển thị, như sau:

Folders 
    New Folder 
Configuration 
    Categories 
     New 
    Tags 
    Options 
Contact 

tôi đã thử nhiều cách để thử điều này, và đã kiểm tra tất cả các tùy chọn (setMinDepth, setMaxDepth, renderSubMenu, setParentMenu) mà bạn có thể cung cấp cho trình đơn trong layout.phtml, mà không cần succes. Đó là hoặc 'Mới' bao gồm, hoặc không được bao gồm, không phải cái gì đó ở giữa.

Các tài liệu về ZF2 không đem lại cho tôi bất cứ điều gì về cách có được điều này làm việc menu phụ, ngoài việc thực hiện một phần.

Vì vậy, đang tạo một phần lựa chọn duy nhất cho điều này?

Cảm ơn trước!

Trả lời

1

Đối với một dự án nhỏ cách đây một thời gian, tôi đã thực hiện một cái gì đó như là một sửa chữa thực sự nhanh chóng. Chúng tôi đã có kế hoạch để làm sạch mã và làm cho nó cấu hình, nhưng chúng tôi không bao giờ nhận được đến một dự án khác, nơi chúng tôi yêu cầu như vậy.

TL; DR: Bạn không thể sử dụng trình trợ giúp xem zf2 bình thường nhưng bạn phải tra cứu trang cấp cao nhất bạn muốn hiển thị (Internals in your case) và hiển thị menu bên dưới trang đó.

<?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); 
     } 
    } 
} 

view helper này ám chỉ rằng "nội bộ" như một menu-item hàng đầu trong sprintf() cuộc gọi, nhưng bạn có thể dễ dàng thay đổi hành vi này. Bạn chỉ có thể phản hồi $html và sau đó là những gì bạn thực sự cần.

+0

Cảm ơn, điều đó đã giúp! :) – Bananam00n

+0

FYI, tôi có trong thư viện Soflomo \ Common mà người trợ giúp này vài ngày trước. Đảm bảo bạn dựa vào ít nhất 0.3.1: https://github.com/Soflomo/Common –

Các vấn đề liên quan