Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-12-2012 20:30:49

Paul75
Membre
Lieu: Paris
Date d'inscription: 23-12-2010
Messages: 101

[Résolu] ZF2 et les modules et différents layouts

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

 

#2 13-12-2012 16:28:41

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [Résolu] ZF2 et les modules et différents layouts

Salut,

Pour avoir un layout spécifique à un module, suis les instructions ici : http://blog.evan.pro/module-specific-la … ramework-2

Hors ligne

 

#3 13-12-2012 16:35:46

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: [Résolu] ZF2 et les modules et différents layouts

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.


Code:

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

    }

22914720

Hors ligne

 

#4 13-12-2012 17:37:08

Paul75
Membre
Lieu: Paris
Date d'inscription: 23-12-2010
Messages: 101

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#5 13-12-2012 17:57:20

Paul75
Membre
Lieu: Paris
Date d'inscription: 23-12-2010
Messages: 101

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#6 13-12-2012 21:45:09

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [Résolu] ZF2 et les modules et différents layouts

Sinon tu peux toujours utiliser ce module : https://github.com/EvanDotPro/EdpModuleLayouts c'est encore plus simple.

Hors ligne

 

#7 13-12-2012 21:47:49

Paul75
Membre
Lieu: Paris
Date d'inscription: 23-12-2010
Messages: 101

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#8 23-01-2013 13:51:20

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

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 :

Code:

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 :

Code:

<?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):

Code:

'module_layouts' => array(
            'Application' => 'module/Application/view/layout/layout.phtml',
            'Admin' => 'module/Admin/view/layout/layout.phtml',
    ),

Hors ligne

 

#9 23-01-2013 14:02:39

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] ZF2 et les modules et différents layouts

Pour moi il n'arrive pas à charger ta classe. Essaie de changer avec ça pour voir :

Code:

[lang=php]'module_layouts' => array(
            'Application' => 'Application/view/layout/layout.phtml',
            'Admin' => 'Admin/view/layout/layout.phtml',
    ),

Hors ligne

 

#10 23-01-2013 14:47:07

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

j'ai le même message d'erreur :

Code:

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

 

#11 23-01-2013 17:04:46

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

J'ai essayé d'inclure tout simplement le template avec l'adresse permettant de configurer le layout, c'est à dire:

Code:

'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',

Du coup cela donne :

Code:

'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 :

Code:

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

 

#12 24-01-2013 18:20:57

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

ceux pour qui ça fonctionne, vous avez quelle version du framework?

Hors ligne

 

#13 25-01-2013 08:58:30

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF2 et les modules et différents layouts

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

Code:

<?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 :

Code:

...
'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"):

Code:

...
    '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 :

Code:

...
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

Code:

<?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"):

Code:

....
    '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

 

#14 25-01-2013 10:55:07

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#15 25-01-2013 11:00:39

Paul75
Membre
Lieu: Paris
Date d'inscription: 23-12-2010
Messages: 101

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#16 25-01-2013 11:17:22

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: [Résolu] ZF2 et les modules et différents layouts

OK. J'ai adapté un module trouvé sur le site module.zend
Dans module.php

Code:

[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 :

Code:

[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

 

#17 25-01-2013 11:43:43

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#18 25-01-2013 11:51:09

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#19 25-01-2013 11:52:55

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF2 et les modules et différents layouts

On est d'accord, tout dépend des besoins de chacun wink

Hors ligne

 

#20 25-01-2013 14:19:08

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

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

 

#21 25-01-2013 15:36:14

adloiseau
Membre
Date d'inscription: 10-01-2013
Messages: 35

Re: [Résolu] ZF2 et les modules et différents layouts

Je pense que tu devrais relire ou lire l'exemple que j'ai cité un peu plus haut wink

Hors ligne

 

#22 25-01-2013 17:24:45

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: [Résolu] ZF2 et les modules et différents layouts

smile, 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.

Code:

'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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages