2013-02-12 10 views
6

は、私は、以下のナビゲーションを持っていると言う:Zend Frameworkの2ナビゲーションサブサブメニュー

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 

現時点では私は、まともなメニューを取得し、すべての親と最初のチャイルズを示すため、「新規」navigaよそれは決して表示されません。

しかし、私はページ上だ場合、「カテゴリーは」私はあまりにも彼らのチャイルズを表示したいので、「カテゴリー」の下の「新規」は、以下のように、表示する必要があります。

Folders 
    New Folder 
Configuration 
    Categories 
     New 
    Tags 
    Options 
Contact 

Iこれを試すには多くの方法を試してきましたが、layout.phtmlのメニューにsuccesを付けずに与えることができるすべてのオプション(setMinDepth、setMaxDepth、renderSubMenu、setParentMenu)をチェックしました。間に何かではなく、含まれているか含まれていないかのどちらかです。

ZF2についてのドキュメントは、このサブメニューをどのように機能させるかについて、私に何かを与えているわけではありません。

だから、これには部分的なオプションしかないのですか?

ありがとうございます!

答えて

1

少し前の小規模なプロジェクトでは、私は本当にすばらしい修正をしました。私たちはコードをクリーンアップして設定可能にする予定でしたが、私たちが同じように必要とした別のプロジェクトには決して行きません。

TL:通常の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 –

関連する問題