如何让我的ZF2模块加载特定控制器的其他布局文件?
请注意,您的ZF2应用模块中有IndexController
和AdminController
,IndexController
正在使用 layout.phtml ,但您想使用 adminlayout AdminController
的.phtml 。
怎么可能?
答案 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);
}
我相信这种解决方案会更好,因为仅在调用管理控制器时才调用代码。