【问题标题】:ZF2 Share partial view (menu) betwen controllers of same moduleZF2 在同一模块的控制器之间共享部分视图(菜单)
【发布时间】:2013-07-01 08:45:01
【问题描述】:

在 ZF2 中,我有一个带有更多控制器的模块,可以共享菜单(用于在控制器之间导航)。 要在控制器之间共享此菜单,我必须将其放在每个控制器视图中:

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

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

所以我到处重复&lt;?php echo $this-&gt;partial('leftmenu'); ?&gt; 代码。有没有办法只做一次并让它出现在控制器的所有视图中?

【问题讨论】:

  • 如果无论控制器动作如何都要显示,请将其放在布局中?
  • 我无法放入布局,因为布局在所有模块之间共享,并且模块具有不同的控制器。我应该为这个模块单独定义一个布局吗?
  • 如果只有一个模块通用,是的,一个模块特定的布局将是要走的路
  • 是的,只有一个模块通用。我可以做一个模块特定的布局,但我需要分享(为了不重复代码)主要布局的片段......我会调查更多
  • 我要么选择这个模块的替代布局,要么选择 ViewHelper,它只在给定的 ModuleName 与路由匹配时才显示菜单。

标签: view controller zend-framework2


【解决方案1】:

一种方法是将 ViewModel 注入到您的布局中并在其中呈现。

模块.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');
}

然后你只需要在布局内渲染菜单..

layout.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);

【讨论】:

    【解决方案2】:

    如果您必须根据某些条件更改部分。

    • 布局中的侧边导航
    • 视图中的侧导​​航 ...

    您可以在模块中设置全局,如果需要从控制器中更改它。

    模块

    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    
        $eventManager->attach('dispatch', array($this, 'loadViewVars'), 100);
        // 100-gives access for controller to overwrite this var
        // 1-prevents overwriting
    }
    
    public function loadViewVars(MvcEvent $e)
    {
        $e->getViewModel()->setVariables(
            array('sideNavigation'=>'partial/sidenavigation_1.phtml',)
        );
    }
    

    控制器

    //you can change in some controller by
    $this->layout()->sideNavigation='partial/sidenavigation_2.phtml';
    

    查看

    <?php echo $this->partial($this->layout()->sideNavigation); ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2019-06-05
      • 1970-01-01
      • 2017-11-24
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多