5

我正在使用 EdpModuleLayouts 将一种布局用于我的 zf2 webapp 的移动版本,将另一种布局用于“桌面”版本。

Application模块中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。

我坚持这一点,我很感激一些帮助。

4

4 回答 4

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 的文件并将您的布局代码放在那里。

于 2014-06-04T09:18:12.913 回答
16

我还在为我的多布局项目使用 EdpModuleLayouts。我认为,您需要将module_layoutsmodule.config.php移动到autoload/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);
}

这是我的config\autoload\global.php

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

它对我有用,希望对你有帮助。

于 2013-07-27T10:35:33.770 回答
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',
    ),
    

为我工作。

于 2013-07-12T03:12:33.530 回答
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',
    ),
),

这应该可以工作。希望这会有所帮助:)

于 2014-03-29T13:18:01.250 回答