2013-05-03 4 views
5

Ich benutze EdpModuleLayouts, um ein Layout für die mobile Version meiner zf2 Webapp und ein anderes auf die "Desktop" -Version zu verwenden.Verwenden Sie differents Layouts zu differents Module zend Framework 2

Die Konfiguration in module.config.php in Applikationsmodul:

...'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 des Moduls Anwendung es so ist: Schließlich

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

} 

, habe ich ein Layout in Anwendungsmodul und ein anderes im Benutzermodul. In diesem Moment rendern jedes Mal das Layout im Benutzermodell, obwohl ich die Anwendungs-URL eingebe.

Ich steckte darauf, ich schätze etwas Hilfe.

+3

Warum du den Code duplizierst? Benutzt du sein Modul oder nur den Code seines Moduls? Außerdem gibt es einen Fehler in Ihrer Konfiguration. Die 'module_layouts' sollten ein Eintrag der obersten Ebene sein. Überprüfen Sie ein paar andere Threads zu diesem Thema, es gibt 10-20 davon;) – Sam

Antwort

16

Ich verwende auch EdpModuleLayouts für mein Multi-Layout-Projekt. Ich denke, Sie müssen sich bewegen module_layouts von module.config.php bis autoload/global.php Datei.

Das ist mein module.php des Applikationsmodul:

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

Das ist mein config \ autoload \ global.php:

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

es funktioniert für mich und Hoffnung es hilft dir.

2

Meine Lösung:

  1. Write Controller Plugin;
  2. Im Plugin:

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

Modulnamen zu bekommen, ist das erste Verzeichnisname des Controllers, in meiner app zumindest.

  1. Passen Sie für mich

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

Works module.config.php.

+0

+1 für das Layout eine eindeutige Kennung pro Modul Basis geben. – kta

2

Folgendes funktioniert für mich.

Die Hauptidee besteht darin, dem Layout einen anderen Bezeichner zu geben, anstatt einen allgemeinen Namen wie "Layout/Layout" zu verwenden. Auf diese Weise, wenn die Config wird beginnen zu verschmelzen, wird es nicht auf dem Weg verloren gehen.

Wenn ich einen Modulnamen Album habe, dann werde ich folgendes haben.

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

Beachten Sie, dass dies im Vergleich zu EdpModuleLayouts ein wenig anders ist. Und module.config.php Ich habe die folgende relevante Konfiguration.

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

Und das sollte working.Hope das hilft :)

+1

Ich fand bei der Verwendung mehrerer Module, dass es eine gute Übung ist, alle Templates einbezogene Partials und Fehler zu benennen. –

19

Aktualisieren Sie Ihre module.config.php

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

jetzt in module.php Schreib folgenden Zeilen

use Zend\ModuleManager\ModuleManager; 

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

Erstellen Sie jetzt ein Ordnerlayout im Ansichtsverzeichnis des Moduls und erstellen Sie eine Datei mit dem Namen layout.phtml und geben Sie Ihren Layoutcode ein Dort.

+0

Dies ist die beste und einfachste Lösung – tradebel123