php zend-framework zend-view

php - Zend Framework call view helper desde Zend_View_Helper



zend-framework zend-view (4)

En realidad, es realmente simple llamar a otro View Helper.

Asegúrese de que su ayudante de vista amplíe Zend_View_Helper_Abstract , para que tenga acceso a $view . Entonces simplemente puede llamar a los ayudantes como lo haría desde una vista, es decir,

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

En función de tu 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; } }

Tengo un helper llamado Zend_View_Helper_FormVars que es utilizado por uno de mis módulos. También tengo un ayudante común en application/common/helpers/GeneralFunctions.php

Zend_View_Helper_FormVars llamar a una función de 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 helper de GeneralFunctions cargado automáticamente en Bootstrap como este y ya está disponible para todos mis módulos:

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

Esto es lo que probé, pero estoy recibiendo 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 fatal: no se encontró la clase ''Common_Helper_General'' en /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php en la línea 2


Estás llamando a tu clase sin instanciarlo.

Su función generalFunctions() usa $this puntero, que no funcionará; tampoco es un método estático.

Una opción es configurar el medidor de progreso como 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.


Posiblemente no haya configurado su autocargador para cargar clases desde la carpeta application/common/helpers/ .

Ver Zend_Application_Module_Autoloader para rutas predeterminadas. Debería agregar su nueva carpeta a esto.


Veo varios problemas con su código provisto.

  1. 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, tiene que instanciar una instancia de la clase para usarlo) en razón de la omisión de la palabra clave static .
  2. Si de hecho desea utilizar generalFunctions() como método estático y corregir esto, deberá hacer que baseUrl una propiedad estática o tendrá que instanciar una instancia de la clase y luego devolver esa instancia.
  3. La idea de usar su clase GeneralFunctions como un contenedor para 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 cree que estoy mintiendo, eche 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 puedes preguntarle a SO qué piensan de los métodos estáticos :-).

Mirando el nombre de clase dado para la clase de funciones generales Zend_View_Helper_GeneralFunctions y dado el escenario actual en el que intentas usar el helper de GeneralFunctions dentro de otro helper, supongo que realmente necesitas hacer una de estas dos cosas.

  1. Necesita tener todas las clases GeneralFunctions auxiliares, la clase GeneralFunctions para que todos sus ayudantes tengan estas funciones disponibles. Básicamente, pregúntese si todos sus ayudantes comienzan su vida como ayudantes de GeneralFunction Funtions con funcionalidad extendida más allá. Esta solución usa herencia para resolver su problema.
  2. Cada asistente de visualización debe contener una instancia del objeto View sobre el que se actúa. Por lo tanto, en teoría, debería poder acceder a cualquier otro asistente de visualización 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 verse 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 helper GeneralFunctions y luego llamaría al método progressMeter() desde el helper GeneralFunctions .

    Ahora su clase de ayuda 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; } }