0

いくつかのビュー テンプレート (ページ コンテンツをレンダリングするビュー テンプレートとサイドバーをレンダリングするビュー テンプレート) の Web ページを構成する必要があります。私の layout.phtml には、$content と $sidebar という 2 つの変数プレースホルダーがあります。

......
<?php echo $this->sidebar; ?>
......
<?php echo $this->content; ?>
......

コントローラーのアクションでは、ツリーにチェーンされた ViewModel を介してこれらのビュー テンプレートにデータを渡します。

public function indexAction() {

 // Preparing my data
 // $form = ...
 // $menuItems = 
 // $activeItem =       

 // Create sidebar view model
 $sidebarViewModel = new ViewModel(array('menuItems'=>$menuItems, 'activeItem'=>$activeItem));
 // Add it as a child to layout view model
 $this->layout()->addChild($sidebarViewModel, 'sidebar');

 // Page content view model
 $viewModel = new ViewModel(array('form'=>$form));
 return $viewModel;     
}

ただし、すべてのページにサイドバーがあるため、すべてのコントローラーのすべてのアクションに対してこのコードをコピーして貼り付ける必要があります。サイドバーの ViewModel を設定するコードを再利用する推奨される方法はありますか?

4

1 に答える 1

2

1 つのアプローチは、コントローラー プラグインを使用してこれを実現することです。

適切な構成で接続していて、アプリケーションモジュールにいると仮定します。

module/Application/src/Application/Controller/Plugin/AddSidebar.php

namespace Application\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class addSidebar extends AbstractPlugin {

    public function __invoke($menu, $active) {

        // create new view model
        $sidebarVM = new ViewModel(array(
            'menuItems'  => $menu,
            'activeItem' => $active
        ));

        // add it to the layout
        $this->getController()->layout()->addChild($sidebarVM, 'sidebar');

    }

}

次に、各コントローラーで次のようにします。

$this->addSidebar($menuItems, $activeItem);

別の (おそらくより良い) オプションは、レンダーにフックして、MvcEventそこにサイドバーを追加することです。$menuItemsただし、$activeItemそのコンテキストで生成する方法を考え出す必要があります。

于 2013-09-20T16:34:22.137 に答える