Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-02-2011 11:33:45

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

[Resolu]Probleme de helper

Bonjour,

J'ai un problème avec une aide de vues. En bref, elle fonctionne parfaitement sauf lorsque je rajoute ça dans le bootstrap :

Code:

 protected function _initNavigation()
        {
            $this->bootstrap('layout');
            $layout = $this->getResource('layout');
            $view = $layout->getView();
            $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
            $navigation = new Zend_Navigation($config);
            $view->navigation($navigation);
        }

Dès que j'ajoute ce bout de code au bootstrap j'ai

Code:

Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 
'Plugin by name 'XXXX' was not found in the registry

Voici le code de mon helper, un peu rétrécis pour le forum :

Code:

class Zend_View_Helper_LoggedUser
{
    protected $_view;

    function setView($view)
    {
            $this->_view = $view;
    }
        function XXXX()
    {
            
        }
}

Pouvez vous m'aider? merci

Dernière modification par Rafalfa (10-02-2011 16:13:14)

Hors ligne

 

#2 07-02-2011 14:21:03

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

Re: [Resolu]Probleme de helper

personne?

Hors ligne

 

#3 07-02-2011 14:23:33

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

Re: [Resolu]Probleme de helper

Salut,

En fait il n'y a aucun rapport entre l'initialisation du layout et les aides de vues.

Pour les aides de vues il y a différents cas :

1/ Application classique (non modulaire)

Ta vue doit se trouver dans le dossier application/views/helpers/ et la classe doit être :

Code:

class Zend_View_Helper_AwesomeHelper extends Zend_View_Helper_Abstract
{
    public function awesomeHelper()
    {
    }
}

2/ Application modulaire

Si ton application est modulaire, c'est à dire que tu as une arbo. du type (simplifiée) :

application/
    modules/
        default/
            controllers/
            views/
                helpers/
                scripts/
        autreModule/

Alors les classes des aides de vues doivent être dans le même namespace que ton module. Je m'explique : si tu veux ajouter par exemple une aide de vue "AwesomeHelper" dans le module default, son fichier sera : application/modules/default/views/helpers/AwesomeHelper.php et la classe sera :

Code:

class Default_View_Helper_AwesomeHelper extends Zend_View_Helper_Abstract
{
    public function awesomeHelper()
    {
    }
}

Le namespace ici "Default" doit être remplacé par le nom du module (en CamelCase), sauf si tu as redéfinis le namespace dans le bootstrap du module (mais je ne pense pas).

Donc si ton aide de vue se trouvait dans "application/modules/autreModule/views/helpers/AwesomeHelper.php", le nom de la classe serait : AutreModule_View_Helper_AwesomeHelper


3/ Helper dans une librairie Tiers

Dans ce cas là les étapes à suivre sont :
[*] S'assurer que ton dossier librairie soit dans l'include_path.
[*] Enregistrer le namespace dans application.ini, exemple : autoloaderNamespaces[] = "My_"
[*] Créer le helper dans library/My/View/Helper/AwesomeHelper.php et nommer la classe : My_View_Helper_AwesomeHelper
[*] Ajouter le chemin vers les aides à la ressource view dans application.ini : resources.view.helperPath.My_View_Helper_ = "My/View/Helper"


Ensuite, tu n'as rien d'autre à faire, tu pourras invoquer l'aide directement via $this->awesomeHelper() depuis une vue.


Sinon, quelques indications par rapport au code que tu nous montres :

[*] Ton aide de vue doit étendre Zend_View_Helper_Abstract
[*] L'objet view utilise le pattern Strategy pour accéder à ton aide de façon magique. Pour que ça fonctionne ta classe doit implémenter une méthode public qui porte le nom de l'aide de vue (qui commence par une minuscule).


Tout ceci est détaillé ici : http://framework.zend.com/manual/fr/zen … ers.custom


Sinon, attention de ne pas créer plusieurs fois le même topic, ça ne te donnera pas plus de chances d'avoir des réponses. Il faut aussi avoir un peu de patience, écrire une réponse prend du temps 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

 

#4 07-02-2011 14:42:48

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

Re: [Resolu]Probleme de helper

D'abord merci pour cette réponse complète ! Je suis ennuyer car je t'assure que le problème de chargement du helper ne ce pose plus dès lors que j'enlève le morceau de code (cité plus haut) du bootstrap.

Mon namespace est configuré sur : 'namespace' => 'Application' dans le bootstrap

Je travail sur une application non modulaire.

application/views/helpers/LoggedUser.php


Code:

<?php
class Zend_View_Helper_LoggedUser extends Zend_View_Helper_Abstract
{
    protected $_view;

    function setView($view)
    {
            $this->_view = $view;
    }
        function loggedUser()
    {
            $auth = Zend_Auth::getInstance();
                if($auth->hasIdentity())
                {
                        //création du lien logout à partir de l'aide de vue url
                        $logoutUrl = $this->_view->url(array('controller' =>'index', 'action' => 'logout'), 'default', true);
                        //récupère l'identité de l'utilisateur
                        $user = $auth->getIdentity();
                        $userfirstname = $this->_view->escape($user->user_firstname);
                        $userlastname = $this->_view->escape($user->user_lastname);
                        //chaine qui sera affichée si l'utilisateur est connecté
                        $date = new Zend_Date();
                        $link = $userfirstname.' '.$userlastname.' | <a href="'.$logoutUrl.'">Se déconnecter</a> | <em>'.$date->toString('dd MMMM yyyy').'</em>';
                }
                else
                {
                        //création du lien login à partir de l'aide de vue url
                        $loginUrl = $this->_view->url(array('controller' => 'index', 'action' => 'login'), null, true);
                        //chaine qui sera affichée si l'utilisateur n'est pas connecté
                        $date = new Zend_Date();
                        $link = $date->toString('dd MMMM yyyy').' | '.'<a href="'.$loginUrl.'">Se connecter</a>';
                }

                return $link;
            }
}

?>

application/layouts/scripts/layout.phtml

Code:

<?php echo $this->loggedUser(); ?>

Et ça ne fonctionne pas, je suis un peu a court d'idée...

j'en profile pour demander à quoi sert la ligne $view = $layout->getView(); dans le bootstrap?

l'erreur :

Code:

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'LoggedUser' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/' in /opt/zend/share/ZendFramework/library/Zend/Loader/PluginLoader.php:412 Stack trace: #0 /opt/zend/share/ZendFramework/library/Zend/View/Abstract.php(1174): Zend_Loader_PluginLoader->load('LoggedUser') #1 /opt/zend/share/ZendFramework/library/Zend/View/Abstract.php(610): Zend_View_Abstract->_getPlugin('helper', 'loggedUser') #2 /opt/zend/share/ZendFramework/library/Zend/View/Abstract.php(336): Zend_View_Abstract->getHelper('loggedUser') #3 /opt/zend/apache2/htdocs/servicheque/rde/application/layouts/scripts/layout.phtml(33): Zend_View_Abstract->__call('loggedUser', Array) #4 /opt/zend/apache2/htdocs/servicheque/rde/application/layouts/scripts/layout.phtml(33): Zend_View->loggedUser() #5 /opt/zend/share/ZendFramework/library/Zend/View.php(108): include('/opt/zend/apach...') #6 /opt/zend/share/ZendFramework/library/Ze in /opt/zend/share/ZendFramework/library/Zend/Loader/PluginLoader.php on line 412

Dernière modification par Rafalfa (07-02-2011 14:59:24)

Hors ligne

 

#5 08-02-2011 00:10:38

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

Re: [Resolu]Probleme de helper

Salut,

Ton namespace est "Application", or tu appelles ta classe Zend_View_Helper_LoggedUser, c'est sûr qu'il le trouvera pas wink. Comme tu l'as corrigé, il faut bien que l'aide de vue étende de la classe Zend_View_Helper_Abstract, par contre.

Il faut que tu l'appelles Application_View_Helper_LoggedUser, et qu'il soit évidemment placé dans le bon dossier (sur une application non modulaire, comme l'a signalé Delprog), dans "application/views/helpers"

Sinon, n'oublie pas d'ajouter la visibilité dans tes functions (public, protected, private). Effecitvmeent si tu ne spécifies rien tes méthodes seront public par défaut, mais autant le préciser, c'est toujours plus clair et ça te permet de te forcer à te demander si ta méthode doit être public ou privée.

Il faut ensuite que tu enregistres le chemin de tes aides de vue dans ton fichier de configuration. En YAML (le format que j'utilise pour les fichiers de configuration, plus propre que du ini je trouve), ça donne ceci :

Code:

view:
      encoding: UTF-8
      helperPath:
        Application_View_Helper: APPLICATION_PATH/views/helpers

Comme tu le vois, on ajoute la clé helperPath, qui est un tableau contenant les différents chemins. Ainsi, lorsqu'il rencontrera une aide de vue qui commencera par Application_View_Helper, il ira chercher dans le dossier APPLICATION_PATH/views/helpers (il faut évidemment que la constante APPLICATION_PATH ait été bien définie, normaelmetn dans ton ficheir index.php de ton dossier public, créé automatiquement par Zend_Tool).

Si tu as des aides de vue dans d'autres dossiers (et donc d'autres préfixes), tu peux les ajouter à la suite, ça marchera tout seul.

Si tu utilises les fichiers ini, ça donnera sûrement :

Code:

view.helperPath.Application_View_Helper = APPLICATION_PATH "/views/helpers"

Ce qui est étonnant (enfin, ça ne l'est sûrement pas), c'est que ça arrive à marcher quand tu supprimes le bout de code u_u.

EDIT : si ça ne marche toujours pas, essaye ça :

Code:

protected function _initNavigation()
        {
            $this->bootstrap('layout');
            $this->bootstrap('View'); // <----- ICI !
            $layout = $this->getResource('layout');
            $view = $layout->getView();
            $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
            $navigation = new Zend_Navigation($config);
            $view->navigation($navigation);
        }

Dernière modification par bakura (08-02-2011 00:12:32)

Hors ligne

 

#6 08-02-2011 09:10:04

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

Re: [Resolu]Probleme de helper

Merci Bakura ! Cela fonctionne, j'ai ajouté

application.ini

Code:

resources.view.helperPath.Application_View_Helper = APPLICATION_PATH "/views/helpers"

bootstrap

Code:

 protected function _initNavigation()
        {
            $this->bootstrap('layout');
            $this->bootstrap('View');
            $layout = $this->getResource('layout');
            $view = $layout->getView();
            $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
            $navigation = new Zend_Navigation($config);
            $view->navigation($navigation);
        }

et le nom de mon helper avec Application.

Cependant, je ne m'explique pas pourquoi cela fonctionnait avant sans tous cela...

_______________________________________________________________________________


Comme je tiens quelques "experts" j'en profite pour quelques question d'ordres générales:

1 - Pour éviter de ce connecter à la database, à chaque fois qu'on l'on à besoins d'une requête, quel est la procédure? (j'ai trouvé 1000 versions, j'aimerai connaitre une version fiable). Pour le moment j'ai

application.ini

Code:

resources.db.isDefaultTableAdapter = true

Mais cela ne me permet pas de me connecté de n'importe ou? Que faut-il déclaré dans les page ou je souhaite me connecter?

SOLUTION 1 :La solution passe par les Zend_registry pour ceux qui auraient éventuellement le mémé problème.

2 - Dans le cas de figure ou une requête nécessite des jointures avec plusieurs tables, doivent-elle se trouver dans les modèles localisé dans application/models/DbTable ou bien dans  application/models. Plus généralement, pourquoi utilisé DbTable si il ne sert qu'à la connexion vers une seul table?

3 - Pour l'autoload des ressources, quels sont les ressources implicite qui ne nécessite pas d'être déclarées?

Dans mon cas, il y a un éparpillement à la fois dans mon bootstrap :

Code:

 protected function _initAutoloadRessource()
    {
        $ressourceLoader = new Zend_Loader_Autoloader_Resource(array(
            'namespace' => 'Application',
            'basePath'  => dirname(__FILE__),
        ));

        $ressourceLoader->addResourceType('acl', 'acls/', 'Acl')
                                ->addResourceType('plugin', 'plugins/', 'Controller_Plugin')
                                ->addResourceType('form', 'forms/', 'Form')
                                ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');
                
        return $ressourceLoader;
    }

et à la fois dans application.ini :

Code:

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.view.helperPath.Application_View_Helper = APPLICATION_PATH "/views/helpers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

SOLUTION 3 : Seul les plugins et les acl sont a charger, les DbTable et les forms sont implicites.

4 - En ce qui concerne la navigation (menu), j'ai vu qu'on était possible de les géré suivant les ACL en dur dans le XML. Mon but est de les gérer dynamiquement, cela est-il possible avec Zend_navigation via XML ?

SOLUTION 4:La solution passe par Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role); pour ceux qui auraient éventuellement le mémé problème.

Merci beaucoup !

Dernière modification par Rafalfa (09-02-2011 09:08:32)

Hors ligne

 

#7 08-02-2011 17:35:57

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

Re: [Resolu]Probleme de helper

2 - Dans le cas de figure ou une requête nécessite des jointures avec plusieurs tables, doivent-elle se trouver dans les modèles localisé dans application/models/DbTable ou bien dans  application/models. Plus généralement, pourquoi utilisé DbTable si il ne sert qu'à la connexion vers une seul table?

Zend_Db_Table est principalement utile lorsque tu as une correspondance 1-1 entre ta représentation BDD et ton code. Dans ce cas là c'est très pratique car cela permet de faire la connexion très simplement, et représenter les relations entre les tables (mais pas des jointures).

Après, dès que tu dois effecter des jointures, Zend_Db_Table est pas très pratique à utiliser, il faut mieux se coder un petit ORM ou utiliser Doctrine (je travaille sur un ultra-mini-ORM pour me simplifier l'utilisation des jointures, je le développe toujours mais je ferai un post sur ce forum dès que j'en serai content).

3

Je sais pas trop... Mes plugins de controlleur je les ait toujours déclarées dans le fichier de configuration, par contre pour les ressources (acl...) je le fais dans le bootstrap.

Juste un truc : Zend a créé déjà plusieurs ressources que tu n'as pas à créer, notamment : les formulaires et les dbtable. Il faut, pour les formulaires, que tu mettes les fichiers dans un dossiers "forms" (n'oublie pas le s) du dossier "application". Pour les DbTable, il faut que tu mettes tes fichiers dans le dossier models/dbTables (là aussi, n'oublie pas le s).

Tu n'auras donc plus que àa :

$ressourceLoader->addResourceType('acl', 'acls/', 'Acl')
                                ->addResourceType('plugin', 'plugins/', 'Controller_Plugin');

Hors ligne

 

#8 09-02-2011 09:06:53

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

Re: [Resolu]Probleme de helper

Encore une fois, merci pour ces réponses à la fois claire.

Pour le point 3, j'ai fait comme tu a indiqué sauf que DbTable ne prend pas de "s" chez moi, sans quoi cela ne fonctionne pas.

Pour le point 2, si je fait des requete avec jointure dans un Model_DbTable cela serait donc complétement ridicule?

Cordialement !

Hors ligne

 

#9 09-02-2011 16:37:03

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

Re: [Resolu]Probleme de helper

Le soucis de la jointure, c'est que ça ne renvoit pas un Zend_Db_Table_Row mais un array. Ca marchera et on peut très bien s'en contenter, mais d'une les valeurs sont read-only (impossible de les modifier, et c'est normal puisque ta classe ne peut pas savoir quels champs appartiennent à tel ou tel classe), donc impossible de faire un save dessus par exemple.

Hors ligne

 

#10 10-02-2011 09:17:14

Rafalfa
Membre
Date d'inscription: 02-02-2011
Messages: 16

Re: [Resolu]Probleme de helper

merci pour tous.

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