2013-05-03 17 views
5

Sto utilizzando EdpModuleLayouts per utilizzare un layout per la versione mobile della mia webapp zf2 e un altro per la versione "desktop".Utilizzare layout diversi per moduli diversi zend framework 2

La configurazione in module.config.php nel modulo di applicazione:

...'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 del modulo applicativo è come questo:

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

} 

Infine, ho un layout nel modulo Application e un altro nel modulo Utente. In questo momento, ogni volta, si esegue il rendering del layout nel Modello utente, anche se si accede all'URL dell'applicazione.

Mi sono schiacciato, ho apprezzato un po 'di aiuto.

+3

Perché stai duplicando il codice? Stai usando il suo modulo o solo il codice del suo modulo? Inoltre c'è un errore nella tua configurazione il 'module_layouts 'dovrebbe essere una voce di primo livello. Controlla un paio di altri thread su questo argomento, c'è come 10-20 di esso;) – Sam

risposta

16

Sto anche utilizzando EdpModuleLayouts per il mio progetto multi-layout. Penso che sia necessario spostare module_layouts da module.config.php a autoload/global.php file.

Questo è il mio Module.php del modulo Application:

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

Questo è il mio config \ caricamento automatico \ global.php:

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

funziona per me e la speranza ti aiuta

2

La mia soluzione: Controller

  1. Write plug-in;
  2. nel plugin:

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

per ottenere il nome del modulo, che è primo nome della directory del controller, nella mia app, almeno.

  1. Regolare si 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', 
    ), 
    

funziona per me.

+0

+1 per dare al layout un identificatore univoco per modulo base. – kta

2

I seguenti lavori per me.

L'idea principale è denominare il layout un identificatore diverso anziché utilizzare un nome comune come "layout/layout". In questo modo quando la config inizierà a fondersi, non si perderà per strada.

Se ho un nome modulo album, avrò il seguente.

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

Si noti che questo è un po 'diverso rispetto a EdpModuleLayouts. E module.config.php ho la seguente configurazione rilevante.

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

E che dovrebbe essere working.Hope questo aiuta :)

+1

Ho trovato quando si utilizzano diversi moduli che è una buona pratica per lo spazio dei nomi tutti i modelli inclusi partials ed errori. –

19

Aggiornare il module.config.php

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

ora in module.php scrittura righe seguenti

use Zend\ModuleManager\ModuleManager; 

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

ora crea un layout di cartella nella directory di visualizzazione del modulo e crea un file con nome layout.phtml e inserisci il tuo codice di layout Là.

+0

questa è la soluzione migliore e semplice – tradebel123

Problemi correlati