2010-03-05 11 views
6

Estoy creando una biblioteca de objetos de visualización para nuestra aplicación. Representan el html de muchos de los objetos comunes (usuarios, conversaciones, mensajes, etc.) en varias vistas. Por vistas quiero decir que el objeto puede escupir diferentes "niveles de zoom" de sí mismo con diferentes marcas.Zend Framework: cuándo usar viewcripts/parciales vs view helpers

Algunos objetos de visualización contienen otros objetos de visualización para representar, p. Ej. un objeto de la lista de usuarios representa los objetos del usuario en una vista determinada (esta vista particular los escupe en los elementos de la lista para que quepan en la lista)

Estoy tratando de moverlos a la forma correcta de hacer las cosas en ZF, pero No puedo decidir si todos deberían ser ayudantes de vista, o si todos son scripts/parciales de vista.

Solo verlos y representarlos con -> render() parece un poco sucio porque cualquier información o parámetro que quiera pasarles debe asignarse al objeto de vista.

Los parciales parecen un poco más correctos, excepto que no estoy seguro si es apropiado hacer lógica de visualización en estos (si 'showNotificationStatus' se pasa como un parámetro, renderice este span). O si es kosher para parciales para representar otros parciales (una lista de usuarios que representa el objeto del usuario).

Ver los ayudantes parecen posiblemente la manera correcta de hacerlo, pero no sé si eso es demasiado uso de los ayudantes de visualización. Cada objeto podría ser un ayudante de visualización y aceptar un parámetro de vista de objeto para que supiera en qué nivel de zoom/contenedor se debe renderizar, o cada vista de objeto podría ser incluso su propia ayuda (para que no haya una gran declaración de conmutación dentro de un objeto). Una cosa buena de las vistas es que puede pasar parámetros y todavía tiene acceso al contexto de la vista si necesita algo de ese nivel.

La mayoría de estos aceptan modelos, y algunos requieren algunos parámetros adicionales para saber qué hacer (por ejemplo, showNotificationStatus desde arriba). ¿Cuál es la herramienta adecuada para esto?

Respuesta

15

Una de las ideas centrales de los parciales es que están destinados a ser tan reutilizables como sea posible, de ahí que tengan su propio alcance variable. Me gusta usar parciales como contenedores bastante tontos para pequeños bits de HTML. No hay una lógica mayor que algunas declaraciones if() o foreach().

Si necesito una lógica seria, uso un ayudante. Los ayudantes deberían ser responsables de manejar la lógica y llamar a los métodos de representación. Sé que en el mundo de Rails, los ayudantes tienden a encapsular pequeñas porciones de lógica, como manejar la construcción de enlaces o etiquetas de imagen. Esto es genial, pero no creo que haya ningún daño al hacerlos más complejos en ZF. En esencia, los utilizo para traducir mis objetos comerciales en vistas.

Creo que la mejor manera de usar parciales y ayudantes es hacer que los ayudantes configuren los datos y luego los pasen a parciales. De esta manera, su HTML se mantiene muy fácil de mantener (y sospecho que cada vez que alguien escriba echo "<a href='". $my_link . '"/>", un gatito se muere en algún lugar).

EDITAR (elaborar):

Lo que hay que recordar acerca de los ayudantes es que pueden ser tratados como clases normales, utilice un constructor con argumentos y tienen miembros privados.Entonces, cuando crea una instancia de un ayudante, puede hacer un objeto comercial y luego tener múltiples métodos que rinden HTML (a través de parciales).

Así que en mi opinión:

<?php $helper = $this->_helper->MyUserHelper($users); ?> 
<ul> 
    <?php $helper->user_list(); ?> 
</ul> 

En este caso, el método user_list() devuelve una colección de <li> elementos con todos los datos adecuados en ellos.

mi poder ayudante se ve así:

class MyWidgetHelper 
{ 
    private $_widget; 

    public function __construct($users) 
    { 
    $this->_users = $users; 
    } 

    public function user_list() 
    { 
    // do any necessary logic here 
    // then return the html that gets rendered. 
    // you can call a partial from here, and it just returns an HTML string. 
    return $this->_view->partial('partials/_user_item.phtml', array('users' => $users) 
    } 
} 
+0

Bryan Creo que esta es realmente una buena información. ¿Alguna posibilidad de que puedas elaborar un poco? Supongamos que tiene un objeto comercial que puede representarse en varios niveles de zoom diferentes (de detalle). ¿Tiene un ayudante, que rinde parciales diferentes en función de un parámetro que pase? Muchos ayudantes con parciales correspondientes? Básicamente, ¿estás mirando generalmente una relación 1 a 1? ¿Y es genial para los parciales aprovechar a otros ayudantes de visualización? (Imagine una conversación, que contiene una lista de usuarios dentro de ella. Necesito hacer que los usuarios dentro de la conversación sean parciales). –

+0

Agregué a mi respuesta a una anterior con un ejemplo. En mi ejemplo, uso ayudantes para controlar parciales, pero no veo por qué no podrías hacerlo al revés. Solo prefiero mantener mi HTML lo más libre posible de la lógica php. –

+0

Excepcional. ¡Muchas gracias Bryan! –

0

Los helpers son para lógica (por ejemplo, convertir objeto a matriz), los parciales son para decorar la lógica (mostrar matriz recursiva como un árbol <ul>).

Recuerde, también puede usar $this->render('anyfile.ext') o include() también.

+0

Una cosa que difumina la línea que para mí, es que hay ayudantes que se incluyen con ZF que son, precisamente, para la creación de elementos HTML a partir de datos proporcionados. Vea todos los ayudantes de formularios en http://zendframework.com/manual/1.10/en/zend.view.helpers.html por ej. formCheckbox crea una casilla con los datos que le pasas –

+1

Ayudantes que pueden tener diferente salida de HTML, usa 'setPartial()'. Cuando ejecutar parcial es demasiado costoso (o está seguro de que la salida será siempre la misma), es más fácil simplemente codificar HTML en el helper. Simplemente implemente 'setPartial()' con el retorno al marcado predeterminado, si partial no está configurado. – takeshin

Cuestiones relacionadas