2009-08-10 7 views
5

¿Cómo implemento una barra lateral en Zend Framework? Sé que puedo usar un marcador de posición o algo similar en Zend_layout, pero ¿cómo puedo generar automáticamente el código para la barra lateral en mis controladores sin tener que llamar a una clase de barra lateral dentro de cada controlador? Mi disposición es el siguienteCómo implementar una barra lateral en Zend Framework

Application 
- modules 
    - blog 
    - other modules 

sólo quiero la barra lateral para mi módulo de blog.

He encontrado que esto http://www.zfforums.com/zend-framework-components-13/model-view-controller-mvc-21/how-layout-sidebar-etc-2677.html pero no entiendo la última parte "simplemente inyectar su diseño, registrarlo con el controlador frontal ..."

Respuesta

6

Se podía tener una acción y la vista en uno de sus controladores que representa la barra lateral.

de la disposición para el módulo de blog que acaba de llamar:

<? echo $this->action('action','controller','module',array('optionalparams'=>1); ?> 

en la posición en la que desea tenerlo. Así que una llamada a una acción.

+0

Esto es muy caro, creo. – blockhead

+0

¿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

+0

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

3

Si está utilizando Zend_Layout, simplemente agregue la barra lateral con el viewhelper de Acción como dijo Rufinus.

en su script:

<div id="sidebar"> 
<?php echo $this->action('action', 'controller', 'module', array('optionalparams'=>1)); ?> 
</div> 
<div id="content"> 
<?php echo $this->layout()->content; ?> 
</div> 

Esto debe cumplir con los requisitos publicados en su pregunta.

+0

Gracias por confirmar la respuesta de Rufinus – unkownt

4

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.

Cuestiones relacionadas