2 votes

Mise en page spécifique au contrôleur dans ZendFramework 2

J'ai un module dans mon application zendframework 2 qui contient deux contrôleurs. Je veux définir une mise en page différente pour l'une des actions du contrôleur. Existe-t-il un moyen de le faire dans le fichier de configuration du module ?

P.s : Je viens d'essayer de le mettre dans la méthode __CONSTRUCT du contrôleur en utilisant les commandes suivantes mais ça n'a pas marché !

$event = $this->getEvent();
$event->getViewModel()->setTemplate('layout/MYLAYOUT');

Mais si j'utilise les commandes ci-dessus dans chaque action de mon contrôleur, tout fonctionne bien.

3voto

David Points 980

Voir Les exemples d'akrabat pour un certain nombre de méthodes intéressantes permettant de modifier facilement les mises en page, les vues, etc.

Vous trouverez ce que vous cherchez sur le site suivant son github ici .

Voici un copier-coller de la méthode d'action du contrôleur qui définit/utilise la disposition alternative :

public function differentLayoutAction()
{
    // Use a different layout
    $this->layout('layout/different');

    return new ViewModel();
}

Edit : Il semble qu'akrabat ait un exemple qui dit que Change the layout for every action within a module Mais je viens de jeter un coup d'œil au code, et l'exemple est actuellement inachevé, il ne modifie pas la mise en page.

2voto

Sam Points 12735

Je ne peux que vous orienter dans la bonne direction, car actuellement je ne suis pas en mesure d'ouvrir un projet d'exemple. Evan Coury a publié une méthode permettant de moduler des mises en page spécifiques. Voir les liens suivants :

Mise en page spécifique aux modules dans Zend Framework 2

<?php
namespace MyModule;

use Zend\ModuleManager\ModuleManager;

class Module
{
    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/alternativelayout');
        }, 100);
    }
}

En quoi cela peut-il vous aider ? Eh bien, $controller devrait avoir le contrôleur appelé et l'action stockée. Je suis sûr que vous pouvez vérifier le $controller pour l'action appelée, puis affecte la mise en page en conséquence.

Je suis désolé, je ne peux actuellement que vous indiquer la direction, mais je suis sûr que cela peut vous aider à démarrer.

0voto

ellcub Points 589

La réponse de @Sam répond à peu près à la question. Comme indiqué, il faut juste vérifier quel contrôleur est appelé, ce qui peut être fait comme ceci :

<?php
namespace MyModule;

use Zend\ModuleManager\ModuleManager;

class Module
{
    public function init(ModuleManager $moduleManager){
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
                $controller = $e->getTarget();
                if ($controller instanceof Controller\AltLayoutController) {
                    $controller->layout('layout/alternativelayout');
                }
            }, 100);
    }

I

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X