Zend Framework2 - Layout配置,不同模块Module设置不同的layout

来源:互联网 发布:自动记录运动轨迹软件 编辑:程序博客网 时间:2024/05/17 20:30
想必大部分的人都是从ZendSkeletonApplication开始学习zf2的,也理所当然的认为每个module的view_manager是独立的,互补干扰的,
但是我们错了,不同module之间共用同一个view_manager配置,后来加载module的view_manager会覆盖前面加载的module的view_manager同名(即key值相同)配置,
这种设计大部分时候都没什么问题,但是layout这种配置就开始互相覆盖了,
开始介绍为不同模块配置不同的layout。


1.新建一个Test模块(将Application模块复制一份,改改相关的名字即可),
在zf2.local/module/Test/config/module.config.php的view_manager的template_map配置你module的layout路径,
代码如下:

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

2.修改zf2.local/module/Test/Module.php的class Module如下

class Module{    
    public function onBootstrap(MvcEvent $mvcEvent)    {        
        $eventManager = $mvcEvent->getApplication()->getEventManager();        
        $moduleRouteListener = new ModuleRouteListener();        
        $moduleRouteListener->attach($eventManager);        // Register a dispatch event        
        $application = $mvcEvent->getParam('application');        
        $application->getEventManager()->attach('dispatch', array($this, 'setLayout'));    
    }


    /**
     * @param/Zend/Mvc/MvcEvent $mvcEvent The MvcEvent instance    
     * @return void    
     */    
    public function setLayout($mvcEvent)    {        
        $matches = $mvcEvent->getRouteMatch();        
        $controller = $matches->getParam('controller');        
        if (false === strpos($controller, __NAMESPACE__)) {
            // not a controller from this module
            return false;        
        }        
        // Set the layout template        
        $viewModel = $mvcEvent->getViewModel();        
        $viewModel->setTemplate('test/layout');    
    }    
    
    public function getConfig() {        
        return include __DIR__ . '/config/module.config.php';    
    }    
    
    public function getAutoloaderConfig()    {        
        return array(
            'Zend/Loader/StandardAutoloader' => array(                
                'namespaces' => array(                    
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,                
                ),            
            ),        
        );    
    }
}

然后就可以达到不同module使用不同layout。


0 0