Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-07-2009 14:48:23

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Où placer mes variables répétitives

Bonjour,

J'ai une question tout bête :

Admettons que dans mon application j'ai régulièrement besoin d'afficher (ou non) des variables stockées en session. Par exemple, je souhaite que afficher le prénom de mon utilisateur qui vient de s'authentifier

$mon_utilisateur         = new Zend_Session_Namespace('user');
$this->view->prenom     = $mon_utilisateur->array['prenom'];

ou placeriez vous ce bout de code pour qu'il s'affiche dans une partie de votre layout ?


Au début j'étais partis pour le mettre dans une méthode init de mes controleurs, mais l'opération est vraiment redondante s'il y a beaucoup de controleur


aka miboo

Hors ligne

 

#2 30-07-2009 15:09:50

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Où placer mes variables répétitives

Salut,

Il y a plusieurs solutions pour les codes redondants des controlleurs.

Soit tu crées un controlleur dont tous les autres hérites, soit tu utilises les helpers d'actions qui sont fait pour ça et qui en plus te font économiser un héritage de controlleur.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 30-07-2009 15:27:59

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Merci Delprog, de venir à mon secours si souvent smile

Les helpers d'action sont-ils équivalent à des plugin controller sauf qu'il faut les appeler manuellement?



Déclaration du répertoire des helpers (on doit pouvoir le faire avec Zend_Application, j'ai pas encore regardé)

Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');

Déclaration de mon helper

<?php

class Zend_Controller_Action_Helper_Addition extends
                Zend_Controller_Action_Helper_Abstract
{
    function add($a, $b)
    {
        return $a + $b;
    }
}

NomController.php

<?php

class %nom%Controller extends Zend_Controller_Action
{
    public function indexAction()
    {
(...)           
$result = $this->_helper->add($a, $b);

$this->view->result = $result;

Avec ça je pourrais condenser un peu le code effectivement, dans le cas de nombreuses opérations smile


aka miboo

Hors ligne

 

#4 30-07-2009 15:36:41

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Où placer mes variables répétitives

Quand tu dis plugin de controller tu penses : "Un peu comme s'il éxistait des plugins de controlleurs d'action" ? smile

Pour déclarer le dossier des helpers avec les préfix:

Code:

resources.frontcontroller.actionhelperpaths.Tight_Controller_Action_Helper_ = APPLICATION_PATH '/../library/Tight/Controller/Action/Helper'

Ou ailleurs si tu préfères smile


A+

Dernière modification par Delprog (30-07-2009 15:37:55)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 30-07-2009 15:40:38

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: Où placer mes variables répétitives

Pour les variables redondantes, j'utilise un helper d'action :

Code:

class Action_Helper_Vars extends Zend_Controller_Action_Helper_Abstract
{
    /**
     * Liste des variables à injecter.
     * @var array
     */
    private $_vars = array();
    
    
    
    /**
     * Ajoute une variable dans un contrôleur.
     *
     * @param string $var : Nom de la variable
     * @param mixed $value : Valeur de la variable
     * @return Action_Helper_Vars
     */
    public function addVar($var, $value)
    {
        $this->_vars[$var] = $value;
        return $this;
         }
    
    
    
    /**
     * Effectue l'injection des variables dans les contrôleurs.
     *
     * @return void
     */
    public function preDispatch()
    {
        foreach ($this->_vars as $var => $value)
        {
            $this->getActionController()->$var = $value;
        }
    }    
}

Dans le boostrap, je fais :

Code:

$config = Zend_Config('truc.ini');
...
$vars = new Action_Helper_Vars();
$vars->addVar('config', $config);
Zend_Controller_Action_HelperBroker::addHelper($vars);

Et ensuite dans un contrôleur je fais :

Code:

class MonController extends Zend_Controller_Action
{
       public function indexAction()
       {
                $value = $this->config->....
                ...
       }
}

Avec ce helper d'action j'injecte directement les variables dans le controlleur, et je peux ensuite les appeler en faisant $this->{nom_variable}.

En espérant vous avoir aidé wink

Dernière modification par ALkyD (30-07-2009 15:41:49)

Hors ligne

 

#6 30-07-2009 15:41:08

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Merci pour la ligne.

Quand je dis plugin, je pense à quelque chose :

class My_Plugin_xxx extends Zend_Controller_Plugin_Abstract


aka miboo

Hors ligne

 

#7 30-07-2009 16:03:14

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Où placer mes variables répétitives

Ok, alors non c'est pas la même chose smile

Un plugin peut intervenir durant tout le processus de dispatch de la requête, alors qu'un helper d'action intervient uniquement sur le dispatch autour d'un controlleur d'action.

Pour faire simple, le dispatch d'un controlleur d'action c'est dans l'ordre:
- init() du controlleur (en quelque sorte le constructeur)
- preDispatch() du controlleur
- appel de la méthode de l'action du controlleur
- postDispath() du controlleur

Le helper d'action agit autour de ça. La méthode preDispatch() du helper intervient juste avant le preDispatch() du controlleur et la méthode postDispatch() du helper juste après le postDispatch() du controlleur d'action.

Pour être plus précis, juste avant le dispatch() d'un controlleur d'actions, l'instance du controlleur est injectée dans tous les helpers d'action et toutes les méthodes init() des helpers sont invoquées.
Ensuite, le dispatch() du controlleur est déclenché et les preDispatch() des helpers juste avant.

Donc pour compléter ce que je disais avant on a dans l'ordre du processus:

- injection de l'instance du controlleur dans tous les helpers d'action
- init() de tous les helpers d'action
- preDispatch() de tous les helpers
- init() du controlleur
- preDispatch() du controlleur
- action du controlleur
- postDispatch() du controlleur
- postDispatch() de tous les helpers

Donc pour résumer, tout ce que tu fais dans un helper d'action sera disponible dans le controlleur, sauf en postDispatch() :p

Un petit coup d'oeil à ce diagram pour bien comprendre le déroulement des opérations smile

On voit bien ce qui se passe, le plugin agit encore au dessus et autour de ce que je viens de décrire.

En espérant que tu aies un déclic avec tout ça ! :p

A+


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#8 31-07-2009 09:09:06

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Où placer mes variables répétitives

Ce lien est pas mal non plus : http://www.kitpages.fr/zf_helper_plugin.php

Hors ligne

 

#9 31-07-2009 10:47:33

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

merci pour vos liens et votre aide.

Dernière question, avec:

resources.frontController.actionhelperpaths.main = APPLICATION_PATH "/controllers/helpers"

et un action helper Session.php

[...]
$mon_utilisateur         = new Zend_Session_Namespace('user');
$this->view->prenom     = $mon_utilisateur->array['prenom'];

$ma_variable = %petit traitement redondant% ;
[...]

Faut-il rajouter une déclaration particulière pour que le helper Session soit actif dans mon controller ?


aka miboo

Hors ligne

 

#10 31-07-2009 11:00:35

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Où placer mes variables répétitives

Question : pourquoi ranger les actions helpers dans /library/My/Action/Helper? Ce n'est pas logique pour moi. Ou est vraiment la place d'un action Helper ? Pour les views Helpers on les mets bien dans dans /views/helpers, pourquoi là on le rangerai pas dans /controllers/helpers.

Merci


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#11 31-07-2009 11:01:36

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Oui effectivement tu as raison, c'est plus logique, je corrige mon exemple


aka miboo

Hors ligne

 

#12 31-07-2009 11:06:01

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Où placer mes variables répétitives

Tout dépends si tes actions helpers sont spécifiques à ton appli ou réutilisable entre appli. Mais c'est vrai que pour le cas de Miboo c'est peut être mieux dans la'rbo de l'appli smile

Hors ligne

 

#13 31-07-2009 11:39:01

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Où placer mes variables répétitives

Oui effectivement tout dépends, mais alors comment spécifier 2 chemins de action Helper dans le fichier ini ?


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#14 31-07-2009 11:53:35

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Où placer mes variables répétitives

Code:

resources.frontcontroller.actionHelperPaths.Prefix_Controller_Action_Helper_ = APPLICATION_PATH '/../library/Prefix/Controller/Action/Helper'
resources.frontcontroller.actionHelperPaths.Prefix2_Controller_Action_Helper_ = APPLICATION_PATH '/controllers/Helper'

Quelque chose du style devrait faire l'affaire non ?

Hors ligne

 

#15 31-07-2009 13:18:10

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Néanmoins mon code ne marche toujours pas, peut être qu'il ne faut pas passer par un action helper mais un helper de vue??

Actuellement j'aimerai pouvoir afficher des variables de session directement dans une partie de mon layout une fois que l'utilisateur est authentifié. Cet affichage doit, bien entendu, se répéter sur toutes les pages (d'où le placement dans le layout).

Quelle est selon-vous la solution la plus judicieuse dans le cas présent ?


aka miboo

Hors ligne

 

#16 31-07-2009 13:57:42

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Où placer mes variables répétitives

Code:

//Dans un controller (un init pourquoi pas)
$this->_helper->layout()->taVariable = "ta donnee";

Code:

//Dans ton layout
echo $this->taVariable

Non ?

Hors ligne

 

#17 31-07-2009 14:34:55

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Où placer mes variables répétitives

Je n'y arrive pas non plus

Code:

<?php
class My_Controller_Action_Helper_Init extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch() {
        $controller = $this->getActionController();
        $controller->test = "hello";
    }

D'après le tuto de philippe, je peux récuperer la valeur de test dans tous mes controllers.

Code:

public function indexAction()
{
    echo $this->test;
}

Dernière modification par alien7 (31-07-2009 14:36:58)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#18 31-07-2009 14:41:54

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Où placer mes variables répétitives

Es-tu certain que le helper est bien enregistré auprès du HelperBroker et qu'il est traité ? Ce code devrait fonctionner (avec indexAction et non pas indesAction mais je suppose que c'est une erreur de frappe sur le fofo :p)

Écris une trace dans le helper pour en être certain.

Code:

$this->_actionController->maVariable = 'ma valeur';

Ce code fonctionne c'est sûr smile

De même que:

Code:

$this->_actionController->view->maVariable = 'ma valeur';

A+ benjamin.

Dernière modification par Delprog (31-07-2009 14:42:22)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#19 31-07-2009 14:51:06

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Où placer mes variables répétitives

Es-tu certain que le helper est bien enregistré auprès du HelperBroker et qu'il est traité ?

Bah on l'enregistre comme ca ?

Code:

resources.frontController.actionhelperpaths.My_Controller_Action_Helper = APP_PATH "/controllers/Helpers"

En tout cas le chemin est correcte car j'ai vérifié comme ceci :

Code:

class My_Controller_Action_Helper_Init extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch() {
        $controller = $this->getActionController();
        $controller->action2 = "hello";
    }

    public function direct() {
        $controller = $this->getActionController();
        return $controller->action2 = "hello";
    }
}

et dans mon action j'appel le helper $this->_helper->init(); et là je peux récuperrer la valeur de test.

J'ai lu aussi ca :
http://devzone.zend.com/article/3350

preDispatch(): called after plugin preDispatch() routines, but prior to the action controller preDispatch() routines -- but only if an instance of the helper already exists in the broker.

Il a l'air de dire la meme chose que toi non ?

Dernière modification par alien7 (31-07-2009 14:53:26)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#20 31-07-2009 16:03:20

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Mr.MoOx a écrit:

Code:

//Dans un controller (un init pourquoi pas)
$this->_helper->layout()->taVariable = "ta donnee";

Code:

//Dans ton layout
echo $this->taVariable

Non ?

Rien ne s'affiche...

Pour être plus précis j'ai dans mon layout un "echo $this->render('header.phtml');" dans lequel j'aimerai indiquer des informations sur l'utilisateur et une option de déconnexion.

Pour l'option de déconnexion pas de problème mais pour les informations de l'utilisateur (récupérées dans mon controller d'authentification et stockées en session) je bloque.


aka miboo

Hors ligne

 

#21 31-07-2009 16:35:44

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Où placer mes variables répétitives

@Vincent:
Pour ton header tu devrais regarder du côté des ActionStack(), ça permet de déclencher des actions de controlleurs empilées.

Par ex. dans un de mes projet, j'ai dans la partie de droite du layout, soit un formulaire qui apparait, soit un espace-perso, selon si l'internaute est identifié ou non. Pour ça je fais appel au controlleur d'un module Auth() qui rend une vue ou une autre (formulaire ou espace-perso) en fonction de Zend_Auth::hasIdentity().

Donc en gros, je veux voir la page index de mon site, donc j'appelle mon controlleur IndexController du module par défaut, mais dans ce controlleur, ou dans le layout (ou dans un helper :p) je stack systématiquement l'action de mon module Auth qui contrôle l'état de mon user et qui rend sa propre vue au sein du layout.

Je crois que Julien Pauli avait fait un tuto qui en parle un peu (celui sur les layouts), et la doc de zend en parle aussi. Je n'ai pas trop le temps de rentrer plus dans les détails là, commence à fouiller, i'll be back smile


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#22 31-07-2009 16:37:05

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: Où placer mes variables répétitives

Ok je vais regarder. Ton exemple correspond bien à ce que je veux faire smile
Thx


aka miboo

Hors ligne

 

#23 31-07-2009 17:04:58

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Où placer mes variables répétitives

Attention les actions stacks ca devient lourd. Le dispatching de plusieurs actions fait perdre un peu de temps. Je préfère utilisé un plugin puis rendu dans layout pour gérér ce genre de partie dans le header.

Hors ligne

 

#24 31-07-2009 19:45:57

Cidrolin
Membre
Date d'inscription: 21-08-2008
Messages: 74

Re: Où placer mes variables répétitives

Salut,

pour les données générales (identifiant utilisateur, etc.) moi j'initialise tout dans un plugin appelé setup., qui se charge de vérifier si l'utilisateur est authentifié, etc. et en fonction de ça transmet les variables correspondantes au layout.

Hors ligne

 

#25 31-07-2009 21:06:26

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Où placer mes variables répétitives

Julien dit qu'il faut instancier le Helper d'action dans le Bootstrap
http://julien-pauli.developpez.com/tuto … age_1#LI-D

"Ajouter un chemin ou un préfixe ne fait que dire au gestionnaire où se trouvent les classes d'aide, il ne va pas les instancier."
Et moi justement j'utilise Zend_Controller_Action_HelperBroker::addPath(APP_PATH."/controllers/helpers", 'My_Controller_Action_Helper');.
Du coup avec ca je n'arrive pas à instancier mon Helper.
De plus mon helper je l'ai rangé dans controllers/helpers qui ne se trouve pas dans le include path, donc comment instancier mon helper ?




Vincent ->
J'aurai peut etre du crée un nouveau topic non ? Je crois que je gene dans celui là.




Edit :
C'est bon j'ai trouvé :

Code:

Zend_Controller_Action_HelperBroker::getStaticHelper('MonHelper');

getStaticHelper -> Retrieve or initialize a helper statically

Dernière modification par alien7 (31-07-2009 21:38:32)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

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