10 de noviembre de 2007

El Form Helper


Hoy voy a escribir acerca del Form Helper, ese gran ayudante que nos brinda la version 1.2 de CakePHP para crear formularios de una forma muy simple.

Cuando comence a tratar de aprender para poder crear mi primer formulario, note que en el manual en construccion de Cake 1.2, la parte que explicaba el Form Helper solo tenia el siguiente texto: asdf. Muy interesante, y quizas haya algun mensaje en código en esas cuatro letras, pero lo que yo necesitaba era un poco mas que eso. Por esa misma razon me dirigi al segun mi profesor de Programacion Concurrente, "semidios" Google. Y ahi encontre este excelente recurso, donde se muestran ejemplos de como codificar los elementos tipicos de un formulario. Siguiente esta guia, construi mi primer formulario muy rapidamente, pero luego de terminarlo, vi algunas inconsistencias en el codigo, basicamente las dudas eran dos...

  1. ¿Por que algunos elementos (inputs) crear un label y un div contenedor, y otros (selects, textareas) no lo hacen, teniendo que crear el label y el div (en caso de necesitarlo) a mano?
  2. ¿Como hago para que mis inputs de texto no tengan label, o el div contenedor?

Antes de poder contestar estas dos preguntas, vamos a ver como crear las etiquetas que abren y cierran los formularios.

Create y End

  • FormHelper::create
( $ model = null,


$ options = array()

)


Este metodo crear la etiqueta form del modelo definido junto a sus parametros, dados en el array options. Los campos que tiene el array options son:

  • "method" -> "post" o "get" (metodo de envio del formulario)
  • "url" -> array() (arreglo que ayuda a formar el URL de destino del formulario)
Dentro del array "url", hay que definir un "controller" y un "action", para darle un destino al formulario.
Sin entrar en tantas compliciones, se puede crear este elemento haciendo lo siguiente:

$form->create("nombreDelModelo");

Por defecto, utilizara el metodo post y la URL sera la misma desde la cual se llamo al formulario.

  • FormHelper::end
( $options = null )

Este otro método crear la etiqueta de cierre del formulario, y si se le pasa un nombre como parametro, se crea automaticamente el boton de enviar, con el texto pasado.

Asi, si ponemos:

$form->end("Enviar");

estaremos creando un elemento input tipo submit con el texto "Enviar", y luego el cierre de la etiqueta form.

La forma correcta

Habiendo visto lo basico sobre como crear un formulario, voy a contar que leyendo en el Grupo Oficial de Google, vi un post que hablaba de que en Cake 1.2 todos los elementos, cualesquiera sean, se deberian crear con el comando $form->input, asignadole como parametro el tipo de elemento a construir. En ese mismo post decia que las otras formas de crear elementos (por ejemplo, $form->select) prontamente serian consideradas como formas deprecadas. No muy seguro de lo que decia esta persona, fui directo al IRC de Google y pregunte cual era la forma recomendada de crear elementos de formulario. La respuesta fue unánime:

$form->input

Bueno, ahora ya habiendo dado la intro de que se debe hacer, ahora vamos a ver como hacerlo. En la API de Cake, se define asi al metodo input:

  • FormHelper::input
( $ fieldName,


$ options = array()

)

donde $fieldName es el parametro que define el nombre del campo, y $options es el array "mágico" que permite crear todo tipo de elementos.

Ahora, dentro de ese array $options tenemos varias opciones, voy a listar algunas:

  • "type" -> "tipoDeElemento"
  • "label" -> "textoEtiqueta"
  • "id" -> "idDelElemento"
  • "class" -> "claseDelElemento"
  • "value" -> "valorPorDefecto"
  • "options" -> "opcionesDeSelect" (solo para elementos de tipo select)
  • "empty" -> true or false (solo para elementos de tipo select, muestra opcion por defecto vacia)
  • "div" -> "claseDelDivContenedor"

Hay algunos "trucos" que se pueden utilizar para controlar mejor las cosas:

  • Si se le pasa el valor false a "label", se quita la etiqueta del elemento.
  • Si se le pasa el valor false a "div", se quita el div contenedor.
  • En caso de ser un elemento checkbox, "value" define con que valor la casilla estara marcada.
¿No entendiste nada? No problem, vamos al ejemplo...

Ejemplo práctico


Ejemplo 1: Quiero crear un simple formulario para que mi novia me deje saludos todas las noches...


Tu novia sera asi! La mia es mas parecida a esta...



Emmm, bueno, volviendo a como crear el formulario...

a) Apertura de formulario:

echo $form->create('Mensajes');

Este elemento ya lo explicamos antes.

b) Elemento input donde se ingresará el nombre de la persona que deja el mensaje:

echo $form->input('Mensajes.nombre', array('type' => 'text', 'label'=>'Nombre:'));

Como explicamos antes, esto creara un input con un label "Nombre:".

c) Elemento select donde se elegira si mandar besos o abrazos:

echo $form->input('Mensajes.gesto', array('type' => 'select', 'label'=>'Tipo de gesto:', 'options'=>$gestosList, 'empty'=>true));

Esto creara un select con las opciones pasadas en el array $gestosList, que tendrá por defecto la opcion vacia y la etiqueta "Tipo de gestos:".

d) Elemento textarea donde se dejará el mensaje:

echo $form->input('Mensajes.texto', array('type'=>'textarea', 'label'=>'Texto de mensaje:'));

Esto creara un textarea con una etiqueta "Texto de mensaje:".

e) Creación de elemento submit y cierre de formulario:

echo $form->end('Enviar');

También explicado anteriormente.

Conclusión y más magia


Y esto es todo. Con tan pocas lineas de codigo, hemos creado un formulario completo. Imaginen lo poco que tendran que codificar para crear formularios mas complejos. Y si todavia no se convencieron, les tiro otra informacion que descubri hace poco:

Si declaramos en nuestra base de datos un campo como text, cuando generamos el input en la vista no hace falta poner el tipo de input, Cake solo lo reconoce como 'textarea'.
Y si declaramos en nuestra base de datos un campo como tinyint(1), o bool, cuando generamos el input en la vista no hace falta poner el tipo de input, Cake solo lo reconoce como 'checkbox'.

Y como puse en el grupo de Google, si esto no es magia, que lo es!

Para seguir investigando

Por supuesto que esto ha sido solo una introduccion al uso del Form Helper, existen muchas otras cosas que se pueden hacer. Una cosa basica que falta en este tutorial, y es muy importante, es la validacion de los campos. A pesar de no escribir sobre esto porque todavia lo estoy investigando en profundidad, les dejo un vinculo a un muy buen artículo de Mariano Iglesias
donde habla de validaciones multiples en Cake 1.2. Además, nunca esta de más mirar la API, para entender en profundidas algunas cosas.

Y eso ha sido todo por hoy. Espero que les pueda servir en sus comienzos con los forms en CakePHP. Saludos!

4 comentarios:

Anónimo dijo...

interesante.

quizás estaría bien decir (me parece haberlo visto por algún lado) que en la última versión del cake (1.2), para que todo funcione bien - el campo debe estar definido en la base de datos.

lo cual puede hacer un pelín más difícil si necesitas hacer un formulario no vinculado a ninguna tabla en la bd.

un saludo
dz

mbavio dijo...

dz: no necesariamente, si en tu model utilizar el atributo $useTable = false, puedes hacer validaciones y demás cosas sobre campos que no estan creados en tu base de datos.

Saludos,
Martin

Danilo Domínguez P. dijo...

Muy buen artículo, excelente la explicación de cada método del helper Form.

Al principio creía que este formato era menos flexible, pero viendo bien los atributos de cada método si puede ser igual de flexible que el antiguo html helper.

Saludos ...

Lector dijo...

excelente!! gracias!