Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je cherche a faire un site utilisant ZF2.
Mon projet se décompose en différents modules :
- Site
- Admin
Ce que je n'arrive pas à faire c'est donner un différent layout à Admin. En clair chaque module à son propre layout....
J'ai fait cela :
Site/config/module.config.php :
'view_manager' => array(
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml'
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
Pareil pour Admin.
Et il me prend le layout a chaque fois de Admin et pas de site.... quand je suis sur la page du site.
Une idée ?
Cordialement,
Dernière modification par Paul75 (13-12-2012 17:57:45)
Hors ligne
Salut,
Pour avoir un layout spécifique à un module, suis les instructions ici : http://blog.evan.pro/module-specific-la … ramework-2
Hors ligne
J'ai eu ce même problème quand j'ai commencé à travailler avec zf2. Les configurations (module.config.php) de chaque module sont mergées. On peut le constater en mettant les routes d'un module dans la config d'un autre.
La solution que j'ai trouvé à l'époque sur internet (je n'ai pas cherché plus loin de puis puisque ça fonctionne) est de mettre cette fonction dans le Module.php de mon backend, sachant que ma déclaration de modules dans application.config.php est dans cet ordre : Backend, Application.
[lang=php] public function init(ModuleManager $moduleManager) { $sharedEvents = $moduleManager->getEventManager()->getSharedManager(); $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) { // This event will only be fired when an ActionController under the MyModule namespace is dispatched. $controller = $e->getTarget(); $controller->layout('layout/index.phtml'); }, 100); }
Hors ligne
bakura a écrit:
Salut,
Pour avoir un layout spécifique à un module, suis les instructions ici : http://blog.evan.pro/module-specific-la … ramework-2
Merci mais voilà je fait cela et cela me donne comme erreur :
Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "/Users/paulborel/Sites/traiter_manipulation/module/Site/view/layout/layout.phtml"; resolver could not resolve to a file' in /Users/paulborel/Sites/traiter_manipulation/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php:461 Stack trace: #0 /Users/paulborel/Sites/traiter_manipulation/vendor/zendframework/zendframework/library/Zend/View/View.php(203): Zend\View\Renderer\PhpRenderer->render(Object(Zend\View\Model\ViewModel)) #1 /Users/paulborel/Sites/traiter_manipulation/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(128): Zend\View\View->render(Object(Zend\View\Model\ViewModel)) #2 [internal function]: Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent)) #3 /Users/paulborel/Sites/traiter_manipulation/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(464 in /Users/paulborel/Sites/traiter_manipulation/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 461
Mon code dans site/Module.php comme indiqué sur le site :
public function init(ModuleManager $moduleManager)
{
$sharedEvents = $moduleManager->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
$controller = $e->getTarget();
//die(__DIR__ . "/view/layout/layout.phtml");
$controller->layout(__DIR__ . "/view/layout/layout.phtml");
}, 100);
}
Hors ligne
C'est bon j'ai compris. Il faut mettre le layout dans le repertoire de Application.
Désolé mais j'apprend seul Zend Framework 2. Je connais la version 1.
Merci.
Hors ligne
Sinon tu peux toujours utiliser ce module : https://github.com/EvanDotPro/EdpModuleLayouts c'est encore plus simple.
Hors ligne
bakura a écrit:
Sinon tu peux toujours utiliser ce module : https://github.com/EvanDotPro/EdpModuleLayouts c'est encore plus simple.
Pas réussi à le faire fonctionner.... et à l'installer...
Hors ligne
Bonjour à tous, j'ai un peut le même souci, je n'arrive pas à afficher un template différents pour chaque module.
J'ai dl et installer le module 'EdpModuleLayouts' qui reprend le principe expliqué par 'Bouks' ci-dessus.
J'arrive à l'installer et à le configurer, par contre j'ai un message d'erreur :
Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "module/Admin/view/layout/layout.phtml"; resolver could not resolve to a file' in /var/www/site/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php:461 Stack trace: #0 /var/www/site/vendor/zendframework/zendframework/library/Zend/View/View.php(203): Zend\View\Renderer\PhpRenderer->render(Object(Zend\View\Model\ViewModel)) #1 /var/www/site/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(128): Zend\View\View->render(Object(Zend\View\Model\ViewModel)) #2 [internal function]: Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent)) #3 /var/www/site/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(464): call_user_func(Array, Object(Zend\Mvc\MvcEvent)) #4 /var/www/site/vendor/zendframework/zendframework/libr in /var/www/site/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 461
D'après ce que je comprend (mais je ne suis pas sur de mois). zf2 n'arrive pas à utiliser mon template comme un layout... ?
Je vous met le code du module :
<?php namespace EdpModuleLayouts; class Module { public function onBootstrap($e) { $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])) { print_r($config['module_layouts'][$moduleNamespace]);//j'ai ajouter cette ligne pour vérifier que la config est bien chargé et j'ai bien le fichier 'module/Admin/view/layout/layout.phtm' pour mon modul Admin $controller->layout($config['module_layouts'][$moduleNamespace]); } }, 100); } }
la config (modul/Application/config/module.config.php):
'module_layouts' => array( 'Application' => 'module/Application/view/layout/layout.phtml', 'Admin' => 'module/Admin/view/layout/layout.phtml', ),
Hors ligne
Pour moi il n'arrive pas à charger ta classe. Essaie de changer avec ça pour voir :
[lang=php]'module_layouts' => array( 'Application' => 'Application/view/layout/layout.phtml', 'Admin' => 'Admin/view/layout/layout.phtml', ),
Hors ligne
j'ai le même message d'erreur :
atal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "Admin/view/layout/layout.phtml"; resolver could not resolve to a file' in
Hors ligne
J'ai essayé d'inclure tout simplement le template avec l'adresse permettant de configurer le layout, c'est à dire:
'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
Du coup cela donne :
'module_layouts' => array( 'Application' => __DIR__ . '/../view/layout/layout.phtml', 'Admin' => __DIR__ . '/../view/layout/layout.phtml',//c'est le même mais c'est pas essayer de faire marché le truc ),
Et avec ça j'ai l'erreur :
Fatal error: Uncaught exception 'Zend\View\Exception\DomainException' with message 'Requested scripts may not include parent directory traversal ("../", "..\" notation)' in
Il n'aime pas aller dans le répertoire parent.
Je continue mes recherches
Hors ligne
ceux pour qui ça fonctionne, vous avez quelle version du framework?
Hors ligne
Bonjour,
J'utilise un layout par module à travers "EdpModuleLayouts" et tout fonctionne correctement.
Procède comme suit:
- Ajoute la ligne 'EdpModuleLayouts' dans ton fichier application.config.php
- Crée le fichier "layout.php" dans le dossier autoload de la racine de ton projet
<?php return array( 'module_layouts' => array( 'Admin' => 'layout/admin', 'Site' => 'layout/site', ), );
et oublie pas d'ajouter layout.php dans ton fichier application.config.php, tel que :
... 'module_listener_options' => array( 'config_glob_paths' => array( 'config/autoload/{,*.}{config,layout}.php', ), ...
- Ci-dessous le module.config.php de ton module Admin (à partir de "router"):
... 'router' => array( 'routes' => array( 'admin' => array( 'type' => 'Literal', 'options' => array( 'route' => '/admin', 'defaults' => array( 'controller' => 'admin', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'controllers' => array( 'invokables' => array( 'admin' => 'Admin\Controller\Index', 'authenticate' => 'Admin\Controller\Authenticate' ), ), '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( 'layout/admin' => __DIR__ . '/../view/layout/admin.phtml' ), 'template_path_stack' => array( __DIR__ . '/../view', ), ), ...
- Si tu regardes bien j'ai définis un controller "authenticate" dans ton module Admin. Tu dois avoir autant de view que de controller/action, tels que cette architecture :
... Admin/ (module) src/ Admin/ Controller/ Index.php Authenticate.php view/ layout/ admin.phtml admin/ authenticate/ index.phtml login.phtml index/ index.phtml ...
Dans les actions de tes controller si tu veux pas rediriger ta page tu dois utiliser
<?php namespace Admin\Controller; use Zend\Mvc\Controller\AbstractActionController, Zend\View\Model\ViewModel; class Authenticate extends AbstractActionController { public function indexAction() { $viewModel = new ViewModel(); $viewModel->setTerminal(true); return $viewModel; } public function loginAction() { $viewModel = new ViewModel(); $viewModel->setTerminal(true); return $viewModel; } public function logoutAction() { $viewModel = new ViewModel(); $viewModel->setTerminal(true); return $viewModel; } }
- Ci-dessous le module.config.php de ton module Site (à partir de "router"):
.... 'router' => array( 'routes' => array( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'index', 'action' => 'index', ), ), ), ), ), 'controllers' => array( 'invokables' => array( 'index' => 'Site\Controller\Index' ), ), '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( 'layout/site' => __DIR__ . '/../view/layout/site.phtml' ), 'template_path_stack' => array( __DIR__ . '/../view', ), ), ...
Maintenant tu peux accéder aux routes suivantes :
/ -> module: site - controller: index - action: index
/admin -> module: admin - controller: index - action: index
/admin/authenticate -> module: admin - controller: authenticate - action: index
/admin/authenticate/login -> module: admin - controller: authenticate - action: login
Voila j'espère avoir répondu à ton besoin :)
Dernière modification par adloiseau (25-01-2013 09:01:27)
Hors ligne
Moi je fais la même chose mais pour chaque controller. A peu près la même méthode ci-dessus.
Si cela interesse du monde , je posterais mon code. Dite le moi.
Hors ligne
Nirzol a écrit:
Moi je fais la même chose mais pour chaque controller. A peu près la même méthode ci-dessus.
Si cela interesse du monde , je posterais mon code. Dite le moi.
Bonjour,
Moi cela m'intéresse, si c'est pas trop demandé.
Merci
Hors ligne
OK. J'ai adapté un module trouvé sur le site module.zend
Dans module.php
[lang=php] public function onBootstrap(MvcEvent $e) { $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { $controller = $e->getTarget(); $route = $controller->getEvent()->getRouteMatch(); $controllerNamespace = $route->getParam('__CONTROLLER__', 'index'); $config = $e->getApplication()->getServiceManager()->get('config'); if (isset($config['controller_layouts'][$controllerNamespace])) { $controller->layout($config['controller_layouts'][$controllerNamespace]); }else { $controller->layout('layout/layout.phtml'); } }, 100); }
Dans module.config.php tu ajoutes :
[lang=php] 'controller_layouts' => array( //'ControllerName' => 'layout/some-layout', 'index' => 'layout/layoutindex.phtml', 'admin' => 'layout/layoutadmin.phtml', //etc.... ),
En gros le premier bout code récupère le controller ou tu te trouves, et regarde dans le array (2eme bout de code ) le layout et change ce dernier avec $controller->layout('monlayout.html')
Hors ligne
Bonjour Nirzol,
Tu sais que le morceau de code ci-dessus est le même que le module "EdpModuleLayouts" ?
Dans ce cas gagne t'on en performance en utilisant directement ce morceau de code dans le fichier module.php de chacun de nos modules ?
Hors ligne
Oui oui je sais. Comme j'ai dis dans mon post
j'ai adapté un module trouvé sur le site de zend car EdpModuleLayouts gère par "module" et mes besoins étaient d'avoir un layout par controller dans le même module.
Au niveau gain performance, le je ne sais pas par module ça doit être moins gourmand. Car la à chaque fois qu'on change de controller il va vérifié quel layout utilisé.
Tout dépends de tes besoins après.
Hors ligne
On est d'accord, tout dépend des besoins de chacun
Hors ligne
Merci pour vos réponses
Mon problème était vraiment bête. J'utilisai " __DIR__ . '/../view/layout/layout.phtml' " pour donner le chemin du layout alors que zf2 va chercher le layout dans le dossier des vues. Il suffit de mettre 'layout/layout.phtml'.
Par contre, zf2 enregistre le chemin de vue du dernier module charger. Je m'explique :
Je charge le module Application et le module Admin, c'est donc dans le chemin des vues de mon module Admin que zf2 va chercher mon layout. C'est à dire 'module/admin/view'. Du coup, je n'arrive pas à charger correctement mon layout du module Application (module/application/view/layout/layout.phtml).
Donc, je me demandais, ou placer vous vos layout pour pouvoir les charger tous les deux?
Hors ligne
Je pense que tu devrais relire ou lire l'exemple que j'ai cité un peu plus haut
Hors ligne
, merci. J'ai relu et j'ai comprit. Tous fonctionne.
en faite je croyait que la clé pour les layout était fixe et non un alias.
'template_map' => array( 'layout/site' => __DIR__ . '/../view/layout/site.phtml' ),
Moi je mettait toujours 'layout/layout' et je pensai pas que ça pouvait servir de clé pour configuré le module EdpModuleLayouts.
encore merci
Hors ligne