2013-05-03 8 views
5

Używam EdpModuleLayouts do używania jednego układu do mobilnej wersji mojej aplikacji webowej zf2, a innej do wersji "desktopowej".Używaj różnych układów do różnych modułów Zend Framework 2

Konfiguracja w module.config.php moduł aplikacyjny:

...'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 modułu Application to jest tak:

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); 

} 

Wreszcie mam jeden układ w module Application i kolejny w module użytkownika. W tej chwili za każdym razem renderuj układ w Modelu użytkownika, mimo że wpisuję adres URL aplikacji.

Utknąłem na tym, doceniam pomoc.

+3

Dlaczego duplikujesz kod? Czy korzystasz z jego modułu lub po prostu kodu jego modułu? Ponadto w Twojej konfiguracji wystąpił błąd, w którym 'module_layouts' powinien być wpisem najwyższego poziomu. Sprawdź kilka innych wątków na ten temat, jest ich 10-20;) – Sam

Odpowiedz

16

Używam również EdpModuleLayouts dla mojego projektu wieloukładowego. myślę, że trzeba przenieść module_layouts z module.config.php do autoload/global.php plików.

To mój Module.php modułu aplikacji:

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); 
} 

To mój config \ autoload \ global.php:

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

to działa na mnie i nadziei to pomaga tobie.

2

Moje rozwiązanie:

  1. Zapis wtyczki kontroler;
  2. W plugin:

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

uzyskać nazwę modułu, to pierwsza nazwa katalogu z kontrolera w moim app przynajmniej.

  1. Regulacja ty 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', 
    ), 
    

pracuje dla mnie.

+0

+1 za nadanie układowi unikalnego identyfikatora na podstawie modułu. – kta

2

Następujące prace dla mnie.

Główną ideą jest nadanie układowi innego identyfikatora niż użycie nazwy zwyczajowej, takiej jak "layout/layout". W ten sposób, gdy konfiguracja zacznie się scalać, nie zgubi się po drodze.

Jeśli mam moduł nazwa albumu, będę miał następujące.

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); 
} 

Zauważ, że to trochę inaczej niż w EdpModuleLayouts. I module.config.php Mam następującą odpowiednią konfigurację.

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

i to powinno working.Hope to pomaga :)

+1

Znalazłem przy korzystaniu z kilku modułów, że dobrym zwyczajem jest przestrzeń nazw wszystkich szablonów obejmujących części i błędy. –

19

zaktualizować swój module.config.php

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

teraz w Module.php zapisu następujące wiersze

use Zend\ModuleManager\ModuleManager; 

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

teraz utwórz układ folderów w katalogu widoku modułu i utwórz plik o nazwie layout.phtml i umieść swój kod układu tam.

+0

to najlepsze i najprostsze rozwiązanie – tradebel123