Comenzando con Zend Framework: III Parte

Por zsamer en Abril 14, 2008

Continuando con el capitulo anterior “Implementando MVC con ZF”, en esta tercera entrega del set de artículos Comenzando con Zend Framework, vamos a ver lo simple que es desarrollar formularios con Zend_Form.

Para todo desarrollador de aplicaciones web una tarea cotidiana es tener que lidiar con estos una y otra vez, que sin duda se convierte en algo monótono y tedioso, eso es cosa del pasado! Con ZF hacer formularios es simple, robusto y entretenido, aprovechando todo el potencial de la POO implementa un poderoso diseño que incorpora un completo conjunto de funcionalidades que nos ahorra tiempo y dolores de cabeza como es la validaciones de datos, filtros, flexibilidad en la configuración, orden de los elementos, decorados CSS/XHTML y mucho más.

Agregando un formulario a nuestro IndexController quedaría de la siguiente forma:

quickstart/application/controllers/IndexController.php

PHP:
  1. <?php
  2. require_once 'Zend/Controller/Action.php';
  3. class IndexController extends Zend_Controller_Action
  4. {
  5.     public function indexAction()
  6.     {
  7.         $form = $this->getAddCommentForm();
  8.         if ($this->getRequest()->isPost()) {
  9.             if ($form->isValid($_POST)) {
  10.                 $values = $form->getValues();
  11.                 $this->view->values = $values;
  12.                 // Hacer otras cosas, como guardar los datos en una tabla.
  13.             }
  14.         }
  15.         $this->view->title = 'Comentarios';
  16.         $this->view->form = $form;
  17.     }
  18.  
  19.     public static function getAddCommentForm()
  20.     {
  21.         require_once 'Zend/Form.php';
  22.         $form = new Zend_Form(array(
  23.             'method'   => 'post',
  24.             'elements' => array(
  25.                 'comments' => array('textarea', array(
  26.                     'required' => true,
  27.                     'label' => 'Deja tu comentario'
  28.                 )),
  29.                 'submit' => array('submit', array(
  30.                     'label' => 'Enviar'
  31.                 ))
  32.             ),
  33.         ));
  34.         return $form;
  35.     }
  36. }

Como pueden ver Zend_Form se ocupa de la forma más elegante del manejo de los datos. Validación, el filtrado, mostrar errores, etc.

y nuestra vista index.phtml quedaría de la siguiente forma:

quickstart\application\views\scripts\index\index.phtml

PHP:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3.   <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.     <title>Zend Framework Quick Start</title>
  6.   </head>
  7.   <body>
  8.   <h1><?php echo $this->title; ?></h1>
  9.     <?php if($this->values) : ?>
  10.     <h3>Has enviado los siguientes valores:</h3>
  11.     <ul>
  12.       <?php foreach ($this->values as $value) :?>
  13.       <li>
  14.         <?= $this->escape($value); ?>
  15.       </li>
  16.       <?php endforeach; ?>
  17.     </ul>
  18.     <?php endif; ?>
  19.     <?= $this->form; ?>
  20.   </body>
  21. </html>

Para ver en acción nuestra aplicación abrimos el navegador y escribimos la siguiente url: http://localhost/quickstart/public/

Simple, limpio y robusto, hemos llegado al final de este tutorial, aunque corto espero que haya sido de utilidad, en el próximo veremos algo de configuraciones y como tener acceso a nuestra base de datos Mysql para leer y guardar datos enviados desde un formulario (como el de este tutorial :-) )

Hasta la próxima.

Comentarios

26 Responses to “Comenzando con Zend Framework: III Parte”

  1. Pablo Morales on Abril 19th, 2008 1:45 am

    Me surge una contradiccion con Zend_Form y es que si yo quisiera cambiar algo de un formulario como agregar un campo mas o cambiar el tittle o algo que tenga que ver con el formulario html, tendria que tocar el Controller, esto no es algo contrario a MVC?

    Si yo quisiera dejar la carpeta Vistas para que los disenadores trabajen en ella como quisieran, con Zend_Form tambien tendria que darle acceso a la logica de negocio, que se supone que no deberia tener nada mas que la logica de negocio.

    Por este motivo no implemente en ningun desarrollo esta nueva libreria.

  2. zsamer on Abril 19th, 2008 6:34 pm

    Es válido lo que dices, personalmente prefiero agregar el CSS del diseñador en Zend_Form y dejarlo en el modelo o controlador, en realidad pasa por un tema de comodidad y diseño de cada uno, siempre hay muchas opciones preferencias y camino para llegar al mismo resultado, aveces unas mejor que otra.

  3. _imc_ on Abril 21st, 2008 5:13 pm

    Hola, he encontrado un ejemplo http://akrabat.com/2008/02/21/simple-zend_form-example/ y los Zend_Form no lo deja ni en el modelo ni en el controlador, sino que los agrupa en otro “directorio”…
    Cual es la mejor opción: modelo, controlador o esta última.

    Saludos

  4. zsamer on Abril 21st, 2008 5:50 pm

    Antes que nada, gracias por los comentarios, en el último articulo se estuvo discutiendo el mismo tema. te pongo el link Comenzando con Zend Framework: IV Parte

    Personalmente me acomoda más en el modelo, ya que se involucra la el filtado y validación de los datos ingresados por el usuario en el form.

    Pero cualquiera de las tres esta bién, cada desarrollador tiene sus propios métodos, diseño y comodidad.

    saludos

  5. Enrique Place on Abril 23rd, 2008 3:21 pm

    Pablo: lo del tema de los diseñadores es contrario a este tipo de filosofías (al estilo Smarty).

    Si tienes el caso de necesitar diseñadores, no necesarimante debes permitirles acceder a las vistas, es más, ese es tu trabajo. Deberías pedirles el diseño en html estándar y luego tú “maquetarlo” para que ande.

    Distinto es si usas algo similar a Smarty que se da la posibilidad que un diseñador pudiera tocar las plantillas de forma directa, pero ante cuanquier aumento de complejidad de las mismas, ya se van a complicar la vida.

  6. Pablo on Abril 23rd, 2008 3:30 pm

    Los diseñadores no son solo dibujitos hay muchos en los que si le decis, tenes que usar foreach, y tal dato para mostrar una listado de cosas el tipo lo va a entender, creo que la complejidad a ese nivel no es tanta, que si puede existir en el controller.

    Cuando pienso en MVC; pienso en trabajo en grupo
    Controller -> Puede crearlo el Programador Senior
    Modelo -> el programdor Junior
    Vista -> el diseñador

    Y de esta manera creo que abstraes al Programador importante que se tenga que calentar si la tabla no quedo centrada con respecto al texto, y cosas de esas, ellos tienen un sentido critico del diseño q nosotros carecemos.

  7. zsamer on Abril 23rd, 2008 3:37 pm

    En el tema de los formularios es tan simple, el diseñador sólo tiene que cambiar el css del form, nada más asi lo hago yo y resulta perfectamente, de hecho en nuestro sistema tenemos classes y contenedores (id) css estandard luego se modifica la hoja de estilo y en el resto del XHTML se modifican los layout y plantillas o vistas.

    eso es.

  8. Enrique Place on Abril 23rd, 2008 9:31 pm

    Pablo, esa división que haces no tienen sentido (MVC y roles). No esperes que un “diseñador puro” pueda trabajar sobre una vista, para eso buscarás un programador con conocimientos de diseño.

  9. Nucklear on Agosto 28th, 2008 2:37 am

    Es el primer componente de zend que estoy viendo, desde que tome la carrera de “tratar” de aprender a usar zend, pero me surgio una duda ?
    Seria muy complicado implementar un autocomplete de scriptaculous, o por ejemplo hacer varios calculos matematicos con varios campos de texto mediante javascript…. o me es mas recomendable hacerlo a la vieja usansa… puro html.

    Saludos, excelente blog, esta entre mis favoritos

  10. zsamer on Agosto 28th, 2008 2:50 am
  11. Nucklear on Agosto 28th, 2008 1:53 pm

    Gracias, esa maldita costumbre mia de no querer leer el manual :)

  12. Nucklear on Agosto 28th, 2008 2:01 pm

    Gracias, me parece que lo voy a seguir haciendo a la manera tradicional…

    Saludos

  13. alex on Septiembre 30th, 2008 4:42 pm

    Muy buenas!!! a ver, he seguido el manual paso a paso, incluso al final he tenido que copiar literalmente el código del ejemplo. El caso es que no soy capaz de sacarlo del todo :S. No sé porqué pero no aparece el form al final, me muestra:


    Comentarios
    form; ?>

    Creo que me falla aquí “if($form->isValid($_POST))”
    ¿Teneis alguna idea de porqué?
    gracias

  14. zsamer on Septiembre 30th, 2008 5:21 pm

    Hola alex,

    Prueba cambiando en la vista (index.phtml):
    < ?= $this->form; ?>

    por esto:
    < ?php echo $this->form; ?>

    Y en general todo lo que tenga: “< ?= ” cámbialo por “< ?php echo” tal como el ejemplo de arriba.

    Esto se debe a que debes de tener desactivado en php short_open_tag.

    saludo y suerte.

    pd: “< ?php” se escribe todo junto, de corrido sin espacios como lo muestra aqui.

  15. alex on Septiembre 30th, 2008 7:44 pm

    ok, muchas gracias zsamer, mañana lo intento y te cuento que ya hace sueño jeje. Por cierto, no veas lo bien que me está viniendo tu blog. Gracias y enhorabuena ;););)

  16. zsamer on Septiembre 30th, 2008 8:06 pm

    de nada, siempre un gusto compartir. ;-)

  17. alex on Octubre 2nd, 2008 3:09 pm

    Conseguido!!! muchas gracias ;) Por cierto, donde puedo activar short_open_tag? en php.ini?? Lo dicho muchas gracias… y hasta pronte jeje. Bye.

  18. Diego on Noviembre 17th, 2008 1:18 pm

    Quisiera consultarte lo siguiente, en los forms se puede poner que la validación sea del lado del cliente como en PEAR con QuickForm.

    Desde ya muchas gracias.
    Saludos,
    Diego

  19. Santiago on Abril 1st, 2009 3:35 am

    Hola, He seguido el ejemplo pero me dice que no encuentra el adaptador para la db, donde lo agrego?
    No adapter found

    Gracias

  20. luis on Julio 13th, 2009 6:35 pm

    Una vez mas como siempre,tus ejemplos no funcionan

  21. zsamer on Julio 13th, 2009 7:52 pm

    @luis: una vez más gente inútil que no es capaz de hacer funcionar cosas simples.

    Hay que darte de comer en la manos, estos artículos son para gente más capacitadas y capaces de entender cosas sencillas.

  22. Dan on Agosto 28th, 2009 7:40 pm

    una pregunta, he intentado usar el autocomplete pasandole los datos(data) y funciona, pero como hago para retornar datos atraves de url pagina.php y que devuelva datos en json?

    JQuery()->autocomplete(’empresa’, array(’url’ => ‘/empresa/ajax’));?>

    Gracias por tu ayuda

  23. Alejandro on Noviembre 6th, 2009 2:55 am

    hoLA como estan me gustaria que me ayuden con un problema:
    Consiste:
    Trabajo con el modelo MVC, la cuestion es que envio un formulario desde una clase que tengo en una carpeta llamada forms, al momento de enviar se activa en el indexController una accion que se llama ingresar donde tengo esta linea y otra mas como indica el tutorial pero me doy cuenta que no entra a este if ($form->isValid($_POST)) {}.
    Me gustaria que me ayuden que estoy desesperado ya he intentado de todo.
    Gracias de antemano

  24. David on Noviembre 14th, 2009 4:57 pm

    Hola a todos, ante todo muchas gracias por estos post porque me estan ayudando a entender el funcionamiento de Zend Framework.

    Siguiendo los pasos de este post me he encontrado el problema de que no me carga el formulario y me aparece:

    Comentarios
    form; ?>

    …y no me muestra el formulario, ¿alguien podría indicarme por dónde podría estar el problema?.

    Gracias de antemano.

  25. Gilberto Gil on Febrero 1st, 2010 12:23 am

    David ya habian comentado esto, se trata de que no esta habilitado el short_open_tag, si no quieres meterte en temas de configuracion.
    por citar un ejemplo
    cambia el

    por

    un comentario extra, si necesitan agregar mas campos al formulario solamente deben listarlos dentro de el arreglo de elementos

    ejemplo:

    $form = new Zend_Form(array(
    ‘method’ => ‘post’,
    ‘elements’ => array(
    ‘input’ => array(
    ‘text’, array(
    ‘required’ => false,
    ‘label’=>’nombre’
    )
    ),
    ‘comments’ => array(
    ‘textarea’, array(
    ‘required’ => true,
    ‘label’ => ‘Deja tu comentario’
    )
    ),
    ’submit’ => array(
    ’submit’, array(
    ‘label’ => ‘Enviar’
    )
    )
    ),
    )
    );

  26. Gilberto Gil on Febrero 1st, 2010 12:24 am

    no salieron los tags

    cambia el

    por

Deja tu comentario




XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>