Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-03-2012 16:20:21

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

ZF2 & view helper

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 smile

Hors ligne

 

#2 28-03-2012 19:39:11

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: ZF2 & view helper

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

 

#3 28-03-2012 20:23:54

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 & view helper

Merci Bakura, en fait ça je l'avais trouvé smile. 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 smile.

Hors ligne

 

#4 28-03-2012 23:36:17

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: ZF2 & view helper

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 :

Code:

'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 :

Code:

'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 :

Code:

'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) :

Code:

'Zend\View\HelperLoader' => array(
    'parameters' => array(
        'map' => array(
            'monAideDeVue' => 'Nom\Aide\De\Vue'
        )
    )
)

Hors ligne

 

#5 29-03-2012 10:12:49

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 & view helper

Super explication, ça m'a permis de comprendre plein de choses big_smile.

Et du coup j'ai pu voir que mes aides de vue n'implémentaient pas la classe AbstractHelper smile

Hors ligne

 

#6 29-03-2012 10:23:34

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: ZF2 & view helper

Avec plaisir big_smile.

Hors ligne

 

#7 21-06-2012 13:52:32

lodotbe
Membre
Date d'inscription: 21-06-2012
Messages: 14

Re: ZF2 & view helper

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

Code:

<?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

Code:

    
'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

Code:

echo $this->test();

Hors ligne

 

#8 21-06-2012 14:07:59

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 & view helper

Salut, je viens de regarder mon application et je n'ai pas trouvé ce bout de code (avant beta 4) :

Code:

[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 :

Code:

[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 wink

Hors ligne

 

#9 21-06-2012 15:50:51

lodotbe
Membre
Date d'inscription: 21-06-2012
Messages: 14

Re: ZF2 & view helper

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
smile

Hors ligne

 

#10 21-06-2012 16:12:53

lodotbe
Membre
Date d'inscription: 21-06-2012
Messages: 14

Re: ZF2 & view helper

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

 

#11 21-06-2012 16:37:16

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 & view helper

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

 

#12 25-06-2012 16:54:44

amoiraud
Membre
Date d'inscription: 21-06-2012
Messages: 10

Re: ZF2 & view helper

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 :

Code:

[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 :

Code:

[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 ? sad

Dernière modification par amoiraud (25-06-2012 16:55:21)

Hors ligne

 

#13 25-06-2012 18:21:16

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: ZF2 & view helper

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

 

#14 26-06-2012 09:12:08

amoiraud
Membre
Date d'inscription: 21-06-2012
Messages: 10

Re: ZF2 & view helper

Arf c'est tout moi ca je lit tout sauf le post important ^^
Merci bien wink

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