Por favor, haz un clic sobre los anuncios cuando pases por mi blog, ya? =)

Zend Framework 12: La importancia de $this->render() y $this->partial() en layout.phtml y las vistas

22 comentarios
Esta es la parte número doce de mi tutorial de Zend Framework. La parte anterior está aquí.

Como vimos en un tutorial anterior, si en ZF llamamos al comando
enable layout

entonces creamos una plantilla común para todo el sitio. En esta página podemos colocar el html 'global' del sistema, y en el lugar en donde queramos colocar el html de la vista, hacemos

<?php echo $this->layout()->content; ?>

Y que cualquier variable que le hayamos asignado a la vista, la podemos mostrar con

<?php echo $this->nombreVariable; ?>

Pero pensamos un poco en un sitio más complejo. En ese sitio tenemos una capa (div) con un header, que tiene un logo del sitio.
También tendremos una capa (div) de footer, con enlaces al copyright y contacto del sitio. Y colocaremos una columna al lado derecho donde mostraremos algunos banners de publicidad. El banner publicitario sólo se mostrará en la página de inicio.




Fácilmente podremos poner todo esto en nuestro archivo layout.phtml. Eso sí, el html se volverá algo confuso, entre tanto tag y div mezclado. ¿y cómo lograr que el banner publicitario se muestre solo cuando estemos en la página principal? Pues tendremos que enviar alguna variable desde la vista, podría ser una variable showBanner = true, y preguntar por esa variable en layout.phtml, para decidir si renderizar el banner en la página o no.

Simple, ¿verdad...?

Pues trata de hacer eso con un sitio con un layout complejo, llamadas javascript incluídas, y verás crecer tu archivo a tamaños astronómicos.

¿No habrá una forma de poder incluir trozos de código en layout.phtml? Y pensemos en las vistas (arch .phtml). También pueden crecer demasiado, o repetir código de otras vistas. La pregunta se repite: ¿No habrá una forma de poder incluir trozos de código en mis vistas .phtml?

Pues sí hay: $this->render() y $this->partial(). Estas se usan así:





(imágen sacada de acá)

Como podemos ver, con render("header.phtml"); ?>
el sistema cargará el contenido del archivo header.phtml dentro de layout.phtml, el que puede contener código html, PHP y/o javascript. Lo mismo pasa con  render("footer.phtml"); ?>

Estos archivos deben estar guardados en /application/views/scripts, es decir:
/application/views/scripts/header.phtml
/application/views/scripts/footer.phtml

Si llamamos a $this->render("archivo.phtml"), el archivo a renderizar tendrá acceso a todas las variables que recibe layout.phtml desde la vista.
Sin embargo, si llamamos a $this->partial("archivo.phtml"), el archivo a renderizar no tiene acceso a las variables de layout.phtml. Pero nosotros podemos enviarle variables usando el segundo parámetro:
$this->partial("archivo.phtml", array('var1' => 'value 1', 'var2' => 'value 2'));

Se recomienda usar $this->render(), y sólo usar $this->partial() cuando sea necesario enviar nuevas variables al script.phtml.

Ambas funciones se pueden llamar desde layout.phtml o desde dentro de cualquier vista. Pensemos qué significa eso. Todo el código html duplicado podría colocarse dentro de archivos .phtml, y luego definir variables antes de llamar a $this->render(), o enviarselas usando el 2do argumento de $this->partial(). podríamos poner todos los enlaces a los archivos javascript y css que vamos a usar dentro de un script, y luego llamarlo desde layout.phtml usando $this->render(). Nuestro sitio quedará fomrado de peqqueñas partes ensamblables.


Maravilloso ¿verdad?


Palabras finales
Bien, con esto se termina mi tutorial básico-intermedio de Zend Framework.

Una vez que se tiene una idea de cómo hacer un sistema usando el framework, lo mejor es ir al manual de referencia oficial. Contiene mucha información importante acerca de aspectos específicos del sistema. Recomiendo leerlo completo. Yo lo hice, y me ha servido bastante.

Desde acá puedes descargar el proyecto de prueba:
http://www.mediafire.com/?a0zy45x36nbmv6g

Saludos a todos quienes pasen por acá. 

22 comentarios :

Anónimo dijo...

Saludos Hermano, excelente su post, me fue de gran ayuda, seria genial si hace un nuevo articulo con un archivo pdf o .doc de su tutorial...

zona info dijo...

Excelente, me sirvio de mucho.
Muchas gracias.
Saludos desde uruguay!

Travianero dijo...

Tu tutorial ha estado 10 puntos. Excelente trabajo. Seria genial si te animas a hacer mas de estos o realizar un proyecto mediano usando zend para aprender mas como seria en un caso real. Gracias infinitas!!!

Angelorum dijo...

Muchisimas gracias por los agradecimientos (valga la redundancia xd)


De hecho, he estado pensando en hacerme un blog dedicado exclusivamente a la programación, pero ahí veremos :P

Saludos, me alegro que te haya servido :P

Adriana dijo...

Hola! felicidades por tu tutorial del framework Zend, es excelente.
Me encantaria que hicieras una parte integrando Smarty, seria genial o sabes un buen lugar donde pueda encontrar alguno?
Gracias.
Un cordial saludo,
Adriana.

Anónimo dijo...

Excelente Ayuda. la Verdad no hallé otro lugar para los que comenzamos en Zf, con en estilo aquí encontrado. Gracias,
Walter.

Manuel dijo...

Excelente el tutorial completo. Me ha servido de mucho. Muchas gracias.

Carlos Ayala dijo...

Hola.

Tengo una aplicacion modular, y tengo el problema de que el partial y render, solo me funcionan si el phtml esta en el view/script del modulo.

Pero no puedo acceder desde otros modulos al phtml.

Por lo tanto no me sirve, y estoy ocupando helpers hechos por mi para ese cometido.

Saludos!

Anónimo dijo...

Saludos,
Realmente me ayudo bastante este tutorial. Muchas gracias ....

Atte

Alonso

The_Oracle dijo...

Amigo Angelorum te felicito y te doy mis mas sinceros agradecimientos, es el mejor tutorial que eh encontrado, anduve buscando y rebuscando informacion de cero en ZF y llegue por aqui, como dicen en taringa +10 jajaja, pero bueno, ahora que tengo las bases me dedicare a crear un projecto para mi tesis. Saludos desde Peru.

Anónimo dijo...

Gracias por el excelente tutorial, lo realicé de principio a fin... muy claro y preciso. Me ahorraste varios días de investigación... Felicidades. Un fuerte abrazo desde Ecuador.

Anónimo dijo...

Buenas gente que tal como estan.
Tengo una duda,enque parte se indica que tiene que utilizar la accion addAction,¿Cual es el codigo que me indica eso?
Agradesco mucho su respuesta.
que tenga un buen dia.

Alvaror65 dijo...

impresionante lo suyo Angelorum, desde hace mucho tiempo, yo digo y creo que el conocimiento no se le niega a nadie, el que lo hace demuestra su "poco" conocimiento. Un aplauzo para usted Angelorum.

ricardo dijo...

Hola excelente tutorial,pero tengo una duda al crear una accion me aparece lo siguiente

Note: PHPUnit is required in order to generate controller test stubs.
Note: The canonical controller name that is used with other providers is "Album"; not "album" as supplied
Creating an action named update inside controller at C:\xampp\htdocs\miproyecto/application/controllers/AlbumController.php
An Error Has Occurred
Provided docblock line is does not contain a valid tag

Zend Framework Command Line Console Tool v1.11.9
Details for action "Create" and provider "Action"
Action
zf create action name controller-name[=Index] view-included[=1] module

He intentado encontrar info ,pero no veo solucion

Gracias

Angelorum dijo...

Sí, es un error extraño.

Lo que pasa es que el programa que crea la accion dentro del controlador (zf.bat o zf.sh) al parecer no parsea bien el codigo que ya tienes escrito en el controlador en donde agregarás la nueva acción (update).
Eso pasa cuando tienes muchas lineas de codigo escritas en ese controlador.

Lo que yo hago es cortar todo el código de la clase controladora, entonces creo la acción (update, en este caso) y después vuelvo a pegar el código que antes corté... y funciona.

ricardo dijo...

Estimado

Muchas gracias corte la mayoría de código guarde y después no tuve problemas

De nuevo muchas gracias y felicitaciones por el tutorial

Anónimo dijo...

Te felicito por tu tutorial me ha servido de mucho y estoy muy agradecido con ello. Queria pedirte un favor, podrias poner un ejemplo de zend paginator,veras tengo problemas con esto:

te dejo mi codigo,
me muestra la 1ra vez bien los datos con sus respectivos numeros para paguinarse,pero cuando selecciono una paguina (1,2,3) no me muestra resultados y me muestra un error(An error occurred
Application error)
--que estoy haciendo mal,gracias por todo.


-controlador "buscarcanseones":

public function indexAction()
{


if ($this->getRequest()->isPost()){
$buscar = $this->getRequest()->getPost('buscar');
$table = new Application_Model_DbTable_Buscarcanseones();
$productos=$table->BuscarCanseones($buscar);

$page = $this->_getParam('page', 3); // obtenemos la página actual
$registros_pagina = 3;// número de registros a mostrar por página
$rango_paginas = 10; // número máximo de páginas a mostrar en el paginador

$paginador = Zend_Paginator::factory($productos);
$paginador->setItemCountPerPage($registros_pagina)
->setCurrentPageNumber($page)
->setPageRange($rango_paginas);

$this->view->productos = $paginador;
}

}
/////////////////
-en la vista:
/////////////////
productos as $d) :
$this->escape($d->nom_artistas)."";
endforeach;

echo $this->paginationControl($this->productos,'Sliding','buscarcanseones/paguinar.phtml');
?>

///////////////
en paguinar.phtml
///////////////

pagesInRange as $page){
?>

">






GRACIAS POR TODO

Julio dijo...

Hola Hola gente, todo excelente; excepto un gran problema que aun no he logrado solucionar, se trata del problema de las tildes al momento de editar un registro, Carga cualquier contenido excepto una palabra con tilde o ñ.
He puesto cabeceras meta ...; tambien he probado con charset=utf-8, charset=ISO-8859-1. pero ninguna me funciona :S. Es de suma importancia esto, ojala alguien me pueda ayudar por favor.
No se si hay un setRequired(); o algo que se pueda integrar para que al momento de editar me carge el contenido con "'" y "ñ".
Si a alguien lo gro solucionar este gran inconveniente porfa envieme un email a ANT.INFORMATIC@GMAIL.COM
le estare eternamente agradecido.
gracias y saludos a la comunidad.

Anónimo dijo...

EXCELENTE!

Anónimo dijo...

Hola, excelente este tutorial, muy claro y da una idea general sobre la filosofia de trabajo de esta util herramienta, Gracias.

Anónimo dijo...

Me gustaría que enseñaras Zend con Bootstrap twitter, seria fantastico,
yo no he podido ni siquiera empezar y lo necesito para mañana : p ya me las ingeniare

weilah dijo...

No he acabado todo el tutorial, pero aún estando en la mitad te doy ya las gracias por dedicar tu tiempo a explicar al personal como funciona el tinglado de Zend.

Muchas gracias, really!