不同控制器的不同布局文件

时间:2012-08-12 10:01:18

标签: php zend-framework zend-framework2 zend-framework-modules

如何让我的ZF2模块加载特定控制器的其他布局文件?

请注意,您的ZF2应用模块中有IndexControllerAdminControllerIndexController正在使用 layout.phtml ,但您想使用 adminlayout AdminController的.phtml

怎么可能?

3 个答案:

答案 0 :(得分:7)

class Module {
    public function onBootstrap($e) {
        $em  = $application->getEventManager();

        $em->attach(MvcEvent::EVENT_DISPATCH, function($e) {
            $controller = $e->getTarget();
            if ($controller instanceof Controller\AdminController) {   
                $controller->layout('layout/layoutadmin.phtml');
            } else {
                $controller->layout('layout/layout.phtml');
            }   
        });
    }
}

并且不要忘记通过在模块配置文件中添加此配置来注册新控制器:

'controllers' => array(
    'invokables' => array(
        'Application\Controller\Index' => 'Application\Controller\IndexController',
        'Application\Controller\Admin' => 'Application\Controller\AdminController',
    ),
),

答案 1 :(得分:1)

其他最佳解决方案:

'view_manager' => array(
        'template_path_stack' => array(
            'YOURMODULENAME' => __DIR__ . '/../view',
        ),

        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        ),
    ),

YOURMODULENAME 更改为您的模块特定名称

答案 2 :(得分:0)

您可以使用控制器的onBootstrap方法来简单地为整个控制器设置布局,而不是通过onDispatch方法向整个模块添加逻辑。

在您的管理控制器中,在顶部添加一个快捷方式:

use Zend\Mvc\MvcEvent;

然后,在控制器中使用以下onDispatch

public function onDispatch(MvcEvent $mvcEvent)
{   
    $this->layout()->setTemplate('layout/admin');

    return parent::onDispatch($mvcEvent);
}

我相信这种解决方案会更好,因为仅在调用管理控制器时才调用代码。