2009-11-16 10 views
8

ナビゲーションヘルパーを使用してAclを使用してナビゲーションメニューを構築したいと考えています。私はうまく動作しているAclの部分。Zend Framework - 複数のナビゲーションブロック

ここでは、いくつかの異なるタイプのナビゲーションを表示できるようにしたいと考えています。例えば。 admin-nav、side-nav、new-navなどがあります。これについてはドキュメントでは何も見つかりません。ナビゲーションを設定し、そのナビゲーションオブジェクトをレイアウトまたはビュー内で繰り返し使用する方法のみ。

私はこれと似たようなことを試みました。異なる2つのコンテナを持ち、異なるページの配列を持ち、これらのコンテナをレジストリに設定しました。そして、私の見解および/またはレイアウトナビゲーションを呼び出し、それをコンテナ渡し内から:私のニュースビューで呼び出された上記

<?php echo $this->navigation(Zend_Registry::get("news-nav")) ?> 

を、次は

<?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?> 

これが正常に動作します私のレイアウトで呼ばれています私のすべてのページのために、ニュースページから離れて。私のニュースページでは、ニュース用のnavは、レイアウト内に1回、ニュースビュー内に1回、2回表示されます。管理ナビは表示されず、ニュースナビによって上書きされるようです。

私はこれを完全に間違った方法にすることができます。もしそうなら、もっと良い方法を教えてください。この方法がうまくいくようであれば、誰かがレイアウトとニュースビューにニュースナビが表示されている理由を整理できます。お時間を

おかげ

ジェイク

答えて

10

私はこれと同じ問題がありました。 Zend_Navigation_Containerの複数のインスタンスを作成して、必要なメニューごとにコントローラに作成し、ビューに渡してオブジェクトをメニューレンダリングメソッドに直接渡してレンダリングします。次のように:

$this->view->menu1 = new Zend_Navigation_Container(); 
$this->view->menu2 = new Zend_Navigation_Container(); 

ビューで:コントローラで

$this->navigation()->menu()->renderMenu($this->menu1); 
$this->navigation()->menu()->renderMenu($this->menu2); 

あなたも、カスタマイズすることができ1(メソッドを挿入することにより、各呼び出し初期メニュー()呼び出しの後:

$this->navigation()->menu()->setUlClass('my_first_menu')->renderMenu($this->menu1); 
$this->navigation()->menu()->setUlClass('my_second_menu')->renderMenu($this->menu2); 
1
$this->menu($this->menu1); 
1

複数のナビゲーションが必要なこの問題に遭遇しましたが、このプロセスで問題が見つかりました。実際はZend_View_Helper_Navigation_HelperAbstractのバグです。

ライン516:

public function __toString() 
{ 
    try { 
     return $this->render(); 
    } catch (Exception $e) { 
     $msg = get_class($e) . ': ' . $e->getMessage(); 
     trigger_error($msg, E_USER_ERROR); 
     return ''; 
    } 
} 

ここでの問題は、明示的に$this->navigation->render($container)または$this->navigation()->menu($container)のような魔法のメソッドを呼び出していない場合は、その後renderへの呼び出しは、渡されたコンテナを取得していない終わるということです。

これは、順番にmenuあるnavigationのデフォルトのビューヘルパーは、(それが最後に与えられたコンテナを使用します。その場合には)registryから引っ張られ、または全くがあることが原因となるスポット(上でインスタンス化されますコンテナ)。

これはgetContainer__toStringにコールする簡単な修正です。

ライン516:Navigationに関連するヘルパーファイルのすべてを探し

public function __toString() 
{ 
    try { 
     return $this->render($this->getContainer()); 
    } catch (Exception $e) { 
     $msg = get_class($e) . ': ' . $e->getMessage(); 
     trigger_error($msg, E_USER_ERROR); 
     return ''; 
    } 
} 

意図はgetContainerを呼び出すことだったことは明らかです。 menuビューヘルパを直接またはnavigationのマジックメソッドで呼び出すと、これは問題ではないことも明らかです。

上記の行を変更したら$this->navigation($container)に電話し、menuヘルパーを直接呼び出すことなく複数のナビゲーションをレンダリングできるはずです。