2013-05-03 1 views
5

EdpModuleLayouts를 사용하여 하나의 레이아웃을 내 zf2 웹 응용 프로그램의 모바일 버전에 사용하고 다른 레이아웃을 "데스크톱"버전으로 사용합니다.다른 모듈에 다른 레이아웃 사용 zend framework 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

답변

16

내 멀티 레이아웃 프로젝트에도 EdpModuleLayouts을 사용하고 있습니다. 나는 이동해야한다고 생각한다. module_layoutsmodule.config.php to 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); 
} 

이 내 구성 \의 자동로드 \ 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. 당신이 나를 위해

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

작품을 module.config.php 조정합니다.

+0

+1 모듈별로 레이아웃에 고유 한 식별자를 부여합니다. – kta

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

여러 모듈을 사용할 때 부분 템플릿과 오류를 포함하는 모든 템플릿의 네임 스페이스를 지정하는 것이 좋습니다. –

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