Asistente de vista de llamada de Zend Framework desde un Zend_View_Helper
-
05-07-2019 - |
Pregunta
Tengo un ayudante llamado Zend_View_Helper_FormVars
que se usa en uno de mis módulos.
También tengo un ayudante común en application/common/helpers/GeneralFunctions.php
Estoy tratando de llamar a una función desde Zend_View_Helper_FormVars
que está en GeneralFunctions.php
.
Aquí está la versión corta 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;
}
}
Aquí está el código en 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;
}
}
Además, olvidé mencionar que tengo el asistente GeneralFunctions
cargado automáticamente en Bootstrap de esta manera y ya está disponible para todos mis módulos:
$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper');
Esto es lo que probé, pero recibo un error:
// 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();
//-------------------->
Mensaje de error que recibo:
Error grave: la clase 'Common_Helper_General' no se encuentra en /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php en la línea 2
Solución
En realidad, es realmente sencillo llamar a otro View Helper.
Asegúrese de que su ayudante de vista extiende Zend_View_Helper_Abstract
, de modo que tenga acceso a $ view
. Entonces puede simplemente llamar a los ayudantes como lo haría desde una vista, es decir,
$this->view->generalFunctions()->progressMeter();
Basado en su ejemplo anterior:
<?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;
}
}
Otros consejos
Posiblemente no haya configurado su autocargador para cargar clases desde la carpeta application / common / helpers /
.
Consulte Zend_Application_Module_Autoloader
para ver las rutas predeterminadas. Debes agregar tu nueva carpeta a esto.
Veo varios problemas con el código provisto.
- Está intentando llamar a
Zend_View_Helper_GeneralFunctions :: generalFunctions ()
como un método estático cuando se declara como un método de clase (es decir, debe crear una instancia de la clase para usarlo) por la razón de su omisión de la palabra clavestatic
. - Si de hecho desea utilizar
generalFunctions ()
como método estático y corregirlo, entonces deberá hacer quebaseUrl
sea una propiedad estática o deberá instanciar una instancia de la clase y luego devolver esa instancia. - La idea de usar su clase
GeneralFunctions
como contenedor de métodos estáticos que se llaman directamente es realmente un síntoma de problemas más profundos y se etiqueta correctamente como un olor a código. Si crees que estoy mintiendo, echa un vistazo a los elementos de alta prioridad para Zend Framework 2.0 (sugerencia: implica eliminar todos los métodos estáticos del marco). O siempre puede preguntar a SO qué piensan de los métodos estáticos :-).
Viendo el nombre de clase dado para la clase de funciones generales Zend_View_Helper_GeneralFunctions
y dado el escenario actual en el que está tratando de usar el ayudante GeneralFunctions
dentro de otro ayudante, supongo que realmente necesitas hacer una de dos cosas.
- Necesitas tener en cada subclase de clase auxiliar la clase
GeneralFunctions
para que todos tus ayudantes tengan estas funciones disponibles. Básicamente, pregúntese si todos sus ayudantes comienzan la vida como ayudantesGeneralFunction
con una funcionalidad extendida más allá. Esta solución utiliza la herencia para resolver su problema. -
Cada ayudante de vista debe contener una instancia del objeto Vista sobre el que se está actuando. Por lo tanto, en teoría, debería poder acceder a cualquier otro asistente de vista a través del método mágico
__call
(creo que también hay un método explícito, pero siempre uso el método mágico). Puede parecer así en su escenario:public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) { $html=''; $html.= $this->generalFunctions()->progressMeter(); return $html; }
En este escenario, el método
__call
cargaría el ayudanteGeneralFunctions
y luego llamaría al métodoprogressMeter ()
desdeFunciones generales
helper.Ahora su clase auxiliar
GeneralFunctions
probablemente se vería así: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; } }
Estás llamando a tu clase sin instanciarla.
Su función generalFunctions ()
usa el puntero $ this
, que no funcionará; tampoco es un método estático.
Una opción es configurar el medidor de progreso para que sea una función estática y llamarlo directamente así:
Zend_View_Helper_GeneralFunctions::progressMeter();
Otra opción es crear una instancia de tu clase primero.