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

¿Fue útil?

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.

  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, debe crear una instancia de la clase para usarlo) por la razón de su omisión de la palabra clave static .
  2. Si de hecho desea utilizar generalFunctions () como método estático y corregirlo, entonces deberá hacer que baseUrl sea una propiedad estática o deberá instanciar una instancia de la clase y luego devolver esa instancia.
  3. 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.

  1. 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 ayudantes GeneralFunction con una funcionalidad extendida más allá. Esta solución utiliza la herencia para resolver su problema.
  2. 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 ayudante GeneralFunctions y luego llamaría al método progressMeter () desde Funciones 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top