Domanda

Ho un aiutante chiamato Zend_View_Helper_FormVars che viene utilizzato da uno dei miei moduli. Ho anche un aiuto comune in application/common/helpers/GeneralFunctions.php

Sto provando a chiamare una funzione da Zend_View_Helper_FormVars che si trova in GeneralFunctions.php .

Ecco la versione breve di 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;
    }
}

Ecco il codice in 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;
    }
}

Inoltre, ho dimenticato di dire che ho l'helper GeneralFunctions caricato automaticamente nel Bootstrap in questo modo ed è già disponibile per tutti i miei moduli:

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

Ecco cosa ho provato, ma sto ricevendo un errore:

// 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();
//-------------------->

Messaggio di errore visualizzato:

  

Errore irreversibile: classe 'Common_Helper_General' non trovata in /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php sulla riga 2

È stato utile?

Soluzione

In realtà è davvero semplice chiamare un altro View Helper.

Assicurati che l'helper della vista estenda Zend_View_Helper_Abstract , in modo che abbia accesso al $ view . Quindi puoi semplicemente chiamare gli helper come faresti da una vista, ad esempio

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

Basato sul tuo esempio sopra:

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

Altri suggerimenti

Probabilmente non hai configurato il tuo caricatore automatico per caricare le classi dalla cartella application / common / helpers / .

Vedi Zend_Application_Module_Autoloader per i percorsi predefiniti. Devi aggiungere la tua nuova cartella a questo.

Vedo diversi problemi con il codice fornito.

  1. Stai tentando di chiamare Zend_View_Helper_GeneralFunctions :: generalFunctions () come metodo statico quando viene dichiarato come metodo di classe (cioè devi istanziare un'istanza della classe per usarla) per ragione della tua omissione della parola chiave static .
  2. Se si desidera effettivamente utilizzare generalFunctions () come metodo statico e correggerlo, sarà necessario rendere baseUrl una proprietà statica o sarà necessario crea un'istanza della classe e quindi restituisce tale istanza.
  3. L'idea di utilizzare la classe GeneralFunctions come contenitore per metodi statici chiamati direttamente è in realtà un sintomo di problemi più profondi ed è giustamente etichettata come un odore di codice. Se pensi che stia mentendo, dai un'occhiata agli elementi ad alta priorità per Zend Framework 2.0 (suggerimento: comporta la rimozione di tutti i metodi statici dal framework). Oppure puoi sempre chiedere a SO cosa ne pensano dei metodi statici :-).

Osservando il nome della tua classe per la classe di funzioni generali Zend_View_Helper_GeneralFunctions e dato lo scenario attuale in cui stai provando a utilizzare l'helper GeneralFunctions all'interno di un altro helper, suppongo che devi davvero fare una delle due cose.

  1. Devi avere ogni sottoclasse della classe helper la classe GeneralFunctions in modo che tutti i tuoi helper abbiano queste funzioni disponibili. Fondamentalmente, chiediti se tutti i tuoi aiutanti iniziano la loro vita come GeneralFunction aiutanti con funzionalità estese oltre. Questa soluzione utilizza l'ereditarietà per risolvere il tuo problema.
  2. Ogni helper di visualizzazione deve contenere un'istanza dell'oggetto View su cui si agisce. Pertanto, in teoria, dovresti essere in grado di accedere a qualsiasi altro helper di visualizzazione tramite il metodo magico __call (penso che esista anche un metodo esplicito, ma uso sempre il metodo magico). Potrebbe apparire così nel tuo scenario:

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

    In questo scenario il metodo __call carica l'helper GeneralFunctions e quindi chiama il metodo progressMeter () dal Funzioni generali helper.

    Ora la tua classe helper GeneralFunctions probabilmente dovrebbe apparire così:

    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;
        }
    }
    

Stai chiamando la tua classe senza istanziarla.

La tua funzione generalFunctions () utilizza il puntatore $ this , che non funzionerà; inoltre non è un metodo statico.

Un'opzione è impostare l'indicatore di progresso come una funzione statica e chiamarlo direttamente in questo modo:

Zend_View_Helper_GeneralFunctions::progressMeter();

Un'altra opzione è quella di istanziare prima la lezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top