2

我的 zendframework 2 应用程序中有一个模块,其中包含两个控制器。我想为控制器的其中一个操作设置不同的布局。有没有办法在模块配置文件中设置它?

Ps:我只是尝试使用以下命令将它设置在控制器的 __CONSTRUCT 方法中,但它没有工作!

$event = $this->getEvent();
$event->getViewModel()->setTemplate('layout/MYLAYOUT');

但是,如果我在控制器的每个操作中使用上述命令,它就可以正常工作。

4

3 回答 3

3

请参阅akrabat 的示例,了解一些可以轻松调整布局、视图等的好方法。

具体来说,您可以在他的 github上找到您要查找的内容。

这是设置/使用备用布局的控制器操作方法的剪切粘贴:

public function differentLayoutAction()
{
    // Use a different layout
    $this->layout('layout/different');

    return new ViewModel();
}

编辑:看起来 akrabat 有一个示例Change the layout for every action within a module,它可能会为在配置中设置布局提供最佳指示;但我只是看了一下代码,这个例子目前还没有完成,它没有改变布局。

于 2012-10-04T20:36:33.520 回答
2

我可以为您指明正确的方向,因为目前我无法打开示例项目。Evan Coury 发布了一种针对模块特定布局的方法。请参阅以下链接:

Zend Framework 2 中的模块特定布局

<?php
namespace MyModule;

use Zend\ModuleManager\ModuleManager;

class Module
{
    public function init(ModuleManager $moduleManager)
    {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
            // This event will only be fired when an ActionController under the MyModule namespace is dispatched.
            $controller = $e->getTarget();
            $controller->layout('layout/alternativelayout');
        }, 100);
    }
}

现在这对你有什么帮助?:嗯,$controller应该同时存储被调用的控制器和动作。我确定您可以检查被$controller调用的操作,然后相应地分配布局。

很抱歉,我目前只能向您提示方向,但我相信这可以让您开始。

于 2012-10-04T19:10:19.397 回答
0

@Sam 的回答几乎可以回答这个问题。如前所述,它只需要检查调用了哪个控制器,可以这样完成:

<?php
namespace MyModule;

use Zend\ModuleManager\ModuleManager;

class Module
{
    public function init(ModuleManager $moduleManager){
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
                $controller = $e->getTarget();
                if ($controller instanceof Controller\AltLayoutController) {
                    $controller->layout('layout/alternativelayout');
                }
            }, 100);
    }

于 2014-01-31T16:12:01.590 回答