Assistente di visualizzazione chiamate Zend Framework da Zend_View_Helper
-
05-07-2019 - |
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
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.
- 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 chiavestatic
. - Se si desidera effettivamente utilizzare
generalFunctions ()
come metodo statico e correggerlo, sarà necessario renderebaseUrl
una proprietà statica o sarà necessario crea un'istanza della classe e quindi restituisce tale istanza. - 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.
- 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 comeGeneralFunction
aiutanti con funzionalità estese oltre. Questa soluzione utilizza l'ereditarietà per risolvere il tuo problema. -
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'helperGeneralFunctions
e quindi chiama il metodoprogressMeter ()
dalFunzioni 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.