2009-11-25 13 views
7

Tengo un helper llamado Zend_View_Helper_FormVars que usa uno de mis módulos. También tengo un ayudante común en application/common/helpers/GeneralFunctions.phpZend Framework call view helper de Zend_View_Helper

Estoy intentando llamar a una función de Zend_View_Helper_FormVars que está en GeneralFunctions.php.

Aquí es 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, se olvidó de mencionar que tengo el auto GeneralFunctions ayudante cargado en el Bootstrap como esto y está disponible para todos mis módulos ya:

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

Aquí es lo que he intentado, 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 consigo:

Fatal error: Class 'Common_Helper_General' not found in /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php on line 2

+0

recomendaría namespacing Ayudantes con su propio prefijo y la adición (no Zend!) el camino de ayuda para esto. –

Respuesta

13

En realidad es muy simple para llamar a otro Ayudante de Vista.

Asegúrese de que su vista auxiliar se extiende Zend_View_Helper_Abstract, por lo que tiene acceso al $view. Entonces es posible que sólo tiene que llamar ayudantes que lo haría desde un punto de 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; 
    } 
} 
+0

Gracias David. Eso funcionó también. Parece que hay muchas maneras de hacer cosas con Zend Framework. Me gusta, pero a veces puede ser confuso. – EricP

+0

El truco aquí fue para la subclase Zend_View_Helper_Abstract, algo que es difícil de detectar en el manual. Una vez que tenga una referencia de vista, se dará cuenta de que puede llamar a las funciones como de costumbre. A menudo en ZF hay múltiples formas de recuperar referencias de objetos. En este caso, podría recuperar técnicamente la vista desde ViewRendered o un registro. Mi ejemplo es el mejor. –

0

Usted posiblemente no ha configurado su cargador automático para cargar las clases de la application/common/helpers/ carpeta.

Consulte Zend_Application_Module_Autoloader para ver las rutas predeterminadas. Debería agregar su nueva carpeta a esto.

0

Está llamando a su clase sin instanciarlo.

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

Una opción se establece indicador de progreso a ser una función estática y llamar directamente como esto:

Zend_View_Helper_GeneralFunctions::progressMeter(); 

Otra opción es crear una instancia de la clase primera.

+0

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'); Hola Jai, lo hice funcionar como dijiste instalándolo primero como este: $ genFun = new Zend_View_Helper_GeneralFunctions(); $ html. = $ GenFun-> progressMeter(); – EricP

0

Veo varios problemas con el código provisto.

  1. Está intentando llamar Zend_View_Helper_GeneralFunctions::generalFunctions() como un método estático cuando se declara como un método de clase (es decir, usted tiene que crear una instancia de la clase para usarlo) en razón de su 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 sea 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 :-).

En cuanto a su nombre de la clase dada para las funciones de clase general Zend_View_Helper_GeneralFunctions y dado el escenario actual en el que está intentando utilizar el ayudante GeneralFunctions dentro de otro ayudante, me gustaría suponer que usted realmente necesita para hacer una de dos cosas.

  1. Necesita tener todas las clases secundarias clase GeneralFunctions para que todos sus ayudantes tengan estas funciones disponibles. Básicamente, pregúntese si todos sus ayudantes comienzan la vida como ayudantes GeneralFunction 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 Ver en 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). Podría verse como lo que 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 entonces debería llamar al método progressMeter() del GeneralFunctions ayudante.

    Ahora su clase GeneralFunctions ayudante 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; 
        } 
    } 
    
+0

Pero estoy interesado en mejorar mi código con lo que dijiste Noah. Por lo tanto, lo que está diciendo es que puedo extender todos mis ayudantes de vista así: Zend_View_Helper_FormVars clase extiende Zend_View_Helper_GeneralFunctions Y cuando necesito una función de cualquiera de esas clases en un script de vista, por ejemplo, me llamarían $ this-> formVars() -> someFunction(); ¿Y someFunction() puede estar en la clase FormVars o en la clase GeneralFunctions? gracias – EricP

+0

@EricP - Puede extender la clase GeneralFunctions View Helper con todas sus clases de View Helper como está sugiriendo. O bien, simplemente puede usar GeneralFunctions View Helper como View Helper por sí solo, como indiqué en el código de ejemplo.Al usar este método, tus otros ayudantes de View siguen heredando la clase abstracta predeterminada y luego llamas a métodos desde GeneralFunctions View Helper a través del método magic __call(). –

Cuestiones relacionadas