Formularios

Los formularios dotan a las páginas Web de un conjunto de nuevos elementos capaces de recoger información del lector de una página y enviarla a un servidor HTTP para su posterior procesamiento. De esta forma, se pueden realizar encuestas, recoger pedidos o sugerencias, etc.

La información introducida en un formulario es enviada a un servidor HTTP, que se encarga de recogerla y procesarla. Los formularios se estandarizaron en HTML/2.0, a través de un conjunto de etiquetas y atributos que representan cada uno de los campos de recogida de información. El diseño de un formulario incluye cuatro fases:

En esta sección se trata la creación de formularios, desde el punto de vista de HTML: etiquetas disponibles, atributos y diseño de formularios. Es posible crear aplicaciones capaces de dialogar con un servidor HTTP y recoger la información introducida en uno de estos formularios.

Elementos de un formulario

El lenguaje HTML define un conjunto de etiquetas que representan cada uno de los campos de recogida de información de un formulario. Los campos disponibles se dividen en cuatro categorías diferentes:

La siguiente imagen muestra la presentación de los principales elementos de un formulario. Junto al tipo de elemento, se incluye un ejemplo y la etiqueta HTML que lo crea. Entrada de texto <INPUT TYPE=text>: solicita una línea de texto del usuario.

Entrada de bloques de texto <TEXTAREA>: permite introducir múltiples líneas de texto.

Checkboxes <INPUT TYPE=checkbox>: permite seleccionar una o varias opciones de un conjunto de posibilidades.

Radio Buttons <INPUT TYPE=radio>: permite seleccionar una única opción de un conjunto de posibilidades.

Lista de opciones <SELECT>: permite seleccionar una opción, dentro de una lista desplegable de opciones.

Botón Enviar <INPUT TYPE=submit>: botón que al ser activado produce el envío de la información obtenida. Es equivalente a pulsar RETURN en un campo de formulario.

Botón Borrar <INPUT TYPE=reset>: botón que al ser activado elimina toda la información introducida en la página, dejándola en la situación inicial.

Etiquetas para crear formularios

A continuación se incluye, a modo de referencia, el conjunto de etiquetas HTML disponibles para crear formularios. Posteriormente, se explicará la forma de utilizar cada uno de los elementos. Algunos de los conceptos y términos que se emplean están relacionados con la interacción entre clientes y servidores HTTP.
 

<FORM>… </FORM> Crea un nuevo formulario. Todos los restantes elementos de formulario insertados dentro de esta etiqueta pareada serán enviados conjuntamente al servidor para su procesamiento.

Los formularios no se pueden anidar.

  ACTION="…" URL de la aplicación CGI encargada de procesar el formulario, p.e. http://www.u.edu/cgi-bin/procesa.

La información se envía codificada; los detalles de esta codificación se encuentran en el próximo capítulo.

La URL puede ser un mailto:direccion. De esta forma, la información recogida por el formulario será enviada por correo electrónico a la dirección especificada. Esto es útil si se quiere diseñar un formulario, pero no se dispone de conocimientos suficientes para desarrollar aplicaciones CGI. 

  METHOD= Mecanismo utilizado para enviar la información del formulario a la aplicación que lo procesa. Depende del protocolo utilizado en la URL de ACTION.

Para el protocolo HTTP, el más común, puede tomar los valores GET o POST.

Para los mailto:, se debe utilizar el método POST. De esta forma, la URL se envía como un attachment MIME del correo.

  ENCTYPE= Formato de codificación MIME para la información a enviar. 

Por defecto, se emplea application/x-www-form-urlencoded.


  <FORM ACTION="/cgi-bin/registro.pl" METHOD=post>
----
</FORM>

<FORM ACTION="mailto:pcorc@macc.unican.es" METHOD=post>
----
</FORM>

<INPUT> Inserta cada uno de los diferentes campos de recogida de datos.
  NAME= Nombre asignado al campo. Es obligatorio.

Sirve para relacionar el nombre de cada campo con el contenido del mismo, por parte de la aplicación que procesa el formulario.

  TYPE= Tipo de campo de entrada. Es obligatorio. Puede tomar los valores: text: campo de entrada de texto.

password: igual que un campo de entrada de texto, salvo que la información que se teclea no aparece en la pantalla (sólo se ven asteriscos).

checkbox: campo de selección múltiple. Se debe incluir uno por cada elemento de selección necesario.

radio: campo de selección única. Se debe incluir uno por cada elemento de selección necesario.

submit: botón de envío de la información del formulario.

reset: botón para limpiar el contenido del formulario a sus valores por defecto, cuando se cargó la página por primera vez.

hidden: campo oculto. Permite almacenar un valor, pero no se muestra en la pantalla. Sirve para almacenar las variables internas de una aplicación CGI.

image: equivalente a submit, salvo que contiene una imagen que hará las veces de botón de envío.

  VALUE= Valor inicial que se da al campo, válido para los campos de tipo text. Es una cadena de caracteres.

Además, su contenido será incluido, en determinadas situaciones, cuando se envía la información del formulario.

En los campos submit y reset, contiene el texto que se mostrará en el botón.

  CHECKED Indica si un radio o checkbox está seleccionado por defecto.

En un grupo de botones radio, sólo uno se debe definir como seleccionado. 

  MAXLENGTH= Máxima longitud, en caracteres, que puede aceptar un campo de entrada de texto.
  SIZE= Ancho, medido en caracteres, de las ventanas de texto. Puede ser mayor o menor que MAXLENGTH.

 
<TEXTAREA>… </TEXTAREA> Permite introducir varias líneas de texto. Entre las etiquetas de inicio y final se puede introducir texto, que será utilizado como valor inicial del campo.
  NAME= Nombre que se da al campo. Es obligatorio.
  COLS= Número de columnas de texto que ocupará el campo.
  ROWS= Número de filas de texto que ocupará el campo.

 
<SELECT>… </SELECT> Crea una lista desplegable de opciones. Cada una de las opciones disponibles se crea con la etiqueta <OPTION>.
  NAME= Nombre asignado al campo. Es obligatorio.
  SIZE= Número de entradas visibles simultáneamente de la lista. El valor por defecto es 1, es decir, sólo se ve una opción y el resto se muestra en forma de persiana desplegable. 

Si se utiliza un valor mayor, se crea una ventana con tantas opciones como el valor de este campo. Para acceder al resto, se utiliza una barra de desplazamiento.

  MULTIPLE Indica si se pueden seleccionar varias de las opciones de la lista.

Por defecto, en las listas desplegables sólo se puede seleccionar una opción. Si se utiliza MULTIPLE, será posible, utilizando el ratón y la tecla Control, activar simultáneamente varias opciones.


 
<OPTION>… </OPTION> Define cada una de las opciones disponibles en un bloque <SELECT>. El texto que sigue a <OPTION> aparecerá como entrada de la lista desplegable.

No es obligatorio usar la etiqueta de terminación.

  SELECTED Indica cual de los valores es el presentado inicialmente. Sólo debe definirse uno como seleccionado, salvo que se utilice la opción de selección MULTIPLE.
  VALUE= Valor opcional que se proporciona a la etiqueta.

Está relacionado con la información que se enviará al procesar el formulario. Si no existe, se envía el texto que acompaña a <OPTION>. Si existe, se envía este valor.

Creación de un formulario

El proceso de creación de un formulario es muy sencillo; una vez que se identifica la información a solicitar, se elige el conjunto de campos de formulario más adecuado para recogerlo, de acuerdo con la lista anterior. Se deben tener en cuenta las siguientes reglas:

  1. Cada elemento del formulario debe tener asignado un nombre, a través de su atributo NAME=, que será único dentro del formulario. El nombre del elemento puede contener caracteres alfabéticos o numéricos, combinados con _ o -. De esta forma, se podrá relacionar los contenidos de los campos con su origen.
  2. Un formulario debe incluir siempre un botón submit (<INPUT TYPE="submit">) cuya pulsación enviará la información al servidor HTTP especificado en ACTION.
  3. Los formularios no se pueden anidar.
  4. Es importante introducir algún texto explicativo al lado de cada elemento, ya que los campos de entrada no dan información sobre su función; sólo se presenta el elemento de recogida de información.
  5. Los campos se comportan de forma similar a las imágenes cuando son introducidos dentro de un párrafo, si bien no se dispone de etiquetas para controlar su alineación.
Campos de entrada de texto

Recogen una o varias líneas de texto, introducidas por el usuario. El más sencillo es la línea de entrada de texto, con la etiqueta <INPUT TYPE="text">. Se tiene control sobre las siguientes opciones:

Primer ejemplo:
<INPUT TYPE="TEXT" NAME="nombre1" SIZE=30 MAXLENGTH=30>
<P>Segundo ejemplo:
<INPUT TYPE="TEXT" NAME="nombre2" SIZE=10 MAXLENGTH=50>
<P>Tercer ejemplo:
<INPUT TYPE="TEXT" NAME="nombre3" VALUE="Introduce tu nombre" SIZE=20 MAXLENGTH=30>

Existe un tipo especial de campo de entrada, denominado PASSWORD, cuya única diferencia es que el texto que se teclea no se presenta en pantalla, sino que aparece reemplazado por asteriscos *. Introduce tu clave de usuario <INPUT TYPE="PASSWORD" NAME="clave"> Para introducir varias líneas de texto, se utiliza la etiqueta pareada <TEXTAREA>. El browser dibuja un recuadro, cuyo tamaño se fija con los atributos de la etiqueta, en el que se puede introducir y editar texto. En caso de que el texto ocupe más que los límites del recuadro reservado, unas barras de desplazamiento permiten editar todo el contenido.

Se pueden controlar los siguientes parámetros:

  • ROWS= Número de filas de texto del recuadro.
  • Es obligatorio incluir una etiqueta </TEXTAREA>. Las líneas de texto que aparezcan dentro del campo de entrada de texto se utilizan como valor inicial del mismo. <TEXTAREA NAME="sugerencias" ROWS=4 COLS=50>
    Introduce aquí tus sugerencias.
    Muchas gracias.
    </TEXTAREA>

    Campos de selección múltiple

    Los checkboxes son el mecanysmo adecuado para ofrecer listas de opciones, que pueden ser seleccionadas o no poniendo una pequeña marca en la casilla correspondiente. Cada uno de los checkbox se comporta de forma independiente a los demás. Se crean con la etiqueta <INPUT TYPE="checkbox">.

    Las opciones disponibles son:

  • CHECKED fija el campo como activo por defecto.
  • Selecciona los artículos que deseas:

    <BLOCKQUOTE>
    <INPUT NAME="opcion1" TYPE="CHECKBOX" VALUE="libros">Libros<BR>
    <INPUT NAME="opcion2" TYPE="CHECKBOX" VALUE="programas" CHECKED> Programas
    </BLOCKQUOTE>

    Campos de selección única

    Los botones radio también permiten activar o desactivar opciones; sin embargo, a diferencia de los checkboxes, es posible agrupar varios elementos en un ‘grupo de botones radio’, de forma que sólo es posible elegir una de todas las opciones disponibles.

    Para crear un grupo de botones radio, se insertan tantas etiquetas <INPUT TYPE=radio> como opciones existan. Todas ellas deben llevar un NAME igual, pero un VALUE diferente. La agrupación de los botones se realiza por su nombre; por eso, un grupo de botones puede estar distribuido en cualquier posición de un formulario.

    <B>¿ Desde dónde te conectas ?</B>
    <BLOCKQUOTE>
    <INPUT TYPE="radio" NAME="conexion" VALUE="casa">Desde tu casa
    <BR><INPUT TYPE="radio" NAME="conexion" VALUE="trabajo" CHECKED>Desde tu trabajo
    <BR><INPUT TYPE="radio" NAME="conexion" VALUE="otros">Otros
    </BLOCKQUOTE>

    Listas de opciones

    Permiten seleccionar una o varias opciones de entre una lista desplegable. La etiqueta <SELECT> crea el campo de selección; dentro del mismo se añaden las diferentes opciones con <OPTION>. El ancho de la ventana de selección se ajusta a la anchura de la opción mayor que se incluya. El número de opciones visibles simultáneamente se controla con el atributo SIZE.

     
    Al ser enviado un <SELECT> al servidor HTTP, se incluye, junto al nombre del campo, el contenido del elemento <OPTION> seleccionado. En caso de que un OPTION haya utilizado el atributo VALUE, este valor será enviado en su lugar. Para los campos de selección MULTIPLE, se envía el contenido o valor de cada opción, tantas veces como opciones se hayan seleccionado. Nuestro programa debe ser capaz de procesar estas opciones múltiples.
    El caso más sencillo es el de selección simple: Destino del viaje: <SELECT NAME="Destinos">
    <OPTION>Madrid
    <OPTION SELECTED>Paris
    <OPTION>Roma
    <OPTION>Berlín
    </SELECT>

    Es posible asignar a cada elemento de la selección un número o nombre mnemotécnico con el atributo VALUE; este valor tiene interés para la aplicación que procesará el formulario: Destino del viaje:
    <SELECT NAME="Destinos" SIZE=4>
    <OPTION VALUE="0">Madrid
    <OPTION VALUE="1" SELECTED>Paris
    <OPTION VALUE="2">Roma
    <OPTION VALUE="3">Berlín
    </SELECT>
    También es posible ampliar el tamaño de la ventana de selección con el atributo SIZE. Este puede ser mayor o menor que el número de opciones disponibles. En caso de ser menor, se activarán las barras de desplazamiento. Destino del viaje:
    <SELECT NAME="Destinos" SIZE=4>
    <OPTION>Madrid
    <OPTION SELECTED>Paris
    <OPTION>Roma
    <OPTION>Berlín
    </SELECT>
    Para permitir la selección simultánea de varios elementos de una lista, se incluye el atributo MULTIPLE. De esta forma, y combinando el ratón y la tecla Control, es posible activar simultáneamente varias opciones. En este caso, el browser muestra automáticamente una ventana de selección en la que se ven todas las opciones disponibles. Posibles destinos:
    <SELECT NAME="Destinos" MULTIPLE>
    <OPTION>Madrid
    <OPTION SELECTED>Paris
    <OPTION>Roma
    <OPTION>Berlín
    </SELECT>

    Botones (submit y reset)

    Los formularios pueden incluir dos tipos de botones:

    1. Los botones de envío, creados con <INPUT TYPE="submit">, cuya pulsación hace que se envíe al servidor especificado en ACTION la información contenida en los diferentes campos del formulario.
    2. Botones de limpieza del formulario, que deshacen todas las modificaciones introducidas, recuperando los valores por defecto que proporcionó el creador de la página. Se crean con <INPUT TYPE="reset">.
    El atributo VALUE permite controlar el texto que se presentará dentro del botón. <CENTER>
    <INPUT TYPE="submit" VALUE="Enviar datos">
    <INPUT TYPE="reset" VALUE="Limpiar formulario">
    </CENTER>

    Los botones no precisan atributo NAME, ya que por lo general sólo representan la acción de envío de información. Sin embargo, existe la posibilidad de asignar un nombre a los botones submit. En este caso, al enviar el formulario, se incluirá un parámetro con el nombre del botón y el valor asociado en su etiqueta VALUE.

    Este puede ser un sistema útil para implementar un menú basado en botones. La aplicación menu.cgi recibirá un parámetro, denominado accion, cuyo valor será la etiqueta del botón activado en el formulario. Por ejemplo:

    <FORM ACTION="/cgi-bin/menu.cgi" METHOD=get>
    <CENTER>
    <INPUT TYPE="SUBMIT" NAME="accion" VALUE=" ^ "><BR>
    <INPUT TYPE="SUBMIT" NAME="accion" VALUE=" < "><BR>
    <INPUT TYPE="SUBMIT" NAME="accion" VALUE=" > "><BR>
    <INPUT TYPE="SUBMIT" NAME="accion" VALUE=" v ">
    </CENTER>
    </FORM>

    Otros elementos

    Los campos HIDDEN sirven para guardar información dentro de un formulario, que permanece oculta al usuario del browser (salvo que vea el código fuente del documento HTML). De esta forma, se almacenan variables internas que pueden informar de operaciones que el usuario ha realizado previamente.

    Se emplean, por ejemplo, en el desarrollo de servicios de información interactivos, en los que es necesario conocer la secuencia de pasos que un usuario ha seguido hasta llegar una determinada situación. Como el protocolo HTTP entre los clientes y servidores WWW no guarda ninguna información sobre el estado previo, la inclusión de variables ocultas dentro de un formulario es un posible sistema para conservarlo.

    <B>¿Estás de acuerdo con la operación de compra?</B>
    <P><FORM ACTION="/cgibin/confirma_compra">
    <INPUT TYPE="hidden" NAME="compra" VALUE="televisor+plancha">
    <INPUT TYPE="submit" NAME="aceptar" VALUE="Aceptar compra">
    <INPUT TYPE="submit" NAME="aceptar" VALUE="Rechazar compra">
    </FORM>
    Este código puede ser parte de un formulario de un servicio de compra electrónica. El usuario ha seleccionado diferentes artículos, y ahora se le pide confirmación sobre su compra. Además de conocer su respuesta a través de los botones del formulario, se incluyen, como campo oculto, los artículos que previamente ha seleccionado.

    Los campos IMAGE son equivalentes a los botones submit, salvo que permiten utilizar una imagen propia a modo de botón. El atributo SRC= fija la URL de la imagen. Se pueden emplear los atributos de la etiqueta <IMG> para controlar su presentación.

    Cuando se envía un formulario a través de un campo IMAGE, la información de las coordenadas del punto de la imagen en que se pulsó es adjuntada con el resto de campos del formulario. Los dos nuevos parámetros se forman uniendo los sufijos .x y .y al nombre del campo IMAGE.

    <B>¿Estás de acuerdo con la operación de compra?</B>
    <FORM ACTION="/cgibin/confirma_compra">
    <INPUT TYPE="hidden" NAME="compra" VALUE="televisor+plancha">
    <INPUT TYPE="image" NAME="enviar" SRC="factura.gif" BORDER=0 ALIGN=absmiddle>
    </FORM>
    Diseño de un formulario completo

    La parte más importante de un formulario (aparte de la aplicación que lo procesa), es conseguir un diseño atractivo y funcional, que se apoye en elementos de HTML para conseguir el efecto de presentación deseado.

    Para ello, se debe conseguir una adecuada distribución de los campos de formulario junto con las descripciones de los mismos. Un método útil consiste en el empleo de tablas, de forma que los atributos de alineación de cada una de las celdas se aprovechan para conseguir la adecuada distribución de los elementos.

    A continuación se muestra un ejemplo completo de un formulario (hoja de solicitud de cuenta):

    <FORM METHOD=post ACTION="/cgi-bin/registro">
    <H3>Datos Personales:</H3>
    <BLOCKQUOTE>
    <TABLE CELLPADDING=0 CELLSPACING=0>
    <TR><TD><STRONG>Nombre Completo :</STRONG> </TD>
    <TD><INPUT NAME="nombre" TYPE=TEXT ALIGN=TOP SIZE=30 MAXLENGTH=45>
    </TD></TR>
    <TR><TD><STRONG>Departamento:</STRONG></TD>
    <TD><INPUT NAME="dpto" TYPE=TEXT ALIGN=TOP SIZE=30 MAXLENGTH=25></TD>
    </TR>
    </TABLE></BLOCKQUOTE>
    <H3>Selecci&oacute;n del entorno de trabajo:</H3>
    <BLOCKQUOTE>
    <TABLE CELLPADDING=8>
    <TR><TD><STRONG>Entorno preferido de trabajo</STRONG></TD>
    <TD><SELECT NAME="entorno">
    <OPTION SELECTED VALUE=0>No sabe
    <OPTION VALUE=1>Macintosh
    <OPTION VALUE=2>UNIX
    <OPTION VALUE=3>Windows
    <SELECT></TD></TR>
    <TR><TD><B>Cuenta de:</B></TD>
    <TD><INPUT TYPE="RADIO" NAME="tipo_solicitud" VALUE="1" CHECKED> Nueva solicitud
    <BR><INPUT TYPE="RADIO" NAME="tipo_solicitud" VALUE="2"> Renovaci&oacute;n</TD></TR>
    <TR><TD><STRONG>Utilidades a acceder</STRONG></TD>
    <TD><INPUT NAME="correo" TYPE=CHECKBOX>Correo electr&oacute;nico y acceso a Internet
    <BR><INPUT NAME="progcpp" TYPE=CHECKBOX>Programaci&oacute;n en C++
    </TD></TR></TABLE></BLOCKQUOTE>
    <H3>Sugerencias y observaciones:</H3>
    <BLOCKQUOTE>
    <TEXTAREA NAME="sugerencias" ROWS=2 COLS=50></TEXTAREA>
    </BLOCKQUOTE>
    <CENTER><INPUT NAME="Enviar Datos" TYPE=SUBMIT VALUE="Enviar Solicitud">
    <INPUT TYPE="RESET" VALUE="Limpiar Hoja">
    </CENTER>
    </FORM>