Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je continue ma progression avec cette outils merveilleux, que dis-je, fabuleux qu'est le zend framework.
Seulement voilà, bien qu'ayant compris le fonctionnement des plugins et helpers, je me demandais comment savoir dans quel cas les utiliser.
kitpage a écrit:
Les plugins sont principalement destinés à gérer les problèmes de routage.
Les helpers sont utilisés pour tous les traitements que vous seriez tentés de recopier dans toutes vos actions.
Je dois bien avouer que ces 2 phrases sont un peu obscure pour moi
si j'interprete bien, dès que j'ai une redirection, j'utilise un plugin (donc pour de l'authentification et compagnie) et sinon un helper ?
par exemple je veux faire une fonction m'affichant ou non un lien suivant les droits d'acces d'un user, donc j'aurai dans mes vues quelque choses comme
$this->authorize('mon lien vers machin');
pour ça je dois créer un helper ou un plugin ?
même choses pour afficher les stats SQL, pour le moment j'ai fait un plugin pour pouvoir afficher dans mes vues un $this->debug, qui lui m'affiche le nombre de requètes ainsi que le temps d'exécution. Est-ce correct de faire ça via un plugin ou c'est un helper que j'aurais du faire ?
Merci de m'éclairer, ça me fera prendre de bonnes habitudes dès le départ
Dernière modification par Asfaloth (25-06-2008 14:38:03)
Hors ligne
Pour moi qui ai un codé quelque helpers et plugins je dirais cela:
Les plugins sont fait pour des traitements répétitifs sur les "pages" du site (comme les routes, dit dans ton post et sur le tuto de philippe).
Les helpers sont des "aides" ( ) que l'on appelle explicitement quand on en a besoin (que ce soit des aides de controller comme des messagers, ou des aides de vue comme des générateurs d'html)
Pra contre pour ce qui est de tes liens, le problème c'est que la vue ne fait qu'afficher, elle ne doit pas savoir si x à accès à la ressource y.
Perso pour ce genre de problématique j'ai un traitement au niveau controller, puis un affichage simple dans la vue si le controller a instancié une variable (genre $this->view->newsCanBeEdited )
Sur le coup donc je dirais un helper d'action (controller_action_helper).
Pour tes stats sql par contre vu que c'est quelque chose de récurent dans toutes tes pages, je dirais un coup de plugin pour le calcul etc + un view helper pour l'affichage.
J'espère t'avoir pas trop embrouillé
Hors ligne
Bonjour Asfaloth,
Il n'y a pas de réponse toute faite, à chaque fois que j'ai un traitement à effectuer sur toutes les pages, je me demande s'il faut le mettre dans un plugin ou un helper.
Cela dit, la différence vient d'une différence technique très importante entre les plugins et les helpers :
- dans un plugin on n'a pas accès au contrôleur qui sera appelé (il n'est pas encore instancié, et même pas encore définitivement choisi)
- dans un helper, on connaît de façon certaine le contrôleur et l'action appelés et tu peux interagir avec eux
Dans ton cas, j'aurais tendance à mettre le traitement dans un helper pour les raisons suivantes :
- tu peux regarder dans quel contrôleur/action tu es et ne faire le traitement que dans les bons cas
- tu peux injecter les données dans le controlleur (parce qu'il est accessible depuis le helper).
Mais bon tu peux faire l'un ou l'autre, dans les deux cas, ça ne sera pas une erreur majeure
A+, Philippe
Hors ligne
Merci à vous deux pour les réponses, je commence à y voir plus clair
Donc pour ce que j'aimerais faire, est-ce une erreur de conception si je veux respecter le MVC ?
Je pensais qu'avec une méthode comme celle que j'avais en tête, le contrôle se faisait au niveaux du helper et non dans la vue
Celà voudrais-t-il dire que je dois faire le controle d'authorisation des liens dans chaque controller ? (Bon ok c'est vrai que je l'ai fait pour mon menu principal, car ce n'est jamais qu'une loooongue liste de liens) Celà me semble un peut répétitif comme méthode...
A moins que mon Helper au lieu de l'appeler dans la vue je l'appel dans les controller ? Ce qui me donnerais dans mon controller un truc dans le genre ?
$this->view->lien = $this->authorize('mon lien vers machin 1'); $this->view->lien2 = $this->authorize('mon lien vers machin 2');
philippe a écrit:
- dans un plugin on n'a pas accès au contrôleur qui sera appelé (il n'est pas encore instancié, et même pas encore définitivement choisi)
Alors là par contre je comprend plus trop, vu qu'on a le "$this->getRequest()->getController()" avec ça on sait quand même dans quel controller on se trouve non ?
Hors ligne
Asfaloth a écrit:
Alors là par contre je comprend plus trop, vu qu'on a le "$this->getRequest()->getController()" avec ça on sait quand même dans quel controller on se trouve non ?
En fait non, parce que ton plugin ou un autre plugin peut décider de changer de contrôleur : "$this->getRequest()->setController("titi")". Par exemple un plugin qui testerai les droits d'accès de ton site pourrait dire "ce gars là n'a pas accès à cette page, je vais le renvoyer sur tel contrôleur/action".
Sinon je ne comprends pas bien ton 1er point : si tu mets ton traitement dans un helper (pas un view helper, un helper classique), tu ne refais pas le traitement dans chaque contrôleur, tu ne le fais que dans ton helper. (ou bien je n'ai pas compris ton point).
A+, Philippe
Hors ligne
philippe a écrit:
En fait non, parce que ton plugin ou un autre plugin peut décider de changer de contrôleur : "$this->getRequest()->setController("titi")". Par exemple un plugin qui testerai les droits d'accès de ton site pourrait dire "ce gars là n'a pas accès à cette page, je vais le renvoyer sur tel contrôleur/action".
Ok on progresse, interressant ça, donc si par exemple j'avais un plugin qui me donne acces à un lien parce que je suis sur tel controller, mais qu'un plugin suivant me redirige, je me retrouverais avec une action autorisée à un endroit ou elle ne peut l'être. Ce qui n'arriverais pas avec les helpers car lorque ceux-ci entre en action nous sommes sur du controlleur sur lequel on se trouve...
philippe a écrit:
Sinon je ne comprends pas bien ton 1er point : si tu mets ton traitement dans un helper (pas un view helper, un helper classique), tu ne refais pas le traitement dans chaque contrôleur, tu ne le fais que dans ton helper. (ou bien je n'ai pas compris ton point).
Je vai essayer de résumé mon raisonnement. Pour sécurisé mon application, j'ai pris la direction suivante pour mon acl:
ressource = 'module_controller'
privilege = 'action'
Ce qui me permet assez aisément de vérifier les droits quand je crée ma navigation ainsi que l'acces aux controllers (toutes critiques constructive est évidemment la bienvenue).
Outre ma navigation principale (qui elle est gérée dans un controller), j'ai quelques liens perdu dans mes pages (les classiques quoi, éditions, détails,...) et j'aimerais créer une fonction pour vérifier les droits à l'affichage de ces lien.
Ma question est-donc la suivante, si je crée un helper pour géré ça, dois-je l'appeler dans la vue ou dans le controller ?
Question subsidiaire
Quelqu'un à une définition simple de la différence entre un viewhelper et un helper ? Parce que la doc reste assez obscur pour moi et je n'arrive pas trop à différencier les deux...
Un grand merci pour le suivis en tout cas
Hors ligne
un "controller helper" et un "view helper" n'ont rien à voir :
- le view helper, c'est une petite moulinette que tu appelles dans ta vue et qui permet de faire des traitements directement associés à ta vue.
- un "controller helper" c'est un truc que tu n'appelles pas, il est appelé automatiquement pendant le rendu de ta page (un peu comme un plugin mais à d'autres moments). (cf http://www.kitpages.fr/zf_helper_plugin.php)
dans les messages précédents, je ne te parles que de "controller helper". Tu n'as donc pas à les appeler, ils sont appelés à chaque page de façon automatique (donc non, tu ne fais pas le même traitement dans chaque contrôleur).
Ce que tu peux faire dans ce helper, c'est déterminer les liens à afficher et les envoyer à ta vue. Ensuite ta vue fait une boucle sur le tableau et affiche comme elle le souhaite le menu.
A+, Philippe
Hors ligne
ok je vois. enfin oui mais non
Ici ce que tu me conseille de faire si je comprend bien c'est un helper qui contient tout mes liens ?
Sauf que moi (oui le chieur au fond à droite, voilà c'est moi) j'ai fait une liste de matériel sur un site. Chaque matos possède des attributs techniques qui lui sont propre (adresse ip, port de gestion, etc). La liste de ces info doit être visible par un role, et éditable par un autre...
Donc, le controle pour l'affichage (ou non) de ce lien dans ma vue, est-ce que le controle doit ce faire au niveaux du controler, ou de la vue ? Le tout par l'intermédiaire d'un helper histoire de pas se retappé tout le code (comment ça fénéant, meuh non, programmeur, c'est pas la même chose (enfin quoi que...))
Hors ligne
ah ok, je pensais que tu parlais d'une barre de navigation qu'il fallait mettre sur toutes les pages... Là le problème n'est pas le même...
En théorie, le contrôleur devrait envoyer à la vue la liste des produits et pour chaque produit la liste des boutons à afficher (en fonction des droits). Ensuite tu parcours le tableau pour tout afficher comme il faut...
Hum... dans les faits, j'utilise plutôt les viewHelpers (enfin des plugins smarty dans mon cas, mais ça revient au même...), mais ça n'est pas vraiment recommandé par les manuels, on mélange un peu traitement et affichage...
A+, Philippe
Hors ligne
Oui oui j'ai regardé et j'utilise
en fait ce que j'aurais aimé c'est avoir une fonction qui automatise un peu le isAllowed des acl suivant l'utilisation que j'en fait.
Donc comme mes ressources et privilèges correspondent à des éléments du lien, ce que j'aimerais c'est une fonction qui me crée un lien, qui suivant ce lien vérifie avec isAllowed et compagnie si elle peut afficher ce lien et qui me retourne la chaine correspondante.
Créer cette fonction n'est pas le problème, ce que j'aurais aimer savoir si cette fonction je devais l'appeler dans mon controller ou dans la vue (en sachant que j'aimerais respecter au mieux le concept de MVC).
C'est la seule inconnue qu'il me reste, la première étant de savoir si cette fonction devait être dans un plugin ou un helper, et philippe m'a très aimablement fournis la réponse
Merci (et désolé si je suis pas super clair, ça fait à peine un mois que je développe activement avec le ZF, et j'essaye de prendre de bonnes habitudes dès le départ )
Hors ligne
'aurais aimer savoir si cette fonction je devais l'appeler dans mon controller ou dans la vue (en sachant que j'aimerais respecter au mieux le concept de MVC)
Pas de traitements métier dans la vue.
Voilà l'autre partie de ta réponse
Merci (et désolé si je suis pas super clair, ça fait à peine un mois que je développe activement avec le ZF, et j'essaye de prendre de bonnes habitudes dès le départ )
Y'a pas de soucis, on est tous passé par là
Hors ligne
Youhouu, on en est venu à bout
Un grand merci à vous deux en tout cas !!
Maintenant reste à le développer, mais là c'est plus trop un problème car comme dit le proverbe:
Ce qui s'énonce clairement, se conçoit aisément
Hors ligne
Ce débat m'a donné envie d'écrire un atelier xD
Ya d'ailleurs de très bons sujets sur la devzone concernant ceci, je vais donc les traduire pour en faire profiter tout le monde, ca sort début Juillet sur mon espace Développez (en théorie) :-)
Hors ligne
Asfaloth a écrit:
par exemple je veux faire une fonction m'affichant ou non un lien suivant les droits d'acces d'un user, donc j'aurai dans mes vues quelque choses comme
Code:
$this->authorize('mon lien vers machin');pour ça je dois créer un helper ou un plugin ?
J'ai codé un helper pour ça :
<?php class Zend_View_Helper_Link { function Link($request,$name) { $auth = Zend_Auth::getInstance(); $acl = Zend_Registry::get('ACL'); $url_helper = new Zend_View_Helper_Url(); if ($auth->hasIdentity() && $acl->isAllowed($auth->getIdentity()->role, $request['controller'], $request['action'])) { return '<span class="links"><a href="'.$url_helper->url($request).'" >'.$name.'</a></span>'; } } }
A placer dans views/helper/link.php
Dans ta vue , tu fais :
echo $this->Link(array('action'=>'nomAction', 'controller'=>'nomController'), "Libellé du lien");
Et hop, le lien s'affiche pour pour ceux qui sont autorisés à acceder à la page pointée par le lien (pour une archi sans modules, sinon faut bidouiller un peu).
Hors ligne
La possibilité que tu donnes ne va pas à l'encontre du concept MVC?
Mr.MoOx a écrit:
'aurais aimer savoir si cette fonction je devais l'appeler dans mon controller ou dans la vue (en sachant que j'aimerais respecter au mieux le concept de MVC)
Pas de traitements métier dans la vue.
Voilà l'autre partie de ta réponse
Hors ligne
Pages: 1