对于不同的控制器不同的布局文件(Different layout file for differen

2019-06-27 00:10发布

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

考虑你IndexControllerAdminController您ZF2应用程序模块和IndexController使用layout.phtml但要使用adminlayout.phtmlAdminController

这怎么可能?

Answer 1:

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',
    ),
),


Answer 2:

其他最佳解决方案:

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

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

改变YOURMODULENAME你的模块具体名称



Answer 3:

而不是增加的逻辑在你的整个模块onBootstrap方法,您可以使用控制器的onDispatch方法,您只需设置为整个控制器的布局。

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

use Zend\Mvc\MvcEvent;

然后,使用下面的onDispatch在你的控制器:

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

    return parent::onDispatch($mvcEvent);
}

我相信这个解决方案是更好,因为当管理控制器被称作代码只被调用。



文章来源: Different layout file for different controller