Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
Hors ligne
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.
Hors ligne
Merci Delprog, de venir à mon secours si souvent
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
Hors ligne
Quand tu dis plugin de controller tu penses : "Un peu comme s'il éxistait des plugins de controlleurs d'action" ?
Pour déclarer le dossier des helpers avec les préfix:
resources.frontcontroller.actionhelperpaths.Tight_Controller_Action_Helper_ = APPLICATION_PATH '/../library/Tight/Controller/Action/Helper'
Ou ailleurs si tu préfères
A+
Dernière modification par Delprog (30-07-2009 15:37:55)
Hors ligne
Pour les variables redondantes, j'utilise un helper d'action :
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 :
$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 :
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é
Dernière modification par ALkyD (30-07-2009 15:41:49)
Hors ligne
Merci pour la ligne.
Quand je dis plugin, je pense à quelque chose :
class My_Plugin_xxx extends Zend_Controller_Plugin_Abstract
Hors ligne
Ok, alors non c'est pas la même chose
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
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+
Hors ligne
Ce lien est pas mal non plus : http://www.kitpages.fr/zf_helper_plugin.php
Hors ligne
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 ?
Hors ligne
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
Hors ligne
Oui effectivement tu as raison, c'est plus logique, je corrige mon exemple
Hors ligne
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
Hors ligne
Oui effectivement tout dépends, mais alors comment spécifier 2 chemins de action Helper dans le fichier ini ?
Hors ligne
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
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 ?
Hors ligne
Je n'y arrive pas non plus
<?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.
public function indexAction() { echo $this->test; }
Dernière modification par alien7 (31-07-2009 14:36:58)
Hors ligne
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.
$this->_actionController->maVariable = 'ma valeur';
Ce code fonctionne c'est sûr
De même que:
$this->_actionController->view->maVariable = 'ma valeur';
A+ benjamin.
Dernière modification par Delprog (31-07-2009 14:42:22)
Hors ligne
Es-tu certain que le helper est bien enregistré auprès du HelperBroker et qu'il est traité ?
Bah on l'enregistre comme ca ?
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 :
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)
Hors ligne
Mr.MoOx a écrit:
Code:
//Dans un controller (un init pourquoi pas) $this->_helper->layout()->taVariable = "ta donnee";Code:
//Dans ton layout echo $this->taVariableNon ?
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.
Hors ligne
@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
A+ benjamin.
Hors ligne
Ok je vais regarder. Ton exemple correspond bien à ce que je veux faire
Thx
Hors ligne
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
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
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é :
Zend_Controller_Action_HelperBroker::getStaticHelper('MonHelper');
getStaticHelper -> Retrieve or initialize a helper statically
Dernière modification par alien7 (31-07-2009 21:38:32)
Hors ligne