2012-04-08 9 views
4

私は2つの異なるナビゲーションメニューがあるテンプレートを使用しています。Zend Framework - ナビゲーションメニューを定義する正しい方法

  1. メインナビゲーションメニュー

  2. アクションナビゲーションメニューを(固定)、保存する、などのバックなどの要素が含まれ、削除などが このナビゲーション要素が呼び出され、コントローラに応じて変化します。それはいくつかのコントローラのために、いくつか、それはないない

のために存在するかもしれないが、私は、レイアウトを利用しています、と私は私のdefault.phtmlレイアウトファイル内のすべてのテンプレートコードを配置しています。私が直面する問題は、アクションナビゲーションメニューです。このメニューのHTMLコードはdefault.phtmlにあるので、呼び出されているコントローラーに応じて内容を変更する必要があります。

これが正しい方法であるかどうかはわかりません。私のdefault.phtmlでは、コントローラ名をチェックしているので、メニューが表示されています。これは私が使用しているコードです。

<?php if(Zend_Controller_Front::getInstance()->getRequest()->getControllerName() == 'item'): ?> 
    <!-- Action Navigation Menu --> 
    <div class="statsRow"> 
     <div class="wrapper"> 
      <a href="#"><img src="/images/icons/dark/add.png" alt="" class="icon"><span>New item</span></a> 
      <a href="#"><img src="/images/icons/dark/cd.png" alt="" class="icon"><span>Publish/Unpublish item</span></a> 
      <a href="#"><img src="/images/icons/dark/trash.png" alt="" class="icon"><span>Delete item</span></a> 
     </div> 
    </div> 
    <div class="line"></div> 
<?php endif; ?> 

このようにするのは大丈夫ですか?またはこれを行うためのより良い方法がありますか?

答えて

3

それは実際には各アクションは、サブページの一部であるサブメニューのような行為あなたのアクションのナビゲーションメニューと思われます。そのようなことをする良い方法は、例えばレジストリに格納できるZend_Navigationの2つのインスタンスを持つことです。あなたはこのようなpreDispatch()方法でアクションヘルパーを呼び出すことができますし、あなたのコントローラで、:もちろん

// in each controller where you want your "action navigation menu" 
public function preDispatch() 
{ 
    $this->_helper->navigation()->renderActionNavigation(); 
} 

、このアクションのナビゲーションメニューを必要とするだけのコントローラは、このメソッドを持っているでしょう。 このアクションヘルパーは、基本的には、現在のビューオブジェクトを取得プレースホルダを作成し、次のように部分的にレンダリングされます:単に/ビュー/ヘルパー/にこのコードを入れて、あなたはライブラリを使用しない場合は

// in your library/My/Controller/Action/Helper 
class My_Controller_Action_Helper_Navigation extends Zend_Controller_Action_Helper_Abstract 
{ 
    private $_view = null; 

    public function direct() 
    { 
     $this->_view = $view = Zend_Layout::getMvcInstance()->getView(); 
     $this->_view->placeholder('action-navigation'); 
     return $this; 
    } 

    public function renderActionNavigation() 
    { 
     $this->_view->render('partials/_action-navigation.phtml'); 
    } 
} 

を開き、クラス名をZend_View_Helper_Navigationに変更します。

その後、部分的には、プレースホルダを使用してサブメニューをレンダリングする担当になります。

// in /view/scripts/partials/_action-navigation.phtml 
<?php $this->placeholder('action-navigation')->captureStart() ?> 
<?php $options = array('onlyActiveBranch' => true); ?> 
<?= $this->navigation()->menu()->renderMenu(Zend_Registry::get('nav.action-navigation'), $options); 
// here I assume that you've stored your Navigation container in the registry ?> 
<?php $this->placeholder('action-navigation')->captureEnd() ?> 

また、trueにオプションonlyActiveBranchセットでnavigation view helper method renderMenu()を使ってメニューをレンダリングすることは、あなたのにのみアクティブにレンダリングできるようになりますブランチ、各ブランチはコントローラに対応します。

そして最後に、あなたのレイアウトでは、これを持っているでしょう:

// in your bootstrap.php 
protected function _initNavigation() 
{ 
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
    $container = new Zend_Navigation($config); 
    Zend_Registry::set('nav.action-navigation', $container); 
} 
:あなたがレジストリにZend_Navigationコンテナを登録することを選択した場合、これはブートストラップにこの方法を行うことができる

// in your layout file (usually named layout.phtml) 
<?= $this->placeholder('action-navigation'); ?> 

コンテナの詳細については、refer to this pageを参照してください。また、プレースホルダに慣れていない場合は、here is a good practical exampleの使用方法についても説明します。

+0

私はフレームワークを新しくしました。あなたの説明は私にとっては少しオーバーヘッドのようです。私はまだヘルパーやナビゲーションのコンセプトとそれがどのようにzendで扱われているのか把握しています。コードで何が起こっているのかを私に説明してください。そしてそれはどこに属しますか –

+0

私の答えを編集し、それぞれのスニペットにコメントを追加しました。 Zendドキュメンテーションから、[Action Helpers](http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown)は、開発者がランタイムおよび/ 'Zend_Controller_Action'を拡張する任意のアクションコントローラに要求機能を追加します。 **アクションヘルパー**は、共通のアクションコントローラ機能を注入するために抽象アクションコントローラを拡張する必要性を最小限に抑えることを目指しています。 – Liyali

+0

私はあなたの助けに感謝します。 Zend_Navigationを使わなくても同じことを達成できると思いますか? Zend_Navigationについて私を悩ましているのはカスタムデコレータですが、まだそれを手に入れることはできません。 Viewヘルパーを同じ目的で使用するのはどうですか? –

1

私はそれが大丈夫だと思います。私の代わりに、コントローラでそれを行うとZend_Navigationを使用してナビゲーションを含め、コントローラはちょうど設定した場合、あなたはACLなど

を利用することができますしたい:

$navigationはZend_Navigationのインスタンスである
$this->view->navigation()->setContainer($navigation); 

。次に、あなたのレイアウトで:

<?=$this->navigation()->menu()?> 
+0

私はzend_navigationを使って私のメニューと全く同じ構文を生成できますか?私に例を教えてください:) –

+0

http://stackoverflow.com/questions/1243697/getting-zend-navigation-menu-to-work-with-jquerys-fisheye/1255289#1255289 – Ashley

+0

の問題を参照してください。あなたのアプローチは、すべてのコントローラとアクションのアクションナビゲーションを定義する必要があります。私のアプリではアクションのナビゲーションがいくつか存在しますが、一部ではそうではありません。 –

関連する問題