2013-05-03 93 views
5

我使用EdpModuleLayouts来使用一个布局到我的zf2 webapp的移动版本和另一个到“桌面”版本。使用不同的布局到不同的模块zend框架2

在module.config.php配置在应用模块:

...'view_manager' => array(
    'display_not_found_reason' => true, 
    'display_exceptions'  => true, 
    'doctype'     => 'HTML5', 
    'not_found_template'  => 'error/404', 
    'exception_template'  => 'error/index', 
    'template_map' => array(
     'module_layouts' => array(
      'Application' => 'layout/application', 
      'User'  => 'layout/user', 
     ), 
     'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 
     'error/404'    => __DIR__ . '/../view/error/404.phtml', 
     'error/index'    => __DIR__ . '/../view/error/index.phtml', 
    ), 
    'template_path_stack' => array(
     __DIR__ . '/../view', 
    ), 
), 

Module.php的应用模块,它就像这样的:

public function onBootstrap(MvcEvent $e) 
{ 

    $e->getApplication()->getServiceManager()->get('translator'); 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 


    $e->getApplication()->getEventManager()->getSharedManager() 
    ->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { 
     $controller  = $e->getTarget(); 
     $controllerClass = get_class($controller); 
     $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); 
     $config   = $e->getApplication()->getServiceManager()->get('config'); 
     if (isset($config['module_layouts'][$moduleNamespace])) { 
      $controller->layout($config['module_layouts'][$moduleNamespace]); 
      echo $config['module_layouts'][$moduleNamespace]; 
     } 
    }, 100); 

} 

最后,我在应用模块一个布局另一个在用户模块中。此时每次在用户模型中渲染布局,即使我输入了应用程序url。

我对此感到困惑,我感谢一些帮助。

+3

你为什么复制代码?您是使用他的模块还是仅使用他的模块代码?此外,在你的配置中有一个错误,'module_layouts'应该是一个顶层条目。请检查一些关于此主题的其他主题,其中有10-20个;) – Sam 2013-05-03 08:29:57

回答

16

我也在为我的多布局项目使用EdpModuleLayouts。 我想,你需要移动module_layoutsmodule.config.phpautoload/global.php文件。

这是我Module.php应用模块:

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $eventManager->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { 
     $controller  = $e->getTarget(); 
     $controllerClass = get_class($controller); 
     $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); 
     $config   = $e->getApplication()->getServiceManager()->get('config'); 
     if (isset($config['module_layouts'][$moduleNamespace])) { 
      $controller->layout($config['module_layouts'][$moduleNamespace]); 
     } 
    }, 100); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
} 

这是我配置\自动加载\ global.php

return array(
    'db' => array(
     ......... 
    ), 
    'service_manager' => array(
     ........... 
    ), 
    'module_layouts' => array(
     'Application' => 'layout/layout.phtml', 
     'MyModuleName' => 'layout/mymodulename.phtml', 
    ), 
); 

它为我工作和希望它可以帮助你。

2

我的解决办法:

  1. 写控制器插件;
  2. 在插件:

    $modNameArray = explode('\\', $event->getRouteMatch()->getParam('controller')); 
    $modName = $modNameArray[0]; 
    $viewModel->setTemplate(strtolower($modName).'/layout'); 
    

获得模块名称,至少是你的控制器的第一个目录名,在我的应用程序。

  1. 调整你module.config.php

    'template_map' => array(
        //moduleName/layout => your layout path 
        'auth/layout' => __DIR__ . '/../view/layout/auth.phtml', 
        'auth/index/index' => __DIR__ . '/../view/auth/index/index.phtml', 
        'error/404' => __DIR__ . '/../view/error/404.phtml', 
        'error/index' => __DIR__ . '/../view/error/index.phtml', 
    ), 
    

为我工作。

+0

+1,用于为布局提供每个模块的唯一标识符。 – kta 2014-03-29 13:08:29

2

以下适用于我。

主要想法是为布局命名一个不同的标识符,而不是使用像'布局/布局'这样的常用名称。通过这种方式,当配置开始合并时,它不会迷路。

如果我有一个模块名称专辑,然后我会有以下。

public function onBootstrap($e) 
{ 
    $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', function($e) { 
    $controller = $e->getTarget(); 
    $controllerClass = get_class($controller); 
    $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); 
    $controller->layout($moduleNamespace . '/layout'); 
    }, 100); 
} 

请注意,这与EdpModuleLayouts相比有点不同。和module.config.php我有以下相关的配置。

'view_manager' => array(
    'display_not_found_reason' => true, 
    'display_exceptions'  => true, 
    'doctype'     => 'HTML5', 
    'not_found_template'  => 'error/404', 
    'exception_template'  => 'error/index', 
    'template_map' => array(
     'Album/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
     'Album/index/index' => __DIR__ . '/../view/application/index/index.phtml', 
     'error/404'    => __DIR__ . '/../view/error/404.phtml', 
     'error/index'    => __DIR__ . '/../view/error/index.phtml', 
    ), 
    'template_path_stack' => array(
     __DIR__ . '/../view', 
    ), 
), 

和应working.Hope这有助于:)

+1

我在使用多个模块时发现,命名空间中包含部分和错误的所有模板是一种很好的做法。 – 2014-04-23 00:08:43

19

更新您的module.config.php

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

现在module.php写入以下行

use Zend\ModuleManager\ModuleManager; 

public function init(ModuleManager $mm) 
    { 
     $mm->getEventManager()->getSharedManager()->attach(__NAMESPACE__, 
     'dispatch', function($e) { 
      $e->getTarget()->layout('admin/layout'); 
     }); 
    } 

现在在模块的视图目录中创建一个文件夹布局,并创建一个名为layout.phtml的文件并将您的布局代码那里。

+0

这是最好的和简单的解决方案 – tradebel123 2015-01-03 22:30:47