2009-11-25 10 views
7

J'ai un assistant appelé Zend_View_Helper_FormVars qui est utilisé par l'un de mes modules. J'ai aussi une aide commune à application/common/helpers/GeneralFunctions.phpZend Framework vue d'appel à partir d'un Zend_View_Helper

J'essaie d'appeler une fonction de Zend_View_Helper_FormVars qui est dans GeneralFunctions.php.

Voici la version courte de Zend_View_Helper_FormVars:

class Zend_View_Helper_FormVars 
{ 
    public $reqFieldVisual='<span class="req">*</span>'; 
    public $roles=array('admin'=>'admin', 'user'=>'user'); 
    public $paymentMethods=array('1'=>'Check', '2'=>'Credit Card', 
       '3'=>'Cash', '4'=>'Other'); 


    public function formVars(){ 
     $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); 
     return $this; 
    } 

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), 
     $codesArr=array()) { 
     $html=''; 
     $html.=Zend_View_Helper_GeneralFunctions::generalFunctions()->progressMeter(); 
     return $html; 
    } 
} 

Voici le code GeneralFunctions.php:

class Zend_View_Helper_GeneralFunctions 
{ 
    public function generalFunctions(){ 
     $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl(); 
     return $this; 
    } 

    public function progressMeter() { 
     $html=''; 
     $html.='<span id="progressWrapper">'; 
     $html.='<span id="progressMeter"></span>'; 
     $html.='</span>'; 
     $html.=''; 
     return $html; 
    } 
} 

En outre, oublié de mentionner que j'ai l'auto d'aide GeneralFunctions chargé dans le Bootstrap comme ceci et il est déjà disponible pour tous mes modules:

$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper'); 

Voici ce que j'ai essayé, mais je reçois une erreur:

// application/Bootstrap.php -----------> 
function _initViewHelpers() { 
    // add a helper for use for all modules 
    $view->addHelperPath(APPLICATION_PATH .'/Common/Helper', 'Common_Helper'); 
} 
//--------------------> 


// application/common/helpers/General.php -----------> 
class Zend_View_Helper_General extends Zend_View_Helper_Abstract 
{ 
    public function general(){ 
     return $this; 
    } 
    public function test(){ 
     return 'test 123'; 
    } 
} 
//--------------------> 

// application/modules/dashboard/views/helpers/DashboardHelper.php -----------> 
class Zend_View_Helper_DashboardHelper extends Common_Helper_General 
{ 

    public function dashboardHelper(){ 
     return $this; 
    } 

    public function dashboardTest(){ 
     return 'from dashboard'; 
    } 

} 
//--------------------> 

// application/modules/dashboard/views/scripts/index/index.phtml -----------> 
echo $this->dashboardHelper()->test(); 
//--------------------> 

message d'erreur que je reçois:

Fatal error: Class 'Common_Helper_General' not found in /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php on line 2

+0

Je recommande espaces de noms Voir Helpers avec votre propre préfixe et en ajoutant (non Zend!) le chemin d'aide pour cela. –

Répondre

13

Il est en fait très simple d'appeler un autre aide de vue.

Assurez-vous que votre assistant d'affichage étend Zend_View_Helper_Abstract, de sorte qu'il ait accès au $view. Ensuite, vous pouvez simplement appeler des aides comme vous le feriez d'une vue, à savoir

$this->view->generalFunctions()->progressMeter(); 

Sur la base de votre exemple ci-dessus:

<?php 

class Zend_View_Helper_FormVars extends Zend_View_Helper_Abstract { 

    /* ... */ 

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), 
     $codesArr=array()) { 
     $html=''; 
     $html. $this->view->generalFunctions()->progressMeter(); 
     return $html; 
    } 
} 
+0

Merci David. Cela a fonctionné aussi. Il semble y avoir tellement de façons de faire les choses avec le Zend Framework. Je l'aime, mais cela peut parfois prêter à confusion. – EricP

+0

L'astuce ici était de sous-classer Zend_View_Helper_Abstract, quelque chose qui est difficile à repérer dans le manuel. Une fois que vous avez une référence de vue, vous vous rendrez compte que vous pouvez appeler des fonctions comme d'habitude. Souvent, dans ZF, il existe plusieurs façons de récupérer des références d'objet. Dans ce cas, vous pouvez récupérer la vue depuis ViewRendered ou un registre. Mon exemple est le plus propre. –

0

Vous avez peut-être pas configuré votre chargeur automatique pour charger les classes de la application/common/helpers/ dossier. Voir Zend_Application_Module_Autoloader pour les chemins par défaut. Vous devriez ajouter votre nouveau dossier à ceci.

0

Vous appelez votre classe sans l'instancier.

Votre fonction generalFunctions() utilise le pointeur $this, qui ne fonctionnera pas; aussi ce n'est pas une méthode statique.

Une option est la barre de progression pour être une fonction statique et l'appeler directement comme ceci:

Zend_View_Helper_GeneralFunctions::progressMeter(); 

Une autre option consiste à instancier votre classe première.

+0

J'ai oublié de mentionner, que j'ai l'assistant GeneralFunctions auto chargé dans le Bootstrap comme ceci et il est déjà disponible pour tous mes modules: $ view-> addHelperPath (APPLICATION_PATH. '/ Common/helpers', 'View_Helper'); Salut Jai, je l'ai fait fonctionner comme vous l'avez dit en l'instanciant d'abord comme ceci: $ genFun = new Zend_View_Helper_GeneralFunctions(); $ html. = $ GenFun-> progressMeter(); – EricP

0

Je vois plusieurs problèmes avec votre code fourni.

  1. Vous essayez d'appeler Zend_View_Helper_GeneralFunctions::generalFunctions() comme une méthode statique lorsqu'elle est déclarée en tant que méthode de classe (vous devez instancier une instance de la classe à utiliser) en raison de votre omission du mot-clé static.
  2. Si vous souhaitez utiliser generalFunctions() en tant que méthode statique et que vous corrigez cela, vous devez alors rendre baseUrl une propriété statique ou vous devez instancier une instance de la classe, puis renvoyer cette instance. L'idée d'utiliser votre classe GeneralFunctions comme conteneur pour des méthodes statiques appelées directement est vraiment un symptôme de problèmes plus profonds et est appelée à juste titre une odeur de code. Si vous pensez que je mens, jetez un œil aux éléments de haute priorité pour Zend Framework 2.0 (indice: cela implique de supprimer toutes les méthodes statiques du framework). Ou vous pouvez toujours demander SO ce qu'ils pensent des méthodes statiques :-).

En regardant votre nom de classe donnée pour les fonctions générales de classe Zend_View_Helper_GeneralFunctions et compte tenu du scénario actuel où vous essayez d'utiliser l'aide GeneralFunctions dans un autre assistant, je conjecturer que vous avez vraiment besoin de faire une des deux choses.

  1. Vous devez avoir chaque sous-classe de classe d'assistance la classe GeneralFunctions afin que toutes vos aides aient ces fonctions disponibles. Fondamentalement, demandez-vous si vos aides commencent tous la vie comme des aides avec des fonctionnalités étendues au-delà. Cette solution utilise l'héritage pour résoudre votre problème.
  2. Chaque assistant de vue doit contenir une instance de l'objet View sur lequel il a agi. Donc, en théorie, vous devriez pouvoir accéder à n'importe quelle autre aide de vue via la méthode magique __call (je pense qu'il y a aussi une méthode explicite mais j'utilise toujours la méthode magique). Il pourrait ressembler si dans votre scénario:

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) 
    { 
        $html=''; 
        $html.= $this->generalFunctions()->progressMeter(); 
        return $html; 
    } 
    

    Dans ce scénario, la méthode __call chargerait l'aide GeneralFunctions et aurait alors appelleraient la méthode progressMeter() de l'aide GeneralFunctions.

    Maintenant votre classe d'aide GeneralFunctions ressemblerait probablement à ceci:

    class Zend_View_Helper_GeneralFunctions 
    { 
        public function __construct() 
        { 
         $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); 
        } 
    
        public function progressMeter() { 
         $html=''; 
         $html.='<span id="progressWrapper">'; 
         $html.='<span id="progressMeter"></span>'; 
         $html.='</span>'; 
         $html.=''; 
         return $html; 
        } 
    } 
    
+0

Mais je suis intéressé à améliorer mon code par ce que vous avez dit Noé. Alors, ce que vous dites est que je peux étendre mes aides de vue comme ceci: Zend_View_Helper_FormVars classe étend Zend_View_Helper_GeneralFunctions Et quand je besoin d'une fonction de deux de ces classes dans un script de vue, par exemple, je qualifierais de $ this-> formVars() -> someFunction(); Et someFunction() peut être dans la classe FormVars ou la classe GeneralFunctions? merci – EricP

+0

@EricP - Vous pouvez étendre la classe GeneralFunctions View Helper avec toutes vos classes View Helper comme vous le suggérez. Ou, vous pouvez simplement utiliser l'aide de vue de fonctions générales comme aide de vue tout seul comme je l'ai indiqué dans l'exemple de code.En utilisant cette méthode, vos autres aides View héritent toujours de la classe abstraite par défaut, puis vous appelez des méthodes à partir de l'aide de vue GeneralFunctions via la méthode magic __call(). –