2009-04-29 13 views
6

quiero que sea lo más fácil posible para nuestros diseñadores para localizar cadenas de puntos de vista, lo que significa que quiero hacer esto:¿Cómo extiendo Zend View para implementar una función concreta?

... 
<p><?php echo $this->_("Hello, world!"); ?></p> 
... 

La notación de subrayado aquí es necesaria para permitir Poedit para extraer automagicamente todas las cadenas para localización La implementación es trivial:

public function _($string) 
{ 
    return Zend_Registry::get('Zend_Translate')->_($string); 
} 

Por el momento, he puesto esto directamente en Zend_View_Abstract, lo cual es malo (no quiero hacer esto mediante la modificación de cualquiera de la biblioteca Zend). Idealmente, entonces, ampliaría Zend_View_Abstract para permitirme implementar otras funciones concretas que necesitamos, pero no sé cómo configurarlo. Una alternativa podría ser implementar View Helper, pero la única forma en que sé cómo hacer esto hace que el código en la vista sea más detallado. Cualquier puntero (no, no ese tipo) sería muy apreciado. ¡Gracias!

+0

Creo que lo que quiero hacer es extender Zend_View_Abstract y usar esa nueva vista personalizada en lugar de la vista que utiliza ViewRenderer, y no hay información sobre cómo hacer esto de una forma no hackish con la última versión de Zend. La documentación de Zend inútilmente menciona que "Muchos desarrolladores encuentran que desean extender Zend_View_Abstract para agregar funcionalidad personalizada" sin mencionar cómo hacerlo. – kranzky

Respuesta

14

Obviamente ignorar mis caminos para su propia ...

  1. Extender Zend_View
  2. Deja tus método en esta clase extendida
  3. una instancia de la clase (en su rutina de carga, por ejemplo)
  4. Asignarlo al ViewRenderer
  5. Pase ese viewrenderer al Zend_Controller_Action_HelperBroker's método addHelper
  6. Úselo en su vista

In/library/MegaHAL/Zend/create View.php:

class MegaHAL_Zend_View extends Zend_View 
{ 
    public function _($string) 
    { 
    return Zend_Registry::get('translate')->_($string); 
    } 
} 

En su archivo de arranque:

require_once APPLICATION_PATH.'../library/MegaHAL/Zend/View.php'; 

$view = new MegaHAL_Zend_View(); 

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); 
$viewRenderer->setView($view); 
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); 

En su opinión:

<p><?php echo $this->_("Hello");?></p> 

yo creo que va a hacer lo que quiere, ¿verdad?

+0

Funciona bien, gracias por su ayuda. Estoy aceptando esto sobre otras respuestas porque es más paso a paso y específico para mi problema con ViewRenderer. – kranzky

+0

No hay problema, me complace ayudarlo. Tiendo a preferir explicaciones más detalladas porque el tipo de instrucciones "uno, dos, omita algunos", como en la documentación de Zend Framework, siempre parece que terminan dejando de lado ese diminuto pepita que lo vincula todo ... unidades estoy loco – Stuart

2

Creo que está buscando una forma de crear custom view helpers.

Ejemplo:

class My_View_Helper extends Zend_View_Helper_Abstract 
{ 
    public function translate($string) 
    { 
     //... 
    } 
} 

...

$view->setHelperPath('/path/to/helpers', 'My_View_Helper'); 

...

Luego, en sus vistas que se pueden utilizar:

echo $this->translate("Hello, World!"); 
+1

No quiero usar un ayudante, porque no parece haber ninguna forma de que implemente una función llamada "_" en un ayudante, debido a los requisitos de nomenclatura y denominación de archivos (mencionados en la documentación has vinculado a). Como dije en mi pregunta, la notación del guión bajo es importante, tanto por la concisión, la coherencia con gettext, como por la extracción automática de cadenas Poedit. – kranzky

0

Si se ha configurado correctamente Poedit puede extraer automáticamente strin gs de funciones distintas de _().

+0

Sí, tiene toda la razón, pero aún quiero exponer una función de ayuda concreta a todas las vistas. ¿Es posible? – kranzky

1

Aunque creo que usar view helpers sería la forma correcta de "Zend-Framework" de hacer esto, puede ampliar Zend_View e implementar todos los métodos adicionales que desee tener, de esta forma no perderá el características de Zend_View.

class My_View extends Zend_View 
{ 
    public function _($string) 
    { 
     return Zend_Registry::get('Zend_Translate')->_($string); 
    } 
} 

A continuación, sólo tiene que asegurarse de que su nueva clase de vista se crea una instancia y se registró como la vista por defecto en el controller (estableciendo la variable Zend_Controller_Action::$view instancia para una instancia de la clase) y en su Zend_Layout (cuando se usa diseños, pasando la vista como una opción de configuración con la clave view) cuando no se utiliza el ViewRenderer o en el ViewRenderer cuando se usa el ViewRenderer usando Zend_Controller_Action_Helper_ViewRenderer::setView().

+0

Gracias, creo que eso es exactamente lo que quiero. – kranzky

Cuestiones relacionadas