Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour, je me tourne actuellement vers la mise en place de l'ihm de mon application web et je n'arrive pas à reproduire le fonctionnement similaire qu'il y avait sur ZF1.
En effet avec ZF1 il était possible de définir une classe définissant une aide de vue. Il était ensuite possible d'utiliser ces aides de vue directement dans le layout et/ou que l'on pouvait appeler directement dans nos fichier .phtml et les afficher de la façon suivant :
echo $this->nomDeLaideDeVue();
Comment peut on procéder pour avoir quelque chose de similaire dans ZF2 ? Je souhaite notamment faire ça pour les menus dynamiques, la partie entête de page qui en fonction des informations utilisateur sera différente, etc ...
Merci d'avance
Hors ligne
Si tu avais regardé le code source d'un aide de vue tu aurais trouvé tout seul ;-). Auparavant il fallait définir la méthode "direct" qui était appelée lorsque tu appelais ton aide de vue par son nom. C'était un peu du hack, honnêtement.
Maintenant, ZF2 utilise un mécanisme natif de PHP 5.3, à savoir la méthode magique __invoke, qui est appelée dès que tu te sers d'un objet comme une "fonction". Il te suffit donc de définir cette méthode dans ton aide de vue, et tu pourras faire $this->monAideDeVue() (ou $this->plugin('monAideDeVue') si tu veux avoir un code plus explicite).
Note également que si tu définis pas la méthode __invoke, tu auras l'objet de ton aide de vue, qui te permettra donc de faire $this->monAideDeVue->uneFonction.
Hors ligne
Merci Bakura, en fait ça je l'avais trouvé . C'est savoir comment tu peux l'appeler derrière qui pose problème. Puisque ZF2 ne le trouve pas tout seul. J'imagine que c'est dans le DI mais je n'arrive pas à comprendre comment .
Hors ligne
HA ! Effectivement c'est quelque part dans le Di... Il faut effectivement ajouter la référence à l'aide de vue dans le fichier Zend/View/HelperLoader.
En fait si tu comprends un peu comment ça fonctionne, tu peux t'en sortir. Si tu vas voir les sources de Zend\View\HelperLoader, tu remarqueras qu'il y a un tableau "plugins", et que cette classe hérite de PluginClassLoader. Donc direction la classe Zend\Loader\PluginClassLoader, et regarde le constructeur, qui prend un paramètre "map", de type array, qui est passé à la fonction registerPlugins.
Tu te dis donc que c'est ici qu'il va falloir que tu injectes avec le Di les références vers tes aides de vue.
Du coup, tu sais que dans ton fichier de config, tu auras grosso modo un truc qui va ressembler à ça :
'Zend\View\HelperLoader' => array( 'map' => array( 'monAideDeVue' => 'Nom\Aide\De\Vue' ) );
Comme c'est un paramètres que tu passes au constructeur, il faut ajouter la clé "parameters" (c'est comme ça que fonctionne l'injecteur de dépendances de Zend). Donc ça devient :
'Zend\View\HelperLoader' => array( 'parameters' => array( 'map' => array( 'monAideDeVue' => 'Nom\Aide\De\Vue' ) ) )
Ce code suffit et ça fonctionnera correctement. Si tu veux en savoir plus :
en fait, le gros avantage de ZF2 c'est qu'ils ont uniformisé toute la gestion des plugins. Avant, tu avais des "plugins d'action", des "aides d'action", des "aides de vue", et aucune ne fonctionnait de la même manière pour les enregistrer.
Maintenant, sous ZF 2, tu as les PluginLoader (comme Zend\View\HelperLoader pour les aides de vue, Zend\Mvc\Controller\PluginLoader pour les aides d'action/plugins d'actions, et ainsi de suite...). Toutes ces classes qui héritent de PluginLoader te disent, en gros, "à quelle classe correspond le nom du plugin"). Ces classes sont très simples et, la plupart du temps (tu peux voir les implémentations standard pour les aides de vue et les aides d'action), ne contiennent qu'un simple tableau associatif qui relie un nom à une classe.
A côté, tu as le PluginBroker qui, lui, va se charger d'utiliser ces loaders afin de créer et renvoyer les instances de ces plugins, et qui va dire "tiens, j'ai en paramètre ce nom, sauf que moi je sais à quelle classe ça correspond car mon loader contient un tableau associatif qui me relie ce nom à un nom de classe". Très logiquement, tu as une classe de base dans Zend\Loader\PluginBroker, de laquelle hérite les classes qui ont besoin de charger les plugins (tu as donc Zend\Mvc\Controller\PluginBroker et Zend\View\HelperBroker).
Encore une fois, en allant dans le code de PluginBroker (la classe de base, Zend\Loader\PluginBroker donc), tu t'aperçevras que son constructeur prend comme paramètres un tableau. Nous, ce qu'on souhaite initialiser dans cette classe, c'est la variable "classLoader" (afin de faire en sorte que le broker des plugins d'action utilise le loader des plugins d'action, que celui des aides de vue utilise le loader des aides de vue, et ainsi de suite....). Dans la fonction setOptions, tu remarques que la clé est "class_loader". Il te suffit donc de foutre dans ton Di :
'Zend\View\HelperBroker' => array( 'parameters' => array( 'class_loader' => 'Zend\View\HelperLoader' ) )
SAUF que par défaut, Zend assume que le loader du HelperBroker est Zend\View\HelperLoader, tu n'as donc pas besoin de le spécifier manuellement dans le Di (de la même manière, le PluginBroker pour les plugins d'action assume que le loader par défaut est Zend\Mvc\Controller\PluginLoader). Du coup, les lignes suivantes suffisent (mais c'était juste pour t'expliquer un peu comment ça fonctionne) :
'Zend\View\HelperLoader' => array( 'parameters' => array( 'map' => array( 'monAideDeVue' => 'Nom\Aide\De\Vue' ) ) )
Hors ligne
Super explication, ça m'a permis de comprendre plein de choses .
Et du coup j'ai pu voir que mes aides de vue n'implémentaient pas la classe AbstractHelper
Hors ligne
Avec plaisir .
Hors ligne
Version : ZF2.0.0 beta 4 (47723f076d91ccfd57a03fb71b1182c09aaa3538)
Bonjour,
Je relance ce post car, malgré tous mes efforts, je n'arrive pas à créer de helper de vue.
J'ai installé le squelette 'git' et suivi le tuto de Rob Allen (akrabat) puis j'ai créé un helper de test dans mon application mais j'ai toujours le message 'Unable to locate class associated with "test"'.
Par contre, quand je déplace mon helper dans \library\Zend\View\Helper, que j'adapte le namespace et que je l'ajoute dans le HelperLoader.php, ça fonctionne.
J'ai suivi ce poste (et bien d'autres) mais sans succès.
Je dois avoir loupé un truc, mais quoi?
Merci d'avance
Mon helper : module\Application\view\helper\Test.php
<?php namespace Application\View\Helper; use Zend\View\Helper\AbstractHelper; class Test extends AbstractHelper { protected $count = 0; public function __invoke() { $this->count++; $output = sprintf("TEST VIEW %d time(s).", $this->count); return htmlspecialchars($output, ENT_QUOTES, 'UTF-8'); } }
et un extrait de module.config.php
'di' => array( 'instance' => array( 'Zend\View\HelperLoader' => array( 'parameters' => array( 'map' => array( 'test' => '\Application\View\Helper\Test', ), ), ), 'Zend\View\HelperBroker' => array( 'parameters' => array( 'class_loader' => 'Zend\View\HelperLoader', ), ), ...
Et l'appel au helper, dans index.php de l'application
echo $this->test();
Hors ligne
Salut, je viens de regarder mon application et je n'ai pas trouvé ce bout de code (avant beta 4) :
[lang=php] 'Zend\View\HelperBroker' => array( 'parameters' => array( 'class_loader' => 'Zend\View\HelperLoader', ), ),
Donc à voir si ça vient de là.
Sinon pour la beta4, il faut maintenant utiliser le serviceManager ça devrait résoudre ton problème. Malheureusement mon application ne fonctionnant pas, car j'ai pas fini d'effectuer les migrations vers la beta4 par manque de temps, je ne peux pas t'assurer que cette solution va fonctionner :
Dans ton module.config.php :
[lang=php] return array( 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'index/index' => __DIR__ . '/../view/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', ), // Below is a helper map for the view helper loader 'helper_map' => array( 'Zend\Form\View\HelperLoader', // je ne sais pas trop à quoi ça sert et si c'est nécessaire ... peut être lié aux nouveaux formulaires ... 'test' => '\Application\View\Helper\Test', ), ), 'di' => array( ...),
Normalement tu n'as rien de plus, essai de voir comment sont fait les composants ZfcUser et compagnie sur Github, c'est de ça que je me suis inspiré pour configurer mes helpers. Comme je l'ai dit, c'est pas sûr que ça soit comme ça mais c'est peut être une piste
Hors ligne
Merci Orkin,
Il doit encore me manquer un truc car je retrouve des informations sur le helper_map qui concordent mais j'ai toujours la même erreur, liée au PluginBroker (alors que j'ai enlevé la DI).
... je continue à gratter
Hors ligne
Euhh ... bon ... autant pour moi!
Il faut mettre le répertoire du helper dans le répertoire src de l'appli et pas sous le répertoire de vue.
càd dans :
module\Application\src\Application\View\Helper\MonHelper.php
et pas dans :
module\Application\View\Helper\MonHelper.php
... en tout cas dans le cas de l'arborescence su squelette d'akrabat.
Encore merci pour ton aide!
Hors ligne
Ah oui j'ai pas pensé à te le dire mais c'est effectivement mieux comme ça ! Ton namespace ne correspondait pas du coup !
Hors ligne
Bon je relance ce post car je galère moi aussi avec mon view helper :
J'ai créé mon view helper comme indiqué dans scr/Module/View/Helper :
[lang=php]<?php namespace Test\View\Helper; use Zend\View\Helper\AbstractHelper; /** * @author Adrien * @version 22/06/2012 */ class GetCss extends AbstractHelper { protected $_rootPath; public function __invoke($userId) {
Dans le module.config.php de mon module j'ai :
[lang=php]'di' => array('instance' => array( 'Zend\View\HelperLoader' => array('parameters' => array( 'map' => array( 'getcss' => 'Test\View\Helper\GetCss', ), )), 'Zend\View\HelperBroker' => array( 'parameters' => array( 'class_loader' => 'Zend\View\HelperLoader', ), ), )),
Malheureusement quand j'essaye d'appeler le view helper j'ai l'erreur suivante :
object(Zend\Loader\Exception\RuntimeException)[181]
protected 'message' => string 'Unable to locate class associated with "getcss"' (length=47)
private 'string' (Exception) => string '' (length=0)
protected 'code' => int 0
protected 'file' => string 'C:\dev\www\zf2\vendor\zendframework\zendframework\library\Zend\Loader\PluginBroker.php' (length=86)
protected 'line' => int 213
Quelqu'un à une idée ?
Dernière modification par amoiraud (25-06-2012 16:55:21)
Hors ligne
Salut, il ne faut plus utiliser le DI, comme je l'ai mi dans mon post au dessus tu dois passer par le service manager. Je te laisse t'inspirer de ma précédente réponse.
Hors ligne
Arf c'est tout moi ca je lit tout sauf le post important ^^
Merci bien
Hors ligne