Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-03-2010 08:25:52

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Gestion des layouts depuis le controller

Bonjour,

J'ai lu les tutoriaux sur les layouts sur developpez.com et sur vos forums (+les docs zend) et je dois avouer que je n'arrive pas à faire ce que je souhaite.

En effet actuellement dans mon layout je fais ceci pour afficher des blocs via les controllers :

Code:

<?php
echo $this->action('index', 'news');
?>

Mais je trouve cette technique pas très propre surtout si je ne souhaite pas afficher les news sur telle ou telle page...

Je souhaite intégrer la vue de mon controller news par exemple comme ceci :

Code:

<?php echo $this->layout()->news; ?>

Je créer une variable news dans mon layout et c'est dans le controller que j'intègrerais la vue comme ceci :

Code:

$layout->layout()->news = $news;

Mais ceci ne fonctionne pas.

J'ai bien essayé ceci dans mon controller :

Code:

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setRender('toto', 'adroite', true);
$frontController = Zend_Controller_Front::getInstance();

Mais je n'arrive pas à afficher la vue de mes news et si j'y arrive la vue s'inclue bien mais ne charge plus le content...

Si vous savez comment faire je suis preneur

Bonne journée à vous

Hors ligne

 

#2 24-03-2010 09:03:20

Blount
Membre
Date d'inscription: 23-06-2009
Messages: 98
Site web

Re: Gestion des layouts depuis le controller

Pourquoi ne pas créer une aide de vue ?

Hors ligne

 

#3 24-03-2010 09:12:16

akrogames
Membre
Date d'inscription: 22-03-2010
Messages: 27

Re: Gestion des layouts depuis le controller

Actuellement je fais ceci dans mon controller :

Code:

$this->view->news = $news;

Et dans mon layout :
<?php  echo $this->action('index', 'news'); ?>

Mon layout va donc chercher ma vue du controller news. Mais je voudrais que se soit le controlleur qui aille chercher ma vue et l'intègre ensuite dans une boite nommé apr exemple "news" dans mon layout. De manière à ce que mon layout ne se précoccupe plus de savoir qui il doit appeler mais juste afficher le rendu.

Tu ferais comment pour créer un helper de vue pour faire ce que je veux ?

Merci d'avance de ton aide.

Hors ligne

 

#4 26-03-2010 21:23:03

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: Gestion des layouts depuis le controller

Salut,

Sur mon site, pour gérer ce genre de cas, je suis passé par un plugin qui s'occupe de rajouter les actions correspondant à chaque page du site. Comme le framework fait correspondre une vue à chaque action, on se retrouve à pouvoir afficher plusieurs vues dans une page donné sans devoir les nomer directement dans le layout.


En gros, au niveau exécution, ça donne :
- le framework appelle le plugin qui remplira la pile d'action
- le controller parcours cette pile et déclanche les actions correspondantes
- le framework traite la vue correspondant à chaque action (vue par défaut ou celle indiqué par l'action)
- le layout affiche l'ensemble des vues sans se demander d'où elles sortent

Evidement on peut utiliser d'autres méthodes avec le zend framework (comme les aide de vues) ce qui donne un enchainement différent pour le même résultat.

Je posterai du code plus tard. Je n'ai pas mes fichiers sur moi.

Hors ligne

 

#5 27-03-2010 15:18:33

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: Gestion des layouts depuis le controller

Voilà mon code.
Dans le bootstrap :

Code:

define('APPLICATION_PATH', realpath(dirname(__FILE__)));
set_include_path(
    APPLICATION_PATH . '/plugins' . PATH_SEPARATOR .
    get_include_path()
);

Dans le fichier index.php :

Code:

include '../application/plugins/stack.php';
Zend_Controller_Front::getInstance()
        ->registerPlugin(new stackPlugin())
    ->dispatch();

et le gros morceau, le plugin :

Code:

<?php

/**
 *
 *
 * @version $Id$
 * @copyright 2009
 */
class stackPlugin extends Zend_Controller_Plugin_Abstract
{
    protected $_stack = null;
// appellé avant le controller correspondant à l'url demandé0
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {

// action par défaut
        $_GET['St_page'] = isset($_GET['St_page'])?$_GET['St_page']:'index';
        $stack = $this->getStack();

// on vide la liste des actions à effectué, utile si on ne veut pas le couple action/controleur défaut ou si on ne veut pas qu'il soit exécuté en premier par le zend framework
        while($stack->popStack()){
        }

// on rajoute les couples actions/controlleurs qu'on veut faire apparaitre
// le "responseSegment" permet d'indiquer pour chaque couple dans quelle partie de la page on veut qu'il apparaisse
            $MenuRequest = new Zend_Controller_Request_Simple();
            $MenuRequest->setControllerName('Editeuraventure')
                         ->setActionName('menu')
                         ->setParam('responseSegment', 'menu');
            $stack->pushStack($MenuRequest);

            $MenuUserRequest = new Zend_Controller_Request_Simple();
            $MenuUserRequest->setControllerName('Utilisateur')
                ->setActionName('menu')
                ->setParam('responseSegment', 'menu');
            $stack->pushStack($MenuUserRequest);


// 
        // action principale
        $indexRequest = new Zend_Controller_Request_Simple();
        $indexRequest->setControllerName($_GET['St_mod'])
            ->setActionName($_GET['St_page'])
            ->setParam('responseSegment', 'content');
        $stack->pushStack($indexRequest);

// exécution de la première action de la liste
        $stack->forward($stack->popStack());
    }

// on récupère la pile des couples actions/controlleurs
    public function getStack()
    {
        if (null === $this->_stack) {
            $front = Zend_Controller_Front::getInstance();
            if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
                $stack = new Zend_Controller_Plugin_ActionStack();
                $front->registerPlugin($stack);
            } else {
                $stack = $front->getPlugin('ActionStack');
            }
            $this->_stack = $stack;
        }
        return $this->_stack;
    }
}

?>

Pour gérer les zones d'affichage, il faut rajouter dans toutes les actions :

Code:

        $request = $this->getRequest();
        if ($request->getParam('responseSegment')!=="content") {
            $this->_helper->viewRenderer->setResponseSegment($request->getParam('responseSegment'));
            $this->view->ResponseGraphic=$request->getParam('responseSegment');
        }else{
            $this->view->ResponseGraphic='Default';
        };

Du côté du layout, pour afficher toutes les vues, c'est comme pour afficher une seule vue. Les vues sont concaténé dans les "responseSegment" ("content" et "menu") dans mon exemple.

Code:

echo $this->layout()->content ;
...
echo $this->layout()->menu ;

Avec tout ça mon plugin détermine qu'elles actions traité et donc qu'elle vues affiché. De plus grace au paramêtre 'responseSegment', il indique aussi dans quelle partie du layout sera affiché chaque vue. Comme c'est l'action qui l'indique au zend framework, on est obligé de rajouter quelques lignes de code dans toutes les vues. C'est le côté embêtant de ma méthode.
Du côté du layout on choisit où afficher chaque ensemble de vue (un ensemble de vue correspondant à une valeur de "responseSegment").

Dernière modification par omega2 (27-03-2010 15:21:12)

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