4

2 つの異なるナビゲーション メニューがあるテンプレートを使用しています。

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

こんなことしていいの?または、これを行うためのより良い方法がありますか?

4

2 に答える 2

3

あなたのAction ナビゲーション メニューは実際には、各 Action がサブページの一部である SubMenu のように機能しているようです。そのようなことを行う良い方法は、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');
    }
}

ライブラリを使用しない場合は、このコードを/views/helpers/に置き、クラスの名前を変更して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() ?>

さらに、オプションを に設定したナビゲーション ビュー ヘルパー メソッドrenderMenu()を使用してメニューをレンダリングすると、各ブランチがコントローラーに対応するアクティブなブランチのみをレンダリングできます。onlyActiveBranchtrue

そして最後に、レイアウトには次のようになります。

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

Zend_Navigation コンテナをレジストリに登録することを選択した場合、これはブートストラップで次のように行うことができます。

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

コンテナーの詳細については、このページを参照してください。また、プレースホルダーに慣れていない場合は、プレースホルダーの使用方法に関する実用的な例を次に示します。

于 2012-04-08T14:40:15.400 に答える
1

大丈夫だと思います。代わりにコントローラーでそれを行い、Zend_Navigationを使用してナビゲーションを含めると、ACL などを利用できます。

コントローラーが設定したばかりの場合:

$this->view->navigation()->setContainer($navigation);

$navigationZend_Navigation のインスタンスはどこにありますか。次に、レイアウトで:

<?=$this->navigation()->menu()?>
于 2012-04-08T14:08:22.760 に答える