Question

J'ai un assistant appelé Zend_View_Helper_FormVars utilisé par l'un de mes modules. J'ai également un assistant commun dans application / common / helpers / GeneralFunctions.php

J'essaie d'appeler une fonction à partir de Zend_View_Helper_FormVars qui se trouve 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 dans 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;
    }
}

Aussi, j'ai oublié de mentionner que j'ai l'auxiliaire GeneralFunctions chargé automatiquement dans Bootstrap et qu'il est déjà disponible pour tous mes modules:

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

Voici ce que j'ai essayé, mais j'obtiens 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:

  

Erreur fatale: la classe 'Common_Helper_General' est introuvable dans /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php à la ligne 2

Était-ce utile?

La solution

Il est en fait très simple d'appeler un autre assistant de visualisation.

Assurez-vous que votre assistant d'affichage étend Zend_View_Helper_Abstract , de sorte qu'il ait accès à la $ view . Ensuite, vous pouvez simplement appeler les assistants comme vous le feriez depuis une vue, c.-à-d.

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

D'après 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;
    }
}

Autres conseils

Vous n'avez peut-être pas configuré votre autochargeur pour charger des classes à partir du dossier application / common / helpers / .

Voir Zend_Application_Module_Autoloader pour les chemins par défaut. Vous devriez y ajouter votre nouveau dossier.

Je vois plusieurs problèmes avec votre code fourni.

  1. Vous tentez d'appeler Zend_View_Helper_GeneralFunctions :: generalFunctions () en tant que méthode statique lorsqu'elle est déclarée en tant que méthode de classe (c.-à-d. que vous devez instancier une instance de la classe pour l'utiliser) par raison de votre omission du mot clé static .
  2. Si vous voulez réellement utiliser generalFunctions () en tant que méthode statique et le corriger, vous devrez alors faire de baseUrl une propriété statique ou vous devrez instancier une instance de la classe puis renvoyer cette instance.
  3. L'idée d'utiliser votre classe GeneralFunctions comme conteneur pour les méthodes statiques appelées directement est en réalité un symptôme de problèmes plus profonds et est à juste titre qualifiée d'odeur de code. Si vous pensez que je suis en train de mentir, jetez un coup d'œil aux éléments hautement prioritaires de Zend Framework 2.0 (conseil: cela implique de supprimer toutes les méthodes statiques du cadre). Ou vous pouvez toujours demander à SO ce qu'ils pensent des méthodes statiques :-).

En regardant votre nom de classe donné pour la classe de fonctions générales Zend_View_Helper_GeneralFunctions et compte tenu du scénario actuel dans lequel vous essayez d'utiliser l'aide GeneralFunctions dans un autre assistant, je supposerais que vous devez vraiment faire l'une des deux choses.

  1. Toutes les classes d'assistance doivent avoir la sous-classe GeneralFunctions pour que tous vos assistants disposent de ces fonctions. En gros, demandez-vous si vos assistants commencent tous dans la vie en tant qu’aides GeneralFunction 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 on agit. Par conséquent, en théorie, vous devriez pouvoir accéder à n’importe quel autre assistant de vue via la méthode magique __ call (je pense qu’il existe également une méthode explicite mais j’utilise toujours la méthode magique). Cela pourrait ressembler à 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'assistant GeneralFunctions et appellerait ensuite la méthode progressMeter () à partir de . GeneralFunctions assistant.

    Votre classe d'assistance 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;
        }
    }
    

Vous appelez votre classe sans l'instancier.

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

Une option est définie pour mesurer la progression comme étant une fonction statique et l'appeler directement comme ceci:

Zend_View_Helper_GeneralFunctions::progressMeter();

Une autre option consiste à instancier votre classe en premier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top