Vous êtes sur la page 1sur 70

Arquitectura ModeloVista-Controlador (Model-View-Controller)

Modelo-Vista-Controlador (Model-View-Controller) es un patrn de desarrollo que separa la parte lgica de una aplicacin de su presentacin. Bsicamente sirve para separar el lenguaje de programacin del HTML lo mximo posible y para poder reutilizar componentes fcilmente.

Modelo: representa las estructuras de datos. Tpicamente el modelo de clases contendr funciones para consultar, insertar y actualizar informacin de la base de datos.
Vista: La vista consiste de los pequeos trozos de la aplicacin relacionados con la interfaz grfica del usuario. Usualmente esta se realiza en HTML. Una

vista puede ser una pgina web o una parte de una pgina.
Controlador: Acta como intermediario entre el Modelo, la Vista y cualquier otro recurso necesario para asegurar que los datos correctos se muestren en la pgina.
3

Zend Framework utiliza la arquitectura ModeloVista-Controlador (MVC). Esto se utiliza para separar las diferentes partes de su aplicacin y facilitar al mismo tiempo el desarrollo y mantenimiento de las mismas.

Solicitud
examina la solicitud y determina los componentes clave de la URL
IndexController.php ErrorController.php AlbumController.php

Controlador Frontal

encaminar la solicitud a un controlador adecuado y la accin


Base de datos

Router

Accin del Controlador

Modelo

Respuesta

Vista

Layout

Desarrollo de una aplicacin WEB


Vamos a construir un sistema de inventarios muy simple para mostrar nuestra coleccin de CDs. La pgina principal mostrar nuestra coleccin y nos permitir agregar, editar y eliminar CDs. Vamos a almacenar nuestra lista en una base de datos con un esquema como el siguiente:

Nombre del campo id artistas titulo

Tipo Integer Varchar(100) Varchar(100)

Puede ser Nulo No No No

Notas Primary key, autoincrement

Pginas necesarias
Las siguientes pginas sern necesarias:

Pgina de inicio

Mostrar la lista de los lbum y proporcionar vnculos para editarlos y eliminarlos. Tambin se proporcionar un vnculo para poder agregar nuevos lbum. Esta pgina proporcionar un formulario para agregar un nuevo lbum.

Agregar nuevo lbum

Editar un lbum

Esta pgina proporcionar un formulario para editar la informacin de un lbum ya almacenado.


Esta pgina solicitar una confirmacin de que queremos eliminar un lbum y posteriormente lo eliminar.

Eliminar un lbum

Organizacin de las pginas


Antes de colocar nuestros archivos, es importante entender la manera en que Zend Framework espera que dichas pginas estn organizadas. Cada pgina de la aplicacin se conoce como una accin y estas acciones se agrupan en controladores. Por ejemplo, para una URL con el formato http://localhost/public/testzf/public/noticias/mostrar

El controlador es noticias y la accin es mostrar.


Esto se hace para agrupar las acciones relacionadas. De hecho, un controlador noticias podra contener acciones de enlistar, archivar y mostrar. El sistema MVC de Zend Framework tambin soporta 8 mdulos para agrupar los controladores.

pero esta aplicacin no es muy grande as que no nos preocuparemos por ellos. De manera predeterminada los controladores de Zend Framework reservan una accin especial llamada index que se ejecutar como la accin por omisin.
Es decir, para una URL como http://localhost/testzf/public/noticias/ La accin index dentro del controlador noticias ser ejecutada. Tambin existe un controlador predeterminado que se ejecuta si omitimos el nombre del controlador.

No debera ser una sorpresa que tambin reciba el nombre de ndex.


Por lo tanto, la URL http://localhost/testzf/public/ Causar que se ejecute la accin index del controlador index. 9

Como tenemos cuatro pginas que trabajan sobre los lbums, las agruparemos en un nico controlador como cuatro acciones. Utilizaremos el controlador por omisin y las cuatro acciones sern:

Pgina Pgina de inicio Agregar un lbum

Controlador Index Index

Accin Index agregar

Modificar un lbum
Eliminar un lbum

Index
Index

modificar
eliminar

10

Configurando el controlador
Ahora estamos listos para generar el controlador. En Zend Framework, el controlador es una clase que debe llamarse :
Debe iniciar con una letra mayscula. Esta clase debe residir en un archivo llamado Controller.php

{Nombredelcontrolador}Controller. Este archivo debera estar dentro de la carpeta application/controllers. Nuevamente, {Nombredelcontrolador} debe iniciar con una mayscula y todas las dems letras debern ser minsculas. Cada accin es una funcin pblica dentro de la clase del 11 controlador y que debe nombrarse por {nombredelaaccion}Action.

En este caso, {nombredelaaccion}debe iniciar con una letra minscula y nuevamente debe completarse nicamente con letras minsculas. Tambin se permiten los nombre con maysculas y minsculas tanto en los nombres de los controladores como de las acciones, pero existen reglas especiales que deseamos que comprenda antes de utilizar ese tipo de nomenclatura. Primero verifique que la documentacin muestre la clase del controlador que se llamar IndexController y ser definida en la ruta del siguiente archivo : testzf/application/controllers/IndexController.php.
12

<?php class IndexController extends Zend_Controller_Action { public function init() { /* inicializa la accin del controlador aqui */ } public function indexAction() { // action body } function agregarAction() { } function modificarAction() { } function eliminarAction() { } } // fin de la clase 13

Ahora hemos establecido las cuatro acciones que queremos utilizar. Ellas todava no funcionarn hasta que establezcamos las vistas. Las URLs para cada accin son:
URL http://localhost/testzf/public/index/index http://localhost/testzf/public/index/agregar Accin IndexController::indexAction() IndexController::agregarAction()

http://localhost/testzf/public/index/modificar http://localhost/testzf/public/index/eliminar

IndexController::modificarAction() IndexController::eliminarAction()

Con esto tenemos un enrutador trabajando y las acciones se han establecido para cada pgina de nuestra aplicacin. Es el momento de construir las vistas(views).

14

Configurando la vista
El componente de las vistas de Zend Framework es llamado, de manera poco sorprendente, Zend_View. Este componente nos permite separar el cdigo que muestra las pginas del cdigo en el que se encuentran las funciones de accin.
El uso bsico de Zend_View es: $vista = new Zend_View(); $vista-> setScriptPath('/trayectoria/archivos_de_vista'); echo $vista->render('vistaScript.php');

Fcilmente podemos ver que si colocamos este cdigo directamente en cada una de las funciones de accin estaremos repitiendo cdigo estructural demasiado aburrido que no es interesante para la accin.
15

En su lugar deberamos hacer la inicializacin de la vista en cualquier otro lado y despus acceder nuestro objeto de vista ya inicializado dentro de cada funcin de accin. Los diseadores de Zend Framework previeron este tipo de problemas, la solucin es construir un ayudante de accin (helpers) para nosotros.

Zend_Controller_Action_Helper_ViewRenderer
Este se preocupa de inicializar una propiedad view (la vista $this->view) para nuestro uso y tambin le dar el formato al layout de la vista.

16

Para dar el formato a la vista se establece en el objeto Zend_View.


Para que busque en la carpeta views/scripts/{Nombredecontrolador} el layout de la vista al que se le dar el formato y aplicar el layout que es nombrado a partir de la accin con la extensin .phtml. Esto quiere decir que el guin que generar el despliegue con formato es: views/scripts/{Nombredelcontrolador}/{nombredelaaccion}.phtml y el contenido ya con el formato se agrega al cuerpo del objeto que Response. El objeto de respuesta Reponse se utiliza para pegar todos los elementos HTML de encabezado, contenido del cuerpo y excepciones generadas como resultado de utilizar el sistema MVC.

El controlador frontal enviar automticamente el encabezado seguido del contenido y al final la funcin dispatch.

17

Para integrar la vista dentro de nuestra aplicacin todo lo que necesitamos hacer es crear algunos archivos de vista y verificar que funcionen. El archivo Indexcontroller.php ya existe en la carpeta application/controller abrimos y agregamos el contenido especfico a la accin (como es el ttulo de la pgina) dentro de las acciones del controlador. (IndexController.php)
public function indexAction() { $this->view->title = "Mis Albums"; } function agregarAction() { $this->view->title = "Agregar un album"; } function modificarAction() { $this->view->title = "Modificar un album"; } function eliminarAction() { $this->view->title = "Eliminar un album"; }18 }

En cada funcin, asignamos un valor distinto a la variable title de la propiedad vista y eso es Todo.
Observe que el despliegue real no se puede hacer en este momento ste lo realiza el controlador frontal justo al final del proceso dispatch. Ahora necesitamos agregar cuatro vistas para nuestra aplicacin. Estos archivos se conocen como layouts de vista o plantillas, como se vio anteriormente, cada archivo de plantilla lleva el nombre de la accin correspondiente y tiene la extensin .phtml.
19

El archivo debe estar en una subcarpeta que llevara el nombre del controlador correspondiente, as que los cuatro archivos son:
testzf/application/views/scripts/index/index.phtml
<html> <head> <title><?php echo $this->escape($this->title); ?> </title> </head> <body> <h1><?php echo $this->escape($this->title); ?></h1> </body> </html>

Nota: Se borra todo el contenido


del archivo index.phtml y se coloca este cdigo.

20

testzf/application/views/scripts/index/agregar.phtml
<html> <head> <title><?php echo $this->escape($this->title); ?> </title> </head> <body> <h1><?php echo $this->escape($this->title); ?></h1> </body> </html> testzf/application/views/scripts/index/modificar.phtml <html> <head> <title><?php echo $this->escape($this->title); ?> </title> </head> <body> <h1><?php echo $this->escape($this->title); ?> </h1> </body> 21 </html>

Testzf/application/views/scripts/index/eliminar.phtml <html> <head> <title><?php echo $this->escape($this->title); ?> </title> </head> <body> <h1><?php echo $this->escape($this->title); ?></h1> </body> </html>

Pruebe cada controlador/accin navegando en las URLs mostradas con anterioridad; se debern desplegar los cuatro ttulos de las pginas (uno a la vez) dentro del navegador de Web.

22

Pantallas

1.- localhost/testzf/public/index

2.- localhost/testzf/public/index/agregar

4.- localhost/testzf/public/index/eliminar 3.- localhost/testzf/public/index/modificar 23

Cdigo HTML comn


Inmediatamente se vuelve obvio que hay demasiado cdigo HTML en comn en nuestras vistas. Este es un problema muy comn pero el componente Zend_Layout est diseado para resolver este problema.

Zend_Layout nos permite mover el cdigo comn de encabezados y pies de pgina dentro de un guin de esquema (layout) que integrar el cdigo de la vista especfico para la accin que se est ejecutando. Los siguientes cambios sern necesarios. Primero, debemos decidir donde colocar los layouts de los esquemas. El lugar recomendado es dentro de la carpeta application, as que deber crear una carpeta llamada layouts para almacenar los esquemas dentro de la carpeta testzf/ application.
Ahora debemos indicarle esta ubicacin al componente Zend_Layout 24 dentro del archivo de configuracin, as que abrimos el archivo application.ini que se encuentra en testzf/application/configs:

Insertar Aqu application.ini

resources.layout.layoutPath = APPLICATION_PATH "/layouts/"

25

Ahora necesitamos un cdigo de esquema para la vista. De manera predeterminada, se creara el archivo guin que se llamara layout.phtml que residir en la carpeta layouts. El cdigo se ve de la siguiente manera:
<!DOCTYPE html PUBLIC "// W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional. dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv=Content-Type content="text/html;charset=ut-f8/> <title><?php echo $this->escape($this->title); ?></title> </head> <body> <div id="contenido> <h1><?php echo $this->escape($this->title); ?></h1> <?php echo $this->layout()->content; ?> </div> </body> </html> 26

Una vez realizado el archivo layout.phtml elimine el contenido de los archivos dejando las etiquetas <html><body></body></html> de index.phtml, agregar.phtml, modificar.phtml y eliminar.phtml. Puede probar las 4 URLs nuevamente y no debe encontrar ninguna diferencia de la ltima vez que las prob! La diferencia clave es que esta vez el trabajo se realiza dentro del componente de esquema.

27

Estilo (css)
Creamos nuestro propio ayudante de vista, llamado baseUrl() que recolecta la informacin que requerimos del objeto solicitado. Esto nos proporciona el pedazo de la URL que no conocemos. Los ayudantes de vista se almacenan en la carpeta application/views/helpers y deben llevar el nombre {Nombredeayudante}.php (la primera letra debe ser mayscula) y la clase dentro de ese archivo se debe llamar Zend_Controller_Helper_{Nombredeayudante} (nuevamente, primera letra en mayscula). Debe haber una funcin dentro de la clase llamada {nombredeayudante}() (primera letra en minscula no lo olvide!).

28

En nuestro caso, el archivo se llamar BaseUrl.php y es el siguiente:


<?Php class Zend_View_Helper_BaseUrl { function baseUrl() { $fc = Zend_Controller_Front::getInstance(); return $fc->getBaseUrl(); } }

Una funcin no muy complicada, verdad? Simplemente recuperamos una instancia del controlador frontal y devolvemos la salida de la funcin miembro getBaseUrl(). Necesitamos agregar el archivo CSS a la seccin <head> del archivo application/layouts/layout.phtml
29

<head> <meta http-equiv=Content-Type content="text/html;charset=ut-f8 /> <title><?php echo $this-> escape($this->title); ?></title> <link rel="stylesheet" type="text/css" media="screen href="<?php echo /* Tablas */ $this-> baseUrl();?>/css/site.css" /> th { </head> Textalign: left; ... Finalmente, necesitamos creamos una } carpeta dentro de testzf/public llamada css td, th { Paddingright:5px; y agregamos el archivo site.css. } /* Estilo para el formulario */ body,html { form dt { margin: 0 5px; width: 100px; Fontfamily:Verdana,sansseri display: block; f; float: left; } clear: left; h1 { } Fontsize:1.4em; form dd { Marginleft:0; color: #008000; float: left; } } a{ form #submitbutton { 30 color: #008000; Marginleft:100px; } }

Cuando la aplicacin web este completa el css har que se muestre con el siguiente estilo (site.css)

31

BASE DE DATOS

32

Ahora que hemos separado el control de la aplicacin de las vistas, es tiempo de ver la seccin del modelo de nuestra aplicacin. Recuerde que el modelo es la parte que concierne al propsito central de la aplicacin (las tan nombradas - reglas del negocio) y por lo tanto, en nuestro caso, la que concierne a la base de datos. Haremos uso de la clase Zend_Db_Table de Zend Framework que se utiliza para buscar, insertar, actualizar y eliminar renglones de las tablas de una base de datos.

33

Configuracin
Configuracin Para utilizar Zend_Db_Table, necesitamos decir que base de datos utilizar as como un nombre de usuario y una clave o contrasea. Como preferimos no escribir en el cdigo de nuestra aplicacin esta informacin, utilizaremos un archivo de configuracin para almacenar esta informacin. Zend Framework incluye la clase Zend_Config para proporcionar un acceso flexible orientado a objetos todos los archivos de configuracin que pueden ser archivos ini o un archivo xml. Nosotros utilizaremos un archivo con formato ini llamado application.ini que se encuentra el la carpeta application/configs: (agregar el cdigo que esta 34 encerrado en un ovalo).

testzf/application/configs/application.ini

Nota:

Los identificadores host, username, password y dbname deben conservar estos nombre ya que las bibliotecas de acceso a la base de datos lo reconocer de esta forma. Por ejemplo, si cambia db.params.username por db.params.usuario, obtendr un serie de errores y su aplicacin no funcionar. 35

Obviamente, debe colocar su nombre de usuario, su clave y nombre de la base de datos. Para aplicaciones de mayor tamao con muchos archivos de configuracin podra decidir en crear una carpeta adicional, por ejemplo application/config y almacenar all todos sus archivos de configuracin, sin mezclarlos con los dems. El uso de Zend_Config es muy fcil: $config = new Zend_Config_Ini('config.ini', {nombredeseccion});

Vea que en este caso, Zend_Config_Ini slo carga la seccin {nombredeseccion} a partir del archivo 'config.ini', no todas las secciones (aunque se pueden cargar todas las secciones si as lo desea). 36

Configuracin de Zend_Db_Table
Para utilizar Zend_Db_Table, necesitamos pasarle la configuracin de la base de datos que acabamos de cargar. Para esto, tenemos que crear una instancia de Zend_Db y despus registrarla con la funcin esttica Zend_Db_Table:: setDefaultAdapter(). Nuevamente, esto lo realizamos dentro del archivo de inicio: testzf/public/index.php.
Introducimos el cdigo que se encuentra en la siguiente diapositiva encerrado en un ovalo.
37

38

Con esto agregamos, la autocarga de clases que trae ZendFramework, Zend_Loader_Autolader::getInstance() nos incluye las clases sin tener que cargarlas explcitamente con Zend_Loader::loadClass(), includes o require cuando las necesitemos, Zend Framework lo hace automticamente por nosotros.
protected function _initView() Insertar este cdigo en { Bootstrap.php $view = new Zend_View(); $view->setEncoding('UTF-8'); $view->doctype('XHTML1_STRICT'); $view->headTitle('Mi Primera Aplicacion en Zend Framework'); $view->headMeta()->appendHttpEquiv( 'Content-Type', 'text/html;charset=utf-8' ); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' ); $viewRenderer->setView($view); return $view; } 39

Creacin de la tabla
Creamos la base de datos llamado discos y utilizando la instruccin MySQL para crear la tabla albums es: CREATE TABLE albums ( id int(11) NOT NULL auto_increment, artista varchar(100) NOT NULL, titulo varchar(100) NOT NULL, PRIMARY KEY (id) ); Ejecute esta instruccin en un cliente de MySQL tal como phpMyAdmin o el cliente estndar de la lnea de comandos de MySQL (recuerde que debe crear la base de datos y establecer los permisos de acceso para su 40 cuenta de usuario).

Insercin de Albums de prueba


Tambin vamos a insertar un par de renglones en la tabla de tal forma que podamos probar la funcionalidad de recuperacin desde la pgina de inicio. Voy a considerar los dos CDs que aparecen en las listas de Los ms vendidos desde mazon.co.uk: INSERT INTO albums (artista, titulo) VALUES ('Duffy', 'Rockferry'), ('Van Morrison', 'Keep It Simple');

41

El Modelo
Zend_Db_Table_Abstract es una clase abstracta, as que necesitamos derivar nuestra clase que es especfica para manipular albums. No importa el nombre que le demos a nuestra clase, pero tendr ms sentido si le damos el mismo nombre que a nuestra tabla de la base de datos. Por lo tanto, nuestra clase se llamar Application_Model_Albums ya que el nombre de nuestra tabla es albums.

42

Para indicarle a Zend_Db_Table_Abstract el nombre de la tabla que manejar, tenemos que establecer la propiedad protegida $_name para que contenga el nombre de la tabla. Adicionalmente, Zend_Db_Table_Abstract asume que la tabla tiene una llave primaria llamada id que se incrementa automticamente desde la base de datos.

El nombre de este campo tambin se puede cambiar si se requiere.


Colocaremos nuestra clase Application_Model_Albums en un archivo llamado Albums.php dentro de la carpeta applications/models: 43

testzf/application/models/Albums.php <?php class Application_Model_Albums extends Zend_Db_Table_Abstract { protected $_name = 'albums'; }

No es tan complicado verdad?! Afortunadamente para nosotros, nuestras necesidades son muy simples y Zend_Db_Table_Abstract proporciona toda la funcionalidad que necesitamos. Sin embargo, si requiere de funcionalidad especfica para manejar su modelo, entonces esta es la clase donde debe colocarla. Tambin puede indicarle a Zend_Db_Table_Abstract acerca de tablas relacionadas y que pueda recuperar datos relacionados de diferentes tablas tambin.
44

Despliegue de Al bums
Ahora que hemos establecido la configuracin y la informacin de la base de datos, nos podemos sumergir en la cuestin de la aplicacin y desplegar algunos albums. Esto se realiza dentro de la clase IndexController e iniciamos con el despliegue de algunos albums almacenados en la tabla con la funcin indexAction(): testzf/application/controllers/IndexController.php public function init() { /* Initialize action controller here */ } function indexAction() { $this->view->title = "Mis Albums"; $albums = new Application_Model_Albums(); $this->view->albums = $albums->fetchAll(); } ... 45

La funcin fetchAll() devolver un arreglo de renglones en Zend_Db_Table_Rowset que nos permite iterar sobre los renglones obtenidos desde el archivo del layout de vista para esta accin. Podemos escribir lo siguiente en el archivo index.phtml:

testzf/application/views/scripts/index/index.phtml

<p><a href="<?php echo $this-> url(array('controller'=>'index', 'action'=>'agregar')); ?>">Agregar nuevo album</a></p> <table> <tr> <th>T&iacute;tulo</th> <th>Artista</th> <th>&nbsp;</th> </tr> <?php foreach($this->albums as $album) : ?> <tr> <td><?php echo $this->escape($album->titulo);?></td> <td><?php echo $this->escape($album->artista);?></td> <td>
46

<a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'modificar', 'id'=>$album->id));?>">Modificar</a> <a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'eliminar', 'id'=>$album->id));?>">Eliminar</a> </td> </tr> <?php endforeach; ?> </table>
Lo primero que hacemos es crear un vnculo a Agregar nuevo album. El ayudante de vista url() se proporciona por el entorno de Zend y ayuda a crear vnculos que contengan la URL de base de manera correcta. Simplemente pasamos en un arreglo los parmetros que necesitamos y el resto funcionar como se requiere. Entonces creamos una tabla en html para desplegar el ttulo de cada album, artista y proporcionar vnculos que permitan modificar o eliminar ese registro.
47

Se utilizar un ciclo foreach() estndar para iterar sobre la lista de los albums, y utilizamos de forma alternada un punto y coma y endforeach; esto es ms fcil de depurar que tratar de empatar parntesis o corchetes. Nuevamente, el ayudante de vista url() se utiliza para crear los vnculos a modificar y eliminar.
La URL http://localhost/testzf/public deber mostrar una excelente lista de (dos) albums, algo como esto:

48

Agregar nuevo album


Ahora podremos codificar la funcionalidad para agregar albums. Existen dos cdigos en esta parte: Desplegar un formulario para que el usuario escriba los detalles Procesar el formulario de envo y almacenar en la base de datos Utilizamos Zend_Form para hacer esto. El componente Zend_Form nos permite crear un formulario y validar los datos. Crearemos el nuevo modelo de clase Application_Model_AlbumForm que extiende a Zend_Form para definir nuestro formulario:

testzf/application/models/Albumform.php
49

<?php class Application_Model_Albumform extends Zend_Form { public function __construct($options = null) { parent::__construct($options); $this->setName('album'); $id = new Zend_Form_Element_Hidden('id'); $artista = new Zend_Form_Element_Text('artista'); $artista->setLabel('Artista') /* pone la etiqueta Artista */ ->setRequired(true) /* Hace este elemento requerido */ ->addFilter('StringTrim') /* asegurando que el elemento tenga algn valor cuando sea requerido. */ ->addValidator('NotEmpty'); $titulo = new Zend_Form_Element_Text('titulo'); $titulo->setLabel('Titulo') ->setRequired(true) ->addFilter('StripTags') /* eliminar cdigo HTML no deseado */ ->addFilter('StringTrim') /* espacios innecesarios. */ ->addValidator('NotEmpty'); $envio = new Zend_Form_Element_Submit('envio'); $envio->setAttrib('id', 'submitbutton'); $this->addElements(array($id, $artista, $titulo, $envio)); 50 } }

Dentro del constructor de AlbumForm, creamos cuatro elementos para id, artista, titulo, y el botn de envi. Para cada elemento establecemos varios atributos, que incluyen las etiquetas que se deben desplegar. Para los elementos de texto agregamos dos filtros, StripTags y StringTrim para eliminar cdigo HTML no deseado y espacios innecesarios. Tambin decimos que esos elementos son requeridos y agregamos un validador NotEmpty para asegurar que el usuario realmente inserta la informacin que se requiere. Ahora necesitamos obtener el formulario, desplegarlo y procesarlo con el envo. Esto se hace dentro de agregarAction():

51

Testzf/ application/controllers/IndexController.php ... function agregarAction() { $this->view->title = "Agregar un Album"; $form = new Application_Model_Albumform(); $form->envio->setLabel('Agregar'); $this->view->form = $form; if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { $albums = new Application_Model_Albums(); $row = $albums->createRow(); $row->artista = $form->getValue('artista'); $row->titulo = $form->getValue('titulo'); $row->save(); $this->_redirect('/'); } else { $form->populate($formData); } } } ... 52

Examinemos este cdigo con un poco de detalle:


$form = new Application_Model_Albums(); $form->envio->setLabel('Agregar'); $this->view->form = $form; Aqu creamos una instancia de nuestra clase Application_Model_Albumform(); , establecemos la etiqueta para el botn de envo en Agregar y asignamos el objeto a la vista para su despliegue. if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { Si el mtodo isPost() del objeto request es verdadero, quiere decir que el formulario se ha enviado y entonces recuperamos los datos del formulario utilizando el mtodo getPost() y verificamos si son vlidos utilizando la funcin miembro 53 isValid().

$albums = new Application_Model_Albums(); $row = $albums->createRow(); $row->artista = $form->getValue('artista'); $row->titulo = $form->getValue('titulo'); $row->save(); $this>_redirect('/');

Si el formulario es vlido, entonces hacemos una instancia del modelo de clase Application_Model_Albums y utilizamos createRow() para generar un rengln vaco que despus llenaremos con los datos artista y titulo antes de guardarlo. Despus de guardar el rengln con el nuevo album, redireccionamos utilizando el mtodo _redirect() del controlador, que nos llevar a la pgina de inicio.
54

} else { $form->populate($formData); }
Si los datos en el formulario no son vlidos, entonces volveremos a llenar el formulario con los datos que insert el usuario y desplegamos la pgina otra vez. Ahora necesitamos darle formato al formulario en el layout de la vista agregar.phtml:

testzf/application/views/scripts/index/agregar.phtml
<?php echo $this->form ;?>

Como puede ver, darle formato a un formulario es muy simple ya 55 que el formulario conoce la manera en que se debe desplegar l mismo.

Modificar un lbum
La modificacin de los datos de un album es casi idntica a agregar uno, as que el cdigo es muy similar: testzf/application/controllers/IndexController.php ... function modificarAction() { $this->view->title = "Modificar un Album"; $form = new Application_Model_Albumform(); $form->envio->setLabel('Guardar'); $this->view->form = $form; if ($this>_request->isPost()) { $formData = $this>_request->getPost(); if ($form->isValid($formData)) { $albums = new Application_Model_Albums(); $id = (int)$form->getValue('id'); $row = $albums->fetchRow('id='.$id); $row->artista = $form->getValue('artista'); $row->titulo = $form->getValue('titulo'); $row->save(); $this->_redirect('/'); 56

} else { $form->populate($formData); } } else { // El id del album se obtiene en $params['id'] $id = (int)$this->_request->getParam('id', 0); if ($id > 0) { $albums = new Application_Model_Albums(); $album = $albums->fetchRow('id='.$id); $form->populate($album->toArray()); } } } ...

Busquemos las diferencias de agregar un lbum. Primero, cuando desplegamos al formulario al usuario, necesitamos haber obtenido el ttulo y el artista del lbum desde la base de datos y haber llenado los elementos del formulario con ellos:
57

// El id del album se obtiene en $params['id'] $id = (int)$this->_request->getParam('id', 0); if ($id -> 0) { $albums = new Application_Model_Albums(); $album = $albums->fetchRow('id='.$id); $form->populate($album->toArray()); }
Esto se hace si el request no es un POST y se utiliza el modelo para recuperar un rengln de la base de datos. La clase Zend_Db_Table_Row tiene una funcin miembro llamada toArray() que puede usarse para llenar el formulario directamente. Finalmente, necesitamos guardar los datos modificados en el rengln correcto de la base de datos. Esto se realiza al recuperar el identificador del rengln y guardar los nuevos datos:

58

$albums = new Application_Model_Albums(); $id = (int)$form->getValue('id'); $row = $albums->fetchRow('id='.$id); La plantilla de vista es la misma que para agregar.phtml: testzf/application/views/scripts/index/modificar.phtml <?php echo $this->form ;?>

Ahora ya puede agregar y modificar albums.

59

Eliminar un lbum
Para redondear nuestra aplicacin, funcionalidad de eliminacin de albums. necesitamos agregar la

Tenemos un vnculo Eliminar a continuacin de cada lbum en la pgina principal, y la funcionalidad correspondiente sera eliminarlo cuando se haga click sobre este vnculo. Esto no sera del todo correcto. Recuerde nuestra especificacin HTML, recuerde que no podra hacer una accin irreversible utilizando GET y en su lugar podra usar POST. Deberamos mostrar un formulario de confirmacin cuando el usuario haga click en Eliminar y si despus hace click en Si, ejecutaramos la eliminacin. Como este formulario es trivial, crearemos un formulario en HTML dentro del guin de vista.
60

Iniciemos con el cdigo de la accin:


testzf/application/controllers/IndexController.php ... function eliminarAction() { $this->view->title = "Eliminar un Album"; if ($this->_request->isPost()) { $id = (int)$this>_request->getPost('id'); $del = $this->_request->getPost('del'); if ($del == 'Si' && $id > 0) { $albums = new Application_Model_Albums(); $where = 'id = ' . $id; $albums->delete($where); } $this->_redirect('/');

61

} Else { $id = (int)$this->_request->getParam('id'); if ($id > 0) { $albums = new Application_Model_Albums(); $this->view->album = $albums->fetchRow('id='.$id); } } } ...
Utilizamos el mtodo isPost() en request para definir si debemos desplegar el formulario de confirmacin o si realizamos la eliminacin, por medio de la clase Application_Model_Albums(). La eliminacin efectiva se realiza mediante una llamada al mtodo delete() de la clase Zend_Db_Table_Abtract. Si el valor de request no es un POST, entonces buscamos el parmetro id, recuperamos el registro correcto de la base de datos y lo asignamos a la vista.
62

El guin de la vista es un formulario simple: Testzf/application/views/scripts/index/eliminar.phtml <?php if ($this->album) :?> <p>Esta seguro que desea eliminar este lbum '<?php echo $this-> escape($this->album->titulo); ?>' por <?php echo $this->escape($this->album->artista); ?>'? </p> <form action="<?php echo $this-> url(array('action'=>'eliminar')); ?>" method="post"> <div> <input type="hidden" name="id" value="<?php echo $this-> album-> id; ?>" /> <input type="submit" name="del" value="Si" /> <input type="submit" name="del" value="No" /> </div> </form> <?php else: ?> <p>No se puede recuperar este lbum.</p> <?php endif;?> 63

En el layout, desplegamos un mensaje de confirmacin para el usuario y un formulario con los botones Si y No. En la accin, verificamos especficamente por el valor Si para eliminar el registro. Esto es todo! - ahora completamente funcional. usted tiene una aplicacin

64

65

Solicitud
examina la solicitud y determina los componentes clave de la URL

Controlador Frontal

encaminar la solicitud a un controlador adecuado y la accin


Base de datos
Class Zend_Db_Table_Abstract

Router Class Zend_Controller_Action

Accin del Controlador

Modelo

Zend_Form

Respuesta

Vista

Layout

66

Class Zend_Views

La clase Bootstrap define que recursos y componentes son inicializados. Por default, Zend Framework's es inicializado del controlador frontal, y es usa el directorio de default application/controllers/

67

Despus de validar el formulario, originalmente se necesitar recuperar los valores para poder ejecutar otras operaciones, tal como actualizar una base de datos o notificar un servicio web. Se pueden recuperar todos los valores para todos los elementos usando getValues(); getValue($name) le permite recuperar un solo valor del elemento por su nombre:

// Obtener todos los valores: $values = $form->getValues();


// Obtener slo los valores del elemento 'foo': $value = $form->getValue('foo');

A veces se quiere llenar el formulario con valores especficos antes de generarlos. stos pueden ser llevados a cabo ya sea con los mtodos setDefaults() o populate():
$form->setDefaults($data); $form->populate($data);

Por otro lado, si se quisera limpiar el formulario antes de llenarlo o validarlo; se puede realizar usando el mtodo reset():
$form->reset();

68

Validacin
Un caso de uso primario para formularios es validar datos enviados. Zend_Form le permite validar un formulario entero de una vez, o una parte de l, asi como tambin automatizar las respuestas de validacin para XmlHttpRequests (AJAX). Si los datos enviados no son vlidos, contiene mtodos para recuperar los distintos cdigos errores y los mensajes de elementos y subformularios de validaciones fallidas. Para validar un formulario entero, use el mtodo isValid(): if (!$form->isValid($_POST)) { // validacin fallida } isValid() validar cada elemento requerido, y algn elemento no requerido contenido en la data sometida. Algunas veces se necesitar validar slo un subset del dato; para esto use isValidPartial($data): if (!$form->isValidPartial($data)) { // validacin fallida } isValidPartial() slo intenta validar aquellos elementos en la informacin para los cuales existen similares elementos; si un elemento no es representado en la informacin, es pasado por alto. 69

http://angelorum.blogspot.com/2010 /09/zend-framework-3-estructuradel.html

http://www.backtheweb.com/php/zendframework-como-hacer-un-layout-paracada-modulo.html Solucion a multiples layouts

70

Vous aimerez peut-être aussi