Entramos ahora en la descripción del elemento más novedoso del HTML 2.0 respecto a las versiones anteriores: los formularios.
Un formulario es una plantilla para representar un conjunto de datos, el método de enviarlos y el URI de la acción asociada (referencia al programa que va a realizar el proceso de los datos).
El conjunto de datos resultante después de la edición de los campos por el usuario se emplea para acceder a un servicio de información, en función del método y la acción asociada especificados.
El conjunto de datos es una secuencia de campos con pares nombre/valor. Los nombres se especifican en los atributos NAME de los elementos de entrada del formulario y los valores toman un valor inicial empleando distintos marcados, que luego pueden ser editados por el usuario.
Los formularios pueden mezclarse con elementos de definición de bloques, por ejemplo, un elemento <PRE> puede contener un <FORM> y al revés, un <FORM> puede contener listas. Esto permite gran flexibilidad a la hora de diseñar el aspecto de los formularios.
Es importante señalar que la utilidad de los formularios está limitada al uso de las páginas junto con servidores (o al menos con acceso a la red, ya que también se pueden enviar por correo electrónico), ya que las acciones asociadas son programas (generalmente scripts de CGI). Estos programas deben funcionar en un servidor (al que se le proporcionan los datos del formulario, para ser procesados), aunque hay algunos navegadores capaces de invocar guiones locales.
Veamos los elementos de los formularios y la forma de enviarlos:
Dentro de un formulario podemos encontrar los siguientes elementos:
A continuación vamos a describir cada uno de los elementos y sus atributos correspondientes.
La declaración del formulario se pone entre las marcas <FORM> y </FORM>.
En su interior aparecen una secuencia de elementos de entrada (input elements), junto con elementos de marcado de estructura del documento.
En la definición del formulario se pueden incluir los siguientes atributos:
El elemento <INPUT> representa un campo de entrada de datos. Los atributos posibles del elemento vienen dados por el valor del atributo TYPE, que determina el tipo de entrada.
Los tipos de entrada son:
Valor por defecto del atributo TYPE, indica que la entrada es una sola línea. Necesariamente los elementos de este tipo deben incluir el atributo NAME, que indica el nombre del campo.
Como atributos opcionales puede tomar:
Ejemplo:
Calle: <input name=calle><br> Número: <input name=numero><br> Código postal: <input name=cp size=5 maxlength=5 value="99999"><br> |
Es un campo de texto como el anterior, pero el valor no se ve al escribirlo.
Ejemplo:
Clave de usuario: <input name=login><br> Contraseña: <input type=password name=passwd> |
Representa una opción booleana (sí o no). Un conjunto de varios elementos de este tipo con el mismo nombre representan un campo de selección múltiple (n de muchos).
Los elementos de este tipo requieren los atributos NAME y VALUE, que indican el nombre del elemento o grupo de elementos y la parte del valor del campo aportada por el elemento, respectivamente.
Opcionalmente podemos incluir el atributo CHECKED, que indica que el estado inicial es seleccionado.
Ejemplo:
Qué bebidas le gustan: <input type=checkbox name=bebida value=agua checked>Agua<br> <input type=checkbox name=bebida value=cerveza>Cerveza<br> <input type=checkbox name=bebida value=vino>Vino<br> |
Representa una opción booleana (sí o no). Un conjunto de varios elementos de este tipo con el mismo nombre representan un campo de selección múltiple, 1 de muchos.
Los elementos de este tipo requieren, al igual que en el caso anterior, los atributos NAME y VALUE.
Opcionalmente podemos incluir el atributo CHECKED, que indica que el estado inicial es seleccionado. En cualquier momento sólo uno de los botones de un conjunto está marcado. Si ninguno de los elementos <INPUT> de un conjunto de botones de tipo radio especifica CHECKED, el visor debe marcar el primero de ellos inicialmente.
Ejemplo:
Qu&e acute; bebida prefiere: <input type=radio name=bebida value=agua>Agua<br> <input type=radio name=bebida value=cerveza>Cerveza<br> <input type=radio name=bebida value=vino>Vino<br> |
Especifica una imagen para que la muestre el visor y permite la entrada de dos campos, las coordenadas x e y de un pixel seleccionado de la misma. Los nombres de los campos son iguales al del campo, añadiendo al final .x e .y respectivamente. Este tipo implica también TYPE=SUBMIT, es decir, cuando un seleccionamos un pixel, se envía todo el formulario.
Los atributos NAME y SRC son necesarios y el campo ALIGN es opcional (al igual que en el elemento <IMG>).
Ejemplo:
Selecciona un punto del mapa: <input type=image name=punto src="mapa.gif"> |
Representa un campo oculto. El usuario no interactúa con él, es el atributo VALUE el que especifica el valor del campo. Tanto el atributo NAME como VALUE son obligatorios.
Ejemplo:
<input type=hidden name=clave value="l2k3j4l2k3"> |
Representa una opción (normalmente mediante un botón) que le indica al cliente que debe enviar el formulario.
Como atributos opcionales acepta:
Ejemplo:
Puede enviar esta solicitud al administrador del sistema: <input type=submit name=para value=administrador><br> o a mí: <input type=submit name=para value=yo> |
Representa una opción de entrada (generalmente mediante un botón) que le indica al cliente que debe reiniciar los valores de sus campos a los que tenían inicialmente. El atributo VALUE, si existe, indica la etiqueta a emplear para la entrada (botón).
Ejemplo:
Si se ha equivocado, pulse para volver a comenzar: <input type=reset> |
El elemento <SELECT> se emplea para reducir el campo a una lista de valores.
Estos valores se presentan empleando elementos de tipo <OPTION>. Los atributos del elemento son:
Por ejemplo:
<SELECT NAME="bebida"> <OPTION selected>Agua <OPTION>Cerveza <OPTION VALUE=refresco>Refresco Gaseoso <OPTION>Vino <OPTION>Zumo </SELECT> |
El elemento <OPTION> sólo puede aparecer dentro de un elemento <SELECT> y representa una posible elección. Puede tomar los siguientes atributos:
El elemento <TEXTAREA> representa un campo de texto de múltiples líneas. Los atributos posibles son:
Por ejemplo:
<TEXTAREA NAME="direccion" ROWS=6 COLS=64> Magallanes, 25 - 28015 MADRID </TEXTAREA> |
El contenido del elemento es el valor inicial del campo. La especificación de filas y columnas sólo se refiere a la dimensión del área visible, pero los programas cliente pueden permitir sobrepasar los límites mediante barras de desplazamiento. Generalmente se emplea un tipo de letra de caja fija para mostrar los contenidos del campo.
Un visor de HTML comienza el proceso de un formulario presentando el documento con los campos en su estado inicial. Según el tipo de campo, el usuario puede modificar sus valores (seleccionando un campo, rellenando con texto, etc.). Cuando ha terminado, puede enviarlo empleando un botón de envío o una selección de pixel en una imagen. En ese momento el visor analiza las entradas en función del método, acción y tipo de codificación y lo envía.
En caso de que el formulario sólo tenga un campo de entrada de texto de una línea, el visor debe aceptar una pulsación de la tecla de retorno de carro en ese campo como una petición de envío del formulario.
La codificación por defecto de todos los formularios es, según el esquema MIME, application/x-www-form-urlencoded. Un conjunto de datos de formulario se representa en este caso del siguiente modo:
El método de consulta depende de los efectos que el formulario tenga en el estado del resto del mundo, es decir, si el envío va a producir cambios en cualquier documento o programa que no sea nuestro visor.
Si el proceso del formulario es idempotente (no produce cambios), el método debe ser GET. Un ejemplo de este tipo de formularios son las consultas a bases de datos, que no tienen efectos laterales visibles.
Para procesar un formulario cuyo URL de acción es un URL de tipo HTTP y el método es GET, el visor genera un URI que comienza con el de la acción al que se le añade un interrogante (?) y el conjunto de datos codificado con el formato application/x-www-form-urlencoded visto en el punto anterior. Para acceder a la consulta el visor accede al URI de la misma manera que lo hace con los que aparecen en los anclajes.
De todos modos, en algunos casos, la codificación de los datos puede generar un URI extremadamente largo, lo que puede provocar un funcionamiento erróneo con algunos servidores de HTTP antiguos. Por esta razón, algunos formularios que no tienen efectos laterales, se escriben usando el método POST.
Para formularios con efectos laterales (como uno que modifique una base de datos) se emplea el método POST.
Para procesar un formulario cuyo URL de acción es de tipo HTTP y el método es POST, el visor gestiona una transacción de tipo POST del protocolo HTTP, usando el URI de la acción y el cuerpo de un mensaje de tipo application/x-www-form-urlencoded como antes. El visor debe presentar la respuesta del HTTP POST de la misma forma que la respuesta obtenida con el método GET.
Ejemplo de Envío de Formularios
Llegados a este punto, se hace necesario mostrar un pequeño ejemplo para clarificar lo anterior. Si tenemos el siguiente documento:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HEAD> <TITLE>Ejemplo de envío de formularios HTML</TITLE> </HEAD> <BODY> <H1>Cuestionario de Personal</H1> <FORM METHOD="POST" ACTION="/cgi-bin/post-query"> <P><B>Nombre</B>: <BR><INPUT NAME="nom" TYPE="text" SIZE="52"> <P><B>Sexo</B>: <BR><INPUT NAME="gen" TYPE=RADIO VALUE="M"> Masculíno <BR><INPUT NAME="gen" TYPE=RADIO VALUE="F"> Femeníno <P><B>Número de miembros de la familia</B>: <BR><INPUT NAME="nmf" TYPE="text" SIZE="52"> <P><B>Idiomas que conoce</B>: <BR><INPUT NAME="idi" TYPE=checkbox VALUE="F"> Francés <BR><INPUT NAME="idi" TYPE=checkbox VALUE="I"> Inglés <BR>Otros: <BR><TEXTAREA NAME="oid" COLS="48" ROWS="4"></TEXTAREA> <P> <INPUT TYPE=SUBMIT VALUE="Enviar Datos"> <INPUT TYPE=RESET VALUE="Volver a comenzar"> </FORM> </BODY> </HTML> |
El estado inicial de los datos del formulario es:
nom "" gen "M" fam "" oid "" |
Hay que señalar que la entrada de tipo RADIO tiene valor inicial, mientras que el de tipo CHECKBOX no.
El usuario rellena los campos y solicita el envío. Supongamos que los valores son:
nom "Alicia Lindell" gen "F" fam "4" idi "I" oid "catalan\neuskera" |
Entonces el visor gestiona una transacción HTTP POST usando el URI /cgi-bin/post-query. El cuerpo del mensaje será la siguiente línea:
nom=Alicia+Lindell&gen=F&fam=4&idi=I&oid=catalan%0D%0Aeuskera |
Si quiere probar el ejemplo pinche aquí