Zend Layout y ActionStacks de Zend Framework

60 Comentarios

En la documentación deZend Layout no acaba de quedar muy claro como se usa y suele provocar muchas confusiones si solo hacemos una lectura vertical del manual.

Zend Layout es uno de mis objetos preferidos por la versatilidad que ofrece y una vez entiendes el proceso y como combinarlo con el resto del Framework y los placeholders obtienes una gestión muy clara de las plantillas.

Vamos a suponer el siguiente layout:

<div>
<?php echo $this->render('header.phtml') ?>
<h1><?php echo $this->placeholder('h1') ?></h1>
<?php echo $this->layout()->nav ?>
<?php echo $this->layout()->content ?>
</div>

Cada bloque de código php realiza una acción diferente.

  • $this->render(‘header.phtml’) se encargará de llamar al archivo header.phtml que estará ubicado en el mismo nivel que el layout.
  • $this->placeholder(‘h1′) nos devolverá el valor que hallamos definido en la plantilla usando $this->placeholder(‘h1′)->set(‘Mi h1′);
  • $this->layout()->nav es un ActionStack
  • $this->layout()->content nos devolverá el contenido de la plantilla

Pero ¿Que són los ActionStacks? ¿como se usan los? y ¿Para que sirven? Básicamente lo que logramos con los ActionStacks es renderizar un fragmento de código generado por una acción que no es la misma que estamos ejecutando en el momento de renderizar la página.

Todo será más fácil si usamos el MVC o Zend Application

Para hacer un ActionStack necesitaremos dos cosas: Un controlador y una llamada a este.

Lo primero será crear un controlador como cualquier otro, por ejemplo: NavegacionController con una acción menuAction. Esta acción renderizará menu.phtml pero le indicaremos en que segmento de la plantilla o layout se deberá renderizarse:


class NavegacionController extends Zend_Controller_Action{

    public function menuAction(){

    	// renderiza menu.phtml en el segmento nav
    	$this->_helper->viewRenderer->setResponseSegment('nav');
    }
}

Lo siguiente es hacer la llamada desde la acción principal.


class IndexController extends Zend_Controller_Action {

	public function indexAction() {

		$this->_helper->actionStack ('menu', 'navegacion', 'default');
	}
}

Es decir, cuando llamemos a IndexAction del IndexController el se encargará de llamar a menuAction del navegaciónController para que renderize scripts/navegacion/menu.phtml en el segmento nav que hemos indicado en el layout con $this->layout()->nav.

Entonces vemos que el primer parámetro es la acción, el segundo el controlador y el tercero es opcional y se refiere al módulo que por defecto es default.

Para profundizar más con los layouts estan los Placeholder Helper pero esto se sale ya del tema y lo dejo para otro post.

Espero que os se útil.

60 response to Zend Layout y ActionStacks de Zend Framework

  1. violeta

    Hola Buenos Dias…. sabes que necesito conecytarme de php a mckoi, por casualidad no sabes de un drivers que me permita comunicarme, de verdad lo necesito con urgencia.
    Espero y de verdad me puedas ayudar……

  2. YoGuuu

    Quiero agradecerte, la claridad no solo en cuanto a la redacción del código o de los artículos. Sinó a la hora de ser capaz de exponer los conceptos como digo, con una claridad que alumbra a los que estamos confundidos (por la deficiente documentación quizá). Yo veo buenas prácticas.

    Ciertas cosas que he leido me han ayudado mucho a comprender. En este post concretamente aunque si bién es cierto que sería mejor hacer uso de Zend_Navigation a mi me ha hecho comprender como usar los responseSegments en el layout y ActionStack Cosa que me parece… de muchisima utilidad para manejarse.

    Si necesitas ayuda de cualquier tipo, o una opinión, o para hablar de zf ya sabes mi email !!

    Un saludo y Gracias !

  3. admin

    Hola YoGuuu,

    Muchas gracias por tu comentario, me han ilusionado mucho tus palabras.
    Hace algunos meses que no actualizo el blog y ando bastate ocupado. Pero ahora que se avecinan cambios importantes con Zend Framework será cuestión de meterse otra vez.

    Agradezco tu propuesta y tomo nota para futuros posts!

    Gracias Otra vez y culaquier cosa… por aquí estamos!

  4. YoGuuu

    De nada ! Últimamente me ha decepcionado a mi mucho la documentación de Zend Framework. Por eso me gusta tanto ver blogs como el tuyo donde hay buenos articulos en castellano sobre ZF…

    Ahora estoy haciendo un proyecto base (soy novato xD), solo con un módulo “default”. Mi pensamiento es ponerle el código para que acepte un layout por modulo mediante plugin y no mediante actionHelpers como vi en otro ejemplo… y despues miraré donde tengo los ejemplos para ponerle un ACL Básico que también acepte módulos junto con la autenticación… A partir de ahí db y… uhmmmm…..

    Un Saludo !!!

  5. Daniko

    Hola buenos días:

    Tengo un formulario hecho con Zend form en donde deseo poner un campo fecha, es aca en donde tengo un problema pues deseo utilizar un datepicker pero no lo puedo configurar, hay una manera mas sencilla de hacer esto, espero que me pueda ayudar. Gracias,

    Saludos

  6. duckfuster

    Action View Helper? NO. View Helpers
    Dejo para el final un tema importante. El action view helper permite ejecutar un action de un controlador dado y retornar el contenido a la vista actual. En otras palabra, podemos ejecutar desde la vista un action de cualquier módulo. Por ejemplo, tenemos un action que carga un menú, entonces podemos hacer:

    1
    echo $this->action(‘menu’, ‘miControlador’, ‘miAction’);
    A primera impresión es una buena idea ya que podemos reutilizar código, “widgetizar” contenido., etc. Pero la realidad es otra. Desde el lado de rendimiento, ZF tiene que clonar la vista, realizar un dispatch adicional, copiar el request object.

    referencia :http://www.maestrosdelweb.com/editorial/guia-zend-vistas-view-helpers-layout/
    Si el action que llamamos esta en el mismo controlador y tenemos código en algún hook (predispatch, postDispatch, etc) lo estaríamos ejecutando dos veces. Y por otro lado y no menos importante, estamos pasando por alto el modelo MVC (la vista comunicándose con el controlador) y agregando una complejidad innecesaria a nuestro diseño.

    Pero si todo esto no termina de convencerlos para dejar de lado dicho helper, a partir de la versión 2.0 de Zend Framework, va a dejar de existir.

    ¿Cuál es la solución? Muy fácil, creamos un view helper que genere el menú y ya esta:

    1
    echo $this->menuLateral();
    Así que si estas tentado a usar el action view helper ten la seguridad que estas teniendo un problema de diseño en tu aplicación y que con total seguridad existe una solución alternativa que sea más simple y correcta.

  7. admin

    Si, no es la mejor opción. Yo por ahora sigo cargando un xml con la configuración de la navegación en el bootstrap y si necesito añadir o cambiar alguna cosa lo hago desde el controlador.

    Muchas gracias por tu aportación.

  8. Juan David

    hola a todos, estoy programando en zend framework y
    necesito visualizar un pdf en la web… alguien me puede decir como
    lo creo desde la programación sin necesidad de tener un plantilla
    pdf precargada ni guardarla, simplemente q se visualice y ya.
    ademas de eso, tengo configurado para programar entre un header y
    un footer, esto me genera problemas en lo q llevo echo hasta ahora,
    dice q el formato es a sido modificado o q no puede ser leido.
    gracias por su atención y por su valiosa colaboración.