0

ZF2には、より多くのコントローラーを備えたモジュールがあります。これは、たとえばメニューを共有します(コントローラー間を移動するため)。このメニューをコントローラー間で共有するには、これをすべてのコントローラー ビューに配置する必要があります。

<div class="span2">
<?php echo $this->partial('leftmenu'); ?>
</div>

<div class="span10">
THIS IS THE CONTROLLER VIEW
</div>

だから私は<?php echo $this->partial('leftmenu'); ?>どこでもコードを繰り返しています。これを一度だけ実行して、コントローラーのすべてのビューに表示する方法はありますか?

4

2 に答える 2

1

1 つの方法は、ViewModel をレイアウトに挿入し、そこにレンダリングすることです。

Module.php

/**
 * On bootstrap event
 * 
 * @param \Zend\Mvc\MvcEvent $e
 */
public function onBootstrap(MvcEvent $e)
{
    // .. 

    $viewModel = $e->getViewModel();
    $menu = new ViewModel();
    $menu ->setTemplate('module/menu/something');
    $viewModel->addChild($menu, 'menu');
}

レイアウト内のメニューをレンダリングするだけで済みます..

レイアウト.phtml

<?php if(isset($menu)) echo $menu ?>

別の効果が必要な場合は、別のイベントにアタッチすることもできます。たとえば、特定のモジュールにいる場合にのみモジュールを挿入したり、抽象コントローラーを拡張するコントローラーに挿入したりすることができます。

// Bootstrap ///

$e->getApplication()->getEventManager()->getSharedManager()
        ->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
    $controller = $e->getTarget();
    $controllerClass = get_class($controller);
    $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

    // logic to decide what you want

    $viewModel = $e->getViewModel();
    $menu = new ViewModel();
    $menu ->setTemplate('module/menu/something');
    $viewModel->addChild($menu, 'menu');
}, 100);
于 2013-04-18T15:22:00.220 に答える