En lugar de utilizar la pila de acciones y el asistente de visualización action()
, podría representar un "script de vista parcial" que incluya los elementos de la barra lateral.
# in your layout.phtml
<div id="sidebar">
<?php echo $this->render('blog/_sidebar.phtml'); /*relative to your view scripts directory*/ ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
El render()
ayudante de vista se utiliza para representar el contenido de otro script de vista. Tiene el mismo alcance que todos los demás scripts de vista, por lo que si hay alguna variable asignada a la vista, estarán disponibles para su parcial. Entonces, en el ejemplo anterior, la variable de categorías se configuró en el controlador.
Hay otro asistente de visualización llamado partial()
ver ayudante. Esta función es un poco más cara ya que crea su propio alcance variable. En otras palabras, ninguna de sus variables de vista actuales estará disponible. Tendrá una pizarra limpia para trabajar, lo que significa que debe pasar en cualquier variable que necesita:
# in your layout.phtml
<div id="sidebar">
<?php echo $this->partial('blog/_sidebar.phtml', array('categories2'=>$this->categories)); ?>
</div>
# in blog/_sidebar.phtml
<div id="blog_categories">
<?php foreach ($this->categories2 as $category): ?>
<?php echo $category->name; ?>
<?php endforeach; ?>
</div>
no encuentro a mí mismo usando partial()
muy a menudo, ya que es más caro, y que rara vez se necesita para crear un contexto separado.
En cuanto a la configuración de las variables para el uso en la barra lateral parcial ($this->categories
en este ejemplo), he utilizado una serie de métodos diferentes dependiendo del problema en particular. Si es específico para una acción de controlador, voy a escribir el código y asignarlo en el script de vista:
# controller
public function somethingAction()
{
$this->view->categories = $this->_getCategoriesForThisParticularAction();
// other controller code
}
Si mi código es más genérico para todas las acciones del controlador, voy a utilizar la función del controlador preDispatch()
. Si es más genérico para múltiples controladores, pondré el código en el init()
de mi controlador base (un controlador que la mayoría de mis controladores extienden).
A veces ni siquiera pongo el código en mi controlador. Si es lo suficientemente simple, simplemente coloco el código en el parcial. Si es un poco más complejo, lo moveré a un asistente de visualización. Esto puede romper el patrón de MVC, pero creo que realmente depende del caso particular para determinar la mejor ubicación.
Esto es muy caro, creo. – blockhead
¿a qué te refieres con costoso? AFAIK es esta la manera de hacerlo. El código mencionado en el enlace zfforums, rompe con el patrón MVC en mi humilde opinión. – Rufinus
Gracias, sabía que debería ser fácil. Solo necesito descubrir cómo puedo tener diferentes diseños por módulo. Por ahora estoy teniendo el mismo diseño para cada módulo. Blockhead: ¿Qué quieres decir con costoso? ¿Sería menos costoso llamar la acción dentro de mi controlador? Mi primera Idea fue crear un controlador predeterminado que arregló la barra lateral y luego heredar de ese controlador en todos mis controladores de blog. – unkownt