jueves, 29 de diciembre de 2016

4.4 HTML: el juego de caracteres y los editores de texto

4.4  HTML: el juego de caracteres y los editores de texto

En un vídeo anterior ya te hablé del juego de caracteres y de los típicos problemas que ocasiona en las páginas web. En ese vídeo te daba dos consejos:
Utiliza siempre el mismo juego de caracteres en todo lo que hagas.
Y utiliza UTF-8 sin BOM, que te permite mezclar en un mismo documento textos en cualquier idioma.
Pero ya te avisé en el otro vídeo: hay que saber mucho, mucho más, ya que cuando las cosas empiezan a ir mal, esos dos consejos no son la solución para todos los problemas.
Hace unos días recibí el siguiente correo:
Estoy probando lo del juego de caracteres (usando Notepad++). En el vídeo recomiendas usar UTF8 sin BOM. Resulta que el fichero lo tengo con codificación ANSI, pero si lo cambio a UTF8 sin BOM, el disquete de guardar no se me marca (es decir, no se ha modificado el fichero). Entonces marco UTF8, se marca el disquete y guardo. Ahora selecciono UTF8 sin BOM. Se me marca el disquete y guardo (un pequeño chanchullo para que me permitiese guardar UTF8 sin BOM).
Y el correo continuaba:
Y ahora viene el tema. Si he guardado en UTF8 sin BOM, cuando cierro el fichero y lo vuelvo a abrir, la codificación que me marca es ANSI. ¿Es normal? También veo "Convertir a UTF sin BOM" además de "Codificar en UTF sin BOM" ¿cuál es la diferencia?

Bien, primero vamos a ver qué es eso del BOM. BOM es el acrónimo de Byte Order Mark, la Marca de Orden de Bytes y es un carácter Unicode que se utiliza para indicar el orden de los bytes de un fichero de texto al principio del fichero.
Básicamente existen dos órdenes de bytes, el little-endian y el big-endian, que definen de qué forma se almacenan los datos que ocupan más de un byte en el ordenador. ¿Confuso?
Sí, puede ser muy confuso. Ya sabes, para solucionar los problemas con los juegos de caracteres hay que saber mucho.
Volviendo al BOM, en el caso de UTF-8 es un carácter Unicode que ocupa 3 bytes y que tiene esta representación en hexadecimal y aparece representado de esta forma como carácter.
EF BB BF ï » ¿

¿Cuál es el problema de todo esto?
Lo mejor es utilizar UTF-8, nos evitamos problemas, podemos escribir cualquier carácter, podemos mezclar todos los idiomas del mundo.
Pero UTF-8 lleva el BOM, esos tres bytes al principio del fichero, y hay programas que no se llevan muy bien con el BOM.
Por ejemplo, PHP5 no tiene un soporte completo de UTF-8: si vamos a trabajar con PHP5, debemos de utilizar
UTF-8 sin BOM. Voy a realizar una demostración práctica con el editor Notepad++ para que lo entiendas mejor. Te voy a mostrar un problema típico que aparece cuando trabajamos con UTF8 y con PHP5.
Estoy en Notepad++ y he preparado tres ficheros de ejemplo para mostrarte el problema.
Por un lado tenemos este fichero html.html que contiene solamente código HTML.
Luego tenemos este fichero php.php que contiene esta instrucción de PHP, un echo, párrafo, “Esto lo escribe PHP”, que lo único que hace es escribir esta cadena de texto, esta cadena HTML.
Y por último también tenemos este fichero en PHP, php-file.php que lo único que hace es incluir la instrucción include de PHP para incluir el primer fichero de HTML, es decir, lo único que hace es leerlo y volcarlo en la salida.
Fíjate que los tres ficheros los tengo almacenados en formato UTF-8.
Vamos a ver cómo se visualizan estos tres ficheros en el navegador. Me voy al navegador y aquí tenemos el primer fichero, el de solamente HTML. Se ve bien, no hay ningún problema.
Luego tenemos el otro fichero, el que contiene código de PHP.  Se ve bien.
Y ahora el tercer fichero, este fichero de aquí, que contiene esta instrucción de PHP para cargar el primer fichero, es decir, se debería de ver igual que este fichero. Sin embargo, cuando lo visualizamos, notamos aquí que hay un cambio. Fijaros cómo aparece aquí un margen superior, como si hubiese aquí una línea adicional de texto.
¿Esto a qué es debido?
Si nos vamos ahora al código fuente, veremos que he añadido un comentario al principio de cada uno de los ficheros. ¿Este comentario debe producir ese espacio adicional?
No, para nada. Este espacio no lo debe producir un comentario. Es más, aquí lo podemos comprobar, como estos ficheros también tienen el comentario y sin embargo no aparece ahí ese espacio.
Por tanto, ¿a qué se debe esto? El problema está en que al cargar aquí en PHP este fichero, el fichero html.html, este fichero de aquí, recordad que está en formato UTF-8, lleva el BOM, aunque nosotros aquí no lo veamos.
¿Cómo lo puedo saber? Aquí en Notepad++ me he instalado un plugin que es un editor hexadecimal. Si le doy a ver el código hexadecimal del fichero, fijaros lo que tenemos aquí al principio. ¿Recordáis los tres caracteres que os he dicho “acordaros de estos tres caracteres”? Lo podemos ver aquí también en hexadecimal: ef bb bf.
Ese es el BOM, esa es la marca que indica que este es un fichero en formato UTF-8 e indica el orden de los bytes.
Este carácter es el que me está produciendo aquí este salto de línea, porque ese carácter está aquí incluido. Lo que ocurre es que el navegador tampoco me lo muestra aquí al ver el código fuente. Por tanto, me puedo volver loco, muy loco, buscando por qué me aparece aquí este margen. Y todo es debido a ese carácter invisible que no me aparece.
¿Cómo solucionamos este problema? Pues bien sencillo, la solución ya te la he dicho y es no almacenar el fichero en formato UTF-8, sino almacenarlo en formato UTF-8 sin BOM. Para eso nos vamos aquí al menú codificación, y le damos a “Convertir a UTF-8 sin BOM”. Pero aquí tenemos la duda, tenemos la pregunta que me hacían en un correo electrónico: ¿qué debo de usar, codificar o convertir?
Codificar lo debería de usar cuando inicio un fichero desde cero, es decir, cuando no tiene contenido. O cuando quiero hacer algo raro como almacenar en un mismo fichero caracteres con dos codificaciones distintas, porque lo que estoy indicando es que a partir de este momento, el contenido que yo escriba lo quiero codificar con este juego de caracteres, pero el contenido que ya tiene el fichero, lo dejamos en el juego de caracteres que ya tenía.
En nuestro caso no queremos hacer eso, no queremos dejar el fichero con la codificación anterior, sino que queremos transformar, convertir todos los caracteres a la nueva codificación. Por tanto debemos de usar convertir.
Yo te puedo asegurar que nunca he usado codificar. Esta opción nunca la he necesitado y la verdad es que si yo fuese el diseñador del Notepad++ la escondería un poco para no causar confusión entre los usuarios. Así que en este caso vamos a usar “Convertir a UTF-8 sin BOM”. Fijaros como me aparece en rojo para indicarme que el fichero ha sido modificado y lo que me ponían en el correo electrónico, ahora ya lo puedo guardar porque el fichero ha sufrido una transformación.
Al guardarlo me desaparece el disquete que se decía en el correo electrónico. El fichero no necesita guardarse porque no tiene ningún cambio y si me voy ahora al editor hexadecimal veréis que me han desaparecido esos tres caracteres que habían al principio. Ya no está el BOM, ya no está esa marca, ¿lo entendéis? Es bien sencillo.
Voy a realizar lo mismo con todos los ficheros, los voy a convertir a UTF-8 sin BOM. Ya los tengo los tres en UTF-8 sin BOM y vuelvo aquí, recargo, y veréis que aparentemente no ha habido ningún cambio. Efectivamente, porque el navegador Google Chrome está preparado para trabajar con UTF-8 con o sin BOM.
Pero ahora vamos a ver si se soluciona este problema, vamos a ver si desaparece este margen. Le doy a recargar y “ta chán”, ya no me sale ese margen. Genial, ¿no? Solucionado.
Esto es muy importante que lo recordéis, porque cuando trabajemos con PHP es muy normal hacer cosas como ésta, es decir, construir una página web mediante trozos, mediante componentes que los vamos incluyendo, los vamos uniendo.
Si nos despistamos y los componentes que vamos uniendo están almacenados en UTF-8 con BOM, nos aparecerá ese carácter no visible y nos romperá el diseño de la página web.
Por tanto, recordad: hay que almacenar los ficheros con UTF-8 sin BOM.
Y para finalizar, un último detalle. Acordaros que debéis poner la etiqueta <meta charset> para indicar el juego de caracteres. Y este juego de caracteres que indicamos aquí debe de coincidir con el juego de caracteres que físicamente se está empleando para almacenar el fichero. Si yo aquí indico un juego de caracteres y almaceno el fichero con otro juego de caracteres, tendré problemas.
Vamos a hacer una prueba. Por ejemplo, aquí tengo indicado UTF-8 como juego de caracteres para mi página y voy a cambiarlo a Latin1, por aquí está en algún sitio, pero bueno. Yo lo que hago es convertir a ANSI, fijaros como ahora me dice que tengo que guardar el fichero porque ha sufrido una transformación. Aquí me aparece efectivamente ANSI.  Le doy a guardar. Y ahora cuando cargue la página, “ta chán”,  ya no me aparece el carácter que me va a dar problemas. El carácter que me va a dar problemas es la vocal acentuada “á”. El resto de caracteres no me dan problema porque están entre los 128 primeros caracteres ASCII. Y esos caracteres se representan de igual forma en ASCII, en ISO-8859-1, en UTF-8. Como son los caracteres más comunes, siempre se representan igual, por eso no me dan problemas, los problemas me los dan los caracteres especiales.
Vamos a hacer otra prueba. Si yo ahora le pongo “latin1” o también le podría poner “iso-8859-1” pues, se debe de arreglar el problema. Volvemos al navegador, le doy a recargar y ya me sale bien el carácter otra vez.
Y ahora vamos a hacer la última prueba. Yo indico que mi juego de caracteres es en “latin”, lo tengo guardado en ANSI, bien es “latin1”. Le cambio la codificación y volvemos a UTF-8 sin BOM. Me vuelve a decir que lo guarde. Lo guardo. Recargar y “ta chán”, otra vez problema. Ahora me sale otro carácter distinto.
En conclusión, hay que llevar mucho cuidado y, lo que ponga aquí, lo que indiquemos en el HTML, tiene que coincidir con la codificación física del fichero. En cuanto haya una discrepancia, en cuanto no coincida, empezaremos a tener problemas.

Bien, espero que este vídeo te ayude un poco más a evitar los típicos problemas que aparecen al trabajar con los juegos de caracteres. Pero te vuelvo a recordar, el tema es muy complejo y hay que saber muchas cosas para hacer frente a todos los problemas que pueden surgir.



4.3 HTML: juego de caracteres

4.3 HTML: juego de caracteres

El juego de caracteres, también llamado codificación de caracteres, es la pesadilla de la mayoría de los informáticos porque es una fuente de problemas inagotable.
En el siguiente vídeo se muestran ejemplos reales de problemas con el juego de caracteres y se proporcionan los consejos más importantes para trabajar con el juego de caracteres:

  • Utiliza siempre el mismo juego de caracteres.
  • Utiliza UTF-8 sin BOM.
  • Diferencias entre ISO-8859-1 (Latin1) e ISO-8859-15 (Latin9).
  • Cómo se indica el juego de caracteres en HTML (etiqueta meta).
  • Diferencias entre HTML4, XHTML1 y HTML5.


¿Alguna vez el nombre de un fichero o su contenido no lo has podido ver bien al moverlo de un sistema operativo a otro? ¿Alguna vez has instalado un programa y no se visualizaban correctamente algunos caracteres? ¿Alguna vez te han dado un justificante, un extracto bancario o un recibo en el que no se mostraban correctamente algunos caracteres? ¿Alguna vez has entrado en una página web y te aparecían caracteres chinos cuando la página no estaba en chino?

Si alguna vez has sufrido un problema parecido y te has sentido solo porque pensabas que eras el único al que le pasaba, no te preocupes, porque no estabas solo, mucha gente como tú, sufre estos problemas todos los días. Sin duda alguna, en el campo de la informática, el juego de caracteres es de las cosas más simples que más problemas ocasiona. Mapa de caracteres, ASCII, ISO-8859-1, Latin-1, ANSI, UTF-8, UTF-8 sin BOM, Unicode, Cotejamiento. ¡Menudo lío! ¿Qué significa todo esa sopa de términos?

A muchos experimentados informáticos, las palabras “juego de caracteres” les produce horribles pesadillas. Para que a ti tampoco te produjese pesadillas y entendieses correctamente qué es el juego de caracteres, tendría que empezar por el principio, por la primera descripción conocida de un sistema de numeración binario que se debe a un matemático hindú del siglo tercero antes de nuestra era. Después te tendría que explicar que el sistema binario moderno fue documentado en su totalidad por el gran matemático Leibniz, en el siglo XVII. Leibniz utilizó el 0 y el 1, al igual que el sistema de numeración binario actual. Y después te tendría que contar muchas otras cosas más. Pero este no es el momento, ya te las contaré en otro vídeo. En este vídeo sólo te voy a dar la solución fácil.

La regla más importante es muy fácil de recordar: utiliza siempre el mismo juego de caracteres en todo lo que hagas. ¿Qué significa esto en una aplicación web? Significa que todos los ficheros que compongan tu sitio web, deben estar almacenados en el mismo juego de caracteres: tus ficheros HTML, CSS, JavaScript, de texto, etc.

Pero también tus páginas PHP. Y cualquier fichero de texto que leas desde PHP. Y también los datos que estén almacenados en tu base de datos. Y también la conexión que establezcas con tu base de datos. Y si invocas a un servicio web que te devuelve datos en formato XML o JSON, pues lo mismo, los datos que te devuelva también tienen que estar en el mismo juego de caracteres.

Sencillo, ¿verdad? Pues no es tan sencillo, porque esto muchas veces es imposible de lograr, no porque no se pueda, sino porque no depende de nosotros. Lo normal es que en un escenario real nos encontremos con algo parecido a esto, un escenario en el que NO puedes utilizar el mismo juego de caracteres en todos los elementos de tu sistema. Y normalmente, el problema suele convertir en algo muy grave,  con solución, pero muy costosa.

En ese momento es cuando te toca llamar al informático para que te solucione el problema, pero no a un informático que se dedica a instalar el Windows o a cambiar tarjetas gráficas, no, a un informático de verdad. ¿Qué juego de caracteres debo usar? Yo te recomiendo, UTF-8 sin BOM, es la solución a todos los problemas, y te permite mezclar en un mismo documento textos en cualquier idioma, es decir, te permite mezclar caracteres de  cualquier alfabeto, pero absolutamente sin ningún problema.

Si no puedes utilizar UTF-8 sin BOM por alguna razón, entonces te recomiendo ISO-8859-1, también llamado Latin1. Después de UTF-8, es el mejor juego de caracteres para los idiomas de Europa occidental, incluido el español. Pero si necesitas escribir el símbolo del euro €, entonces debes utilizar ISO-8859-15, también llamado Latin9.

Latin1 y Latin9 se diferencian únicamente en 8 caracteres que han cambiado, y el único realmente importante para el español es la sustitución de un carácter que seguramente nunca has usado por el símbolo del euro.

¿Cómo indico el juego de caracteres en HTML? Se realiza mediante una etiqueta <meta>, que se escribe en el <head> de la página web, pero depende de la versión de HTML que estés utilizando. Si estás utilizando HTML4, debes utilizar esta sintaxis.
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

Si estás utilizando XHTML 1, debes utilizar alguna de estas dos sintaxis.
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
Además, si empleas un juego de caracteres diferente a UTF-8, también tendrás que indicar el juego de caracteres mediante la declaración de documento XML al principio de la página web.
<?xml version="1.0" encoding="ISO-8859-1"?>

Y por fin llegamos a HTML5. ¿Cómo será en HTML5? ¿Más fácil? ¿Más complicado? Bueno, en HTML5 se ha intentado hacer el lenguaje HTML más sencillo, así que han simplificado la forma de indicar el juego de caracteres y ahora es algo tan sencillo como esto o esto.
<meta charset="utf-8">
<meta charset="utf-8"/>

Bueno, después de este vídeo no espero que ya no veas el juego de caracteres como un lío, en realidad no te he explicado las razones de que sea un lío, pero sí que te he dado dos consejos:

  • Utiliza siempre el mismo juego de caracteres en todo lo que hagas.
  • Y si puedes, utiliza el juego de caracteres UTF-8 sin BOM.

Actividad

1. En cuanto al juego de caracteres, lo más importante es...




4.2 ¿Estás escribiendo bien tus páginas?

4.2  ¿Estás escribiendo bien tus páginas?

Ya has aprendido muchas cosas, ya sabes escribir páginas web sencillas pero, ¿estás escribiendo bien tus páginas?
"Klaro, este testo lo puedes entender, quisas alla errores que te confundan, pero si lo bes dos vezes seguro que lo entiendes."
Con las páginas web ocurre lo mismo, pueden tener errores que hagan que los navegadores se confundan y no interpreten correctamente nuestras páginas
Después de todo el esfuerzo invertido en crear una página web, ¿te gustaría que un navegador web mostrase algo distinto de lo que tú has querido hacer? Para evitarlo debes escribir páginas web correctas: páginas bien estructuradas y sin errores.

Módulo 4: Cómo se escribe una página web correcta

MÓDULO 4: CÓMO SE ESCRIBE UNA PÁGINA WEB CORRECTA.


4.1 Presentación

Los objetivos de este módulo son:
  • Aprender a crear páginas web con tablas e imágenes.
  • Aprender a válidar el código HTML para crear páginas web correctas.
  • Aprender las principales novedades de HTML5.


En las semanas anteriores has aprendido los conceptos básicos sobre la creación de páginas web. Algunas cosas importantes,
como el juego de caracteres o la validación del código HTML no las hemos explicado para facilitarte el aprendizaje. Pero esta semana ya toca, tienes que aprender a realizar páginas web correctas.

Además, esta semana vas a aprender a incluir elementos nuevos en una página web.

Vas a aprender a crear tablas para mostrar datos tabulados.

Y vas a aprender a insertar imágenes.

En las próximas semanas aprenderás a insertar otros elementos multimedia, como por ejemplo los vídeos.

Por último, también vas a aprender las principales novedades que incorpora HTML5, la última versión de HTML.

¡Espero que disfrutes aprendiendo todo lo que hemos preparado!

miércoles, 28 de diciembre de 2016

3.21 Presentación del proyecto

3.21 Presentación del proyecto.

Los objetivos del proyecto de este módulo son:
  • Publicar en Internet el sitio web formado por varias páginas conectadas mediante enlaces.
  • Mejorar el sitio web con la incorporación de nuevos elementos como los formularios.

MÓDULO 3: Cómo se publica un sitio web

Objetivos


  • Mejorar el sitio web con la incorporación de nuevos elementos como los formularios.
  • Publicar en Internet el sitio web formado por varias páginas conectadas mediante enlaces.
  • Optativo: registrar un nombre de dominio y contratar un servicio de alojamiento de pago.

Qué tengo que hacer


Poco a poco tu sitio web va creciendo y mejorando. Por ejemplo, en este módulo has aprendido a crear formularios web. A tu sitio web ya le puedes añadir un formulario, por ejemplo un formulario de contacto para que la gente pueda contactar contigo. Pero, ¿cómo se recogen los datos del formulario?

Lo normal es utilizar una base de datos para recoger la información transmitida a través de un formulario en una página web. Por ejemplo, consulta el artículo Sending and retrieving form data de Mozilla Developer Network en el que se incluye el siguiente gráfico:

A basic schema of the Web client/server architecture

Los datos que se introducen en un formulario en el lado del cliente (el navegador web) se envían a través de Internet al servidor web, donde son recogidos y almacenados en una base de datos (no está representada en el gráfico anterior) para su posterior consulta. Pero para hacerlo así es necesario tener conocimientos de programación y de bases de datos y eso está fuera de los objetivos de este curso. Sin embargo, existe una alternativa fácil de implementar, como vamos a ver a continuación.

En el atributo action de la etiqueta <form> que define un formulario se puede indicar un correo electrónico para que los datos se envíen directamente a un correo electrónico. ¿Cómo se hace? Consulta los siguientes recursos que contienen ejemplos que puedes copiar a tus páginas web:


El protocolo mailto también se puede utilizar en los enlaces. En el artículo Email links se explica.

Una vez tengas ampliado (añade páginas nuevas con más contenido) y mejorado (añade al menos una página web con un formulario) tu sitio web, publícalo en Internet. Para publicar el sitio web puedes utilizar un servicio de alojamiento gratuito o de pago. Servicios gratuitos de alojamiento hay muchos, aquí tienes algunos muy populares:


Además, como parte optativa de este proyecto te proponemos que registres tu propio nombre de dominio y contrates un servicio de alojamiento de pago.

Una vez hayas publicado tu sitio web en Internet, publica en el foro del curso su URL para que otros compañeros puedan comentar lo que has hecho.

lunes, 26 de diciembre de 2016

3.20 HTML: Formularios - Parte 2

3.20 HTML: Formularios - Parte 2


En el vídeo anterior vimos las etiquetas <form> e <input> así como sus atributos. Si llegaste a este vídeo antes que a la primera parte, te recomiendo que antes de continuar, veas “Formularios – 1ª parte” para no perderte.
<select> permite generar listas desplegables y listas de selección múltiple.
Además del atributo “name”, que es fundamental para el manejo de los datos enviados por el formulario, como ya vimos en la primera parte del vídeo;
<select> permite utilizar el atributo “multiple” para generar listas de selección múltiple.
Cuando te haya presentado todos los elementos necesarios te enseñaré un ejemplo de lista desplegable y lista múltiple.
Para definir cada una de las opciones de la lista, utilizamos la etiqueta <option>, cuyo atributo “value” será el valor del elemento <select> cuando se envíe el formulario.
Entre <option> y </option> incluimos el texto que queramos mostrar al usuario.
Este sería un ejemplo de lista desplegable que seguro utilizas habitualmente.
Y al añadirle el atributo “multiple” a la etiqueta <selectZ, se transforma en una lista de selección múltiple.
Para seleccionar más de un valor, es necesario mantener pulsada la tecla “Ctrl” en PC o la tecla “command” en Mac antes de hacer clic sobre los elementos a seleccionar a partir del segundo.
Además, podemos agrupar las opciones encerrándolas entre etiquetas <optgroup> y </optgroup> para facilitar el uso de listas con muchos elementos.
En el ejemplo puedes ver cómo quedaría el control con agrupación de opciones.
Fíjate que la etiqueta <optgroup> tiene un atributo “label” mediante el cual se especifica el texto que aparece en el desplegable.
Los títulos de grupo no son seleccionables.
Seguramente habrás notado que resulta incómodo insertar grandes cantidades de texto mediante <input /> de tipo texto. Para ello, existe un control específico en HTML llamado <textarea>.
De nuevo, el atributo “name” es necesario (fíjate si lo será que no dejo de repetirlo).
<textarea> permite definir el área visible de una forma un tanto peculiar.
Del mismo modo que “size” en los <input /> de tipo “text” tomaba como parámetro el número de caracteres de ancho, <textarea> define la anchura mediante el atributo cols, por defecto a 20;
y el alto mediante “rows”, por defecto a 2.
En los campos <textarea> es posible hacer uso de la tecla “intro” para introducir saltos de línea. (CLIC)
Cuando el área visible sea demasiado pequeña para el texto contenido, el control <textarea> mostrará  barras de desplazamiento, típicamente la barra de desplazamiento vertical.
El elemento <label> no muestra absolutamente nada en pantalla y, sin embargo, es una etiqueta que mejora la usabilidad y accesibilidad de los formularios.
Una etiqueta <label> asocia un texto a un control, de forma que al pulsar sobre ese texto, se activa el control asociado en la mayoría de los navegadores.
Además, relaciona el control con su propósito, fundamental para usuarios que utilicen algún tipo de ayuda a la navegación.
Para relacionar un <label> con su control de formulario, se utiliza el atributo “for” del primero. Este atributo espera el identificador del control de formulario con el que se va a asociar.
En este ejemplo puedes ver cómo el atributo “for” coincide con el atributo “id” del componente de formulario con el que se quiere asociar.
Al pulsar sobre el texto de las etiquetas <label>, se activará la casilla asociada, mejorando la usabilidad, ¿quién no ha hecho clic sobre el texto de una casilla de verificación esperando que ésta se marcara?
y además, también mejora la accesibilidad: ¿o en tu smartphone no te resulta más fácil pulsar sobre un texto que sobre una pequeña casilla?
Recuerda incluir el atributo “value” que he omitido para mejorar la legibilidad del código.
<fieldset> agrupa elementos de un formulario que están relacionados entre sí.
Por ejemplo, podríamos agrupar los datos personales de un usuario en un <fieldset> y los datos bancarios en otro.
Además, este control dibuja un marco alrededor de los componentes encerrados entre <fieldset> y </fieldset>.
Para facilitar la lectura del formulario, es posible dotar de un título a los componentes agrupados, escribiéndolo entre las etiquetas <legend> y </legend>.
Por supuesto, la etiqueta <legend> se debe ubicar entre <fieldset> y </fieldset>.
En el ejemplo puedes ver un formulario en el que un usuario incluiría su nombre y correo electrónico y los temas que quiere cursar.
Mediante la etiqueta <fieldset> he agrupado los datos personales en un grupo, y los temas en otro.
Utilizando la etiqueta <legend> he titulado el primer grupo como “Perfil” y el segundo como “Temas”.
Y eso es todo sobre formularios, por el momento.

  • En esta segunda parte hemos visto el uso de las etiquetas <select> y <option> para insertar listas desplegables o de selección múltiple;
  • permitir al usuario escribir texto con más de una línea de forma cómoda mediante <textarea>;
  • cómo hacer más accesibles nuestros formularios utilizando etiquetas <label> para asociar texto a controles ;
  • y a agrupar controles en conjuntos con <fieldset> para hacer los formularios más digeribles para el usuario.


Y si me lo permites, te dejo tres consejos que espero te sean de utilidad:
Utiliza <textarea> en lugar de <input /> de tipo texto cuando el usuario vaya a escribir cantidades de texto considerables.
Usa <select> en lugar de <input /> de tipo “radio” cuando ofrezcas tres o más posibilidades al usuario.
Y, en la medida de lo posible, facilita el trabajo a tus usuarios mediante la etiqueta <label>.
Recuerda que, como dice Tim Berners Lee, el poder de la web reside en la universalidad; facilitarle el acceso a todo el mundo, sin importar limitaciones, es un aspecto esencial.
Puedes ampliar información y ver ejemplos utilizando tu buscador favorito, en alguna de las páginas de tutoriales HTML como html.conclase.net y htmlquick.com; o probando y modificando online los ejemplos Try it yourself de la w3schools.

Actividad

1. En la actividad anterior se te proponía realizar el siguiente formulario:

Crea una página web que contenga un formulario con los siguientes campos de información:
  • El nombre, con un control de tipo texto.
  • Los apellidos, con un control de tipo texto.
  • El sexo, con dos opciones excluyentes hombre o mujer.
  • El correo electrónico, con un control de tipo texto.
  • Una casilla de verificación con el texto "Deseo recibir información sobre novedades y ofertas".
  • Una casilla de verificación con el texto "Declaro haber leido y aceptar las condiciones generales del programa y la normativa sobre protección de datos".
  • Un botón de envío.
Además, tienes que tener en cuenta los siguientes requisitos:
  • El título de la página debe ser Formulario de registro - Mi web.
  • El método de envío del formulario debe ser GET.
  • El destino del envío del formulario debe ser "".
  • La longitud máxima de entrada de datos de los controles para el nombre y los apellidos debe ser 50 caracteres.
  • La casilla de verificación con el texto "Deseo recibir información sobre novedades y ofertas" debe estar activada por defecto.

Al formulario anterior le tienes que añadir los siguientes campos de información:
  • Población, una lista desplegable con las opciones Alicante, Madrid, Sevilla y Valencia.
  • Descripción, un área de texto multilínea.
Además, tienes que asociar la etiqueta de cada control a su control para mejorar la usabilidad y la accesibilidad.

Resultado

<html>
<head>
<title>Formulario de registro - Mi web</title>
</head>
<body>
<h1>Formulario de registro</h1>
<form action="" metod=get>
<p>
<label for="nombre">Nombre:</label> <input type="text" name="nombre" id="nombre" maxlength="50"/>
</p>
<p>
<label for="apellidos">Apellidos:</label> <input type="text" name="apellidos" id="apellidos" maxlength="50"/>
</p>
<p>
Sexo: <input type="radio" name="sexo" id="sexo-h" value="h"/> <label for="sexo-h">Hombre:</label> 
<input type="radio" name="sexo" id="sexo-m" <value="m"/> <label for="sexo-m">Mujer:</label>
</p>
<p>
<label for="correo">Correo:</label> <input type="text" name="correo" id="correo" maxlength="100"/>
</p>

<p>
<label for="poblacion">Población</label>
<select name="poblacion" id="poblacion">
<option>Alicante</option>
<option>Madrid</option>
<option>Sevilla</option>
<option>Valencia</option>
</select>
</p>

<p>
<label for="descripción">Descripción:</label>
<textarea name="descripcion"id="descripcion" rows="6" cols="60"></textarea>
</p>

<p>
<input type="checkbox" name="info" id="info" checked="checked"/> 
<label for="info">Deseo recibir información sobre novedades y ofertas.</label>
</p>

<p>
<input type="checkbox" name="condiciones" id="condiciones"/> 
<label for="condiciones">Declaro haber leido y aceptar las condiciones generales del programa y la normativa sobre protección de datos</label>
</p>

<p>
<input type="submit" value="Enviar"/>
</p>
</form>
</body>
</html>

jueves, 1 de diciembre de 2016

3.19. HTML: Formularios - Parte 1

3.19. HTML: Formularios - Parte 1


¿Qué son los formularios?
Según la W3C, un formulario HTML es una sección de un documento que contiene:
  • contenido normal, 
  • código, 
  • elementos especiales llamados controles, y 
  • rótulos para esos controles.

Los usuarios normalmente rellenan un formulario modificando sus controles, antes de enviar el formulario a un agente para que lo procese (a un servidor web, a un servidor de correo, etc.)
¿Y para qué se utilizan?
Pues justamente para eso, para permitir que el usuario envíe información al servidor.
Formularios de registro o acceso a sitios web, formularios de contacto; hasta para escribir un comentario en Facebook estamos utilizando un formulario.

Te presento las etiquetas básicas para formularios, vamos a ir analizándolas una a una.
La etiqueta <form> es fundamental para que el resto de elementos puedan ser enviados.
Todos los campos que se quieran enviar deben estar entre las etiquetas <form> y </form>.
Esta etiqueta no tiene representación gráfica.
“action” es el único atributo requerido para la etiqueta form.
Espera una cadena de texto que especifique la URL o ruta a la acción destino que procese los datos de la petición.
Es posible utilizar una ruta absoluta o una relativa.
“method” indica la forma de enviar la información.
Este atributo acepta dos valores: GET y POST.
Si no se utiliza, el formulario se enviará por defecto mediante el método GET.
No es común la expresión: “realiza una petición GET a la URL http://www.idesweb.es”, más bien diríamos algo así como “entra en idesweb.es”.
Sin embargo, para el trabajo con formularios, es necesario saber distinguir entre dos tipos de peticiones que un cliente le hace a un servidor: GET y POST.
Hay más, pero no las comentaré en este tema.

GET es el método que utilizamos normalmente al navegar.
Al utilizarlo en un formulario, los datos de envío son visibles en la URL, como parejas nombre=valor.
Esta forma de envío está limitada y el límite depende de cada navegador.
Utilizaremos GET, normalmente, en los casos en los que el resultado del envío sea siempre el mismo y cuando queramos que el resultado se pueda guardar; por ejemplo en un formulario de búsqueda.

POST es un método un poco más seguro que GET para el envío de información sensible como puedan ser contraseñas, ya que los datos no son visibles en la URL del navegador.
Además, POST no tiene límite en el envío y posibilita la subida de ficheros al servidor.
Un formulario de registro podría ser un buen ejemplo de uso del método POST.

“accept-charset” espera una lista de juegos de caracteres separados por comas.
Normalmente utilizamos el estándar “unicode” UTF-8 y puede que alguna vez veas, y no solo en formularios, el juego “Latin 1” o ISO-8859-1, que define el alfabeto latino.
No es un atributo muy común y probablemente no llegues a usarlo en formularios.

“enctype” especifica el tipo de codificación, por defecto a “application/x-www-form-urlencoded”, convertirá todos los espacios en signos suma (+) y caracteres especiales en valores ASCII HEXadecimal; “multipart/form-data” se utiliza cuando vayamos a subir ficheros mediante el formulario;y “text/plain” solo convierte los espacios en signos de sumar (+), pero los caracteres especiales no son convertidos.

La etiqueta <input /> es de las más utilizadas en formularios, con ella podemos definir gran parte de los controles típicos de formularios: entradas de tipo texto, casillas de verificación y de opción (conocidas como radio), archivos, contraseñas, campos ocultos y botones varios.
En seguida los estudiamos en profundidad, pero antes quiero destacar que la etiqueta <input /> no tiene etiqueta de cierre y, por tanto, es interesante que la cierres debidamente para cumplir con los estándares.

El atributo “name” es común a todos los campos de formulario, no exclusivo de <input />.
Espera una cadena de texto que indica el nombre que recibirá el campo al ser enviado.
Si, por ejemplo, enviamos un formulario con un elemento cuyo atributo name=“email”. El servicio responsable de procesar ese formulario podrá trabajar con un campo de nombre “email”.<input name="email"/>

Para la etiqueta <input />, “type” es uno de los atributos más importantes ya que define en qué se convertirá el control. Pese a que no es obligatorio, es recomendable su uso.
Por defecto es de tipo “text”;
“checkbox” indica que el campo será una casilla de verificación, después veremos ejemplos sobre cómo utilizar este y otros tipos de elemento <input />;
“radio” dibujará una casilla de opción o un botón tipo radio, si todavía no te suena, no te preocupes, con los ejemplos te quedará más claro;
“file” muestra un botón, que abrirá una ventana para seleccionar un archivo, también muestra el nombre o la ruta al archivo, dependiendo del navegador;
“password” genera un campo de texto enmascarado, ideal para campos de contraseña;
“hidden” es un campo oculto, para almacenar información que el usuario no vaya a introducir de forma activa. Por ejemplo, podríamos incluir el tiempo que ha tardado el usuario en rellenar el formulario;
“button” mostrará un botón;
“submit” dibuja un botón “Enviar” que al pulsarlo enviará el formulario a la acción que corresponda;
“image” utiliza una imagen con la misma función que el botón de tipo “submit”. Me gustaría destacar que, en la actualidad, esta opción es poco utilizada;
y “reset” inserta un botón que reiniciará el formulario, borrando los datos insertados por el usuario.

“disabled” deshabilita el campo para que no pueda ser utilizado. Para cumplir con estándares (argumento=“valor”), “disabled” se iguala a la cadena “disabled”
La representación depende del navegador, pero el campo queda totalmente inutilizable.

“readonly” funciona de forma parecida a “disabled” pero, aplicado por ejemplo a un input de tipo “text”, sería posible seleccionar el texto y copiarlo.

Ciertos campos necesitan de un atributo “value” para completar su funcionalidad, como veremos en los ejemplos a continuación.

Ahora que ya conoces todos los atributos comunes a etiquetas <input />, vamos a profundizar un poco en cada tipo.

El tipo de <input /> por defecto es “text”, no en vano el campo de texto el más común.
Los <input /> de tipo texto, pueden limitar el número de caracteres que se insertan.
Esto es útil, por ejemplo, para controlar que ciertos campos, que en base de datos están limitados, no lleguen con más datos de los que se pueden almacenar.
“maxlength” es el atributo encargado de ello y el valor debe ser un número entero.
El atributo “size”, también espera un número y se traduce en la anchura del campo de texto en caracteres; es decir, un <input /> con size=“3” será lo suficientemente ancho para mostrar tres caracteres, pero no cuatro.
Al estar directamente relacionado con el estilo, desaconsejo el uso de este atributo. En la medida de lo posible, trata de separar estructura de estilo en tus desarrollos web, te facilitará el mantenimiento.
El campo “value” en <input /> de tipo texto, indica el valor que tiene este campo por defecto.
Por ejemplo, y aunque en la actualidad no se realice esta práctica, podríamos poner el texto “Buscar…” en un campo para aclarar su funcionamiento.
Este texto no se borrará cuando el componente obtenga el foco y el usuario deberá borrarlo para poder insertar su propia cadena.
Normalmente esta práctica se realiza apoyándose en Javascript o con atributos nuevos de HTML5
Los <input /> de tipo “checkbox” insertan casillas de verificación.
Como estas casillas suelen organizarse en grupos de selección múltiple, es importante que el atributo “name” de todas las casillas de verificación del mismo grupo tenga el mismo nombre, de forma que al recibirlas, el servicio destino sepa que esos valores corresponden al mismo campo.

El atributo “checked” toma como valor el texto “checked” e indica que la casilla aparece marcada por defecto.
Observarás en los ejemplos que, por cuestiones de legibilidad, omito otros atributos que pueden ser necesarios.
El atributo “value” en este tipo de elementos es imprescindible.
Le indica al formulario qué valor debe enviar si la casilla está activada.
Si no se declara, el formulario enviará información imposible de procesar.

Los <input /> de tipo “radio” se representan como casillas de opción (también conocidas como botones radio(redondo))
La particularidad de estas casillas es que, a diferencia de las de verificación, solo es posible seleccionar una de las opciones.
Para que el control funcione correctamente es necesario que todos los elementos de cada grupo de casillas de opción, tengan el mismo valor para el atributo “name”.
Del mismo modo que las casillas de verificación, un <input /> de tipo “radio”, mediante el atributo “checked”, se mostrará seleccionado por defecto.
El atributo “value” del <input /> seleccionado, será el que se envíe junto al formulario.

Los <input /> de tipo “file” ofrecen la posibilidad al usuario de adjuntar archivos al envío del formulario.
Según la W3Schools, con el atributo “accept” es posible especificar los tipos de archivo que aparecen para ser seleccionables pero, ni está implementado por todos los navegadores mayoritarios, ni supondrá filtro alguno, ya que la opción de “Todos los archivos” permitirá al usuario subir cualquier tipo de archivo.

Recuerda que la etiqueta <form> tiene un atributo “enctype” que debe tener el valor “multipart/form-data” para el envío de archivos. <form enctype=multipart/form-data>

Es común ver campos que a priori parecen de tipo texto y al tratar de escribir, aparecen puntos o asteriscos en lugar de los caracteres introducidos. Estos son los campos de texto enmascarado o type=“password”.
Estos campos tienen las mismas opciones que los campos de tipo texto.
A veces es interesante trabajar con campos ocultos para enviar información que creemos útil pero que el usuario no insertará de forma directa.
Por ejemplo, como comentábamos antes, sería posible que un método en Javascript contabilizara el tiempo que tarda el usuario en rellenar el formulario y lo introdujera en este campo antes de enviarlo.
En campos type=“hidden” solo son útiles los atributos “name” y “value”, puesto que no son visibles para el usuario.

Los botones son otro elemento común en los formularios.
Cada vez es más raro verlos con los estilos del navegador por defecto, puede que porque sean demasiado feos o porque no encajen en el diseño de la web.
Para cada tipo de botón se utiliza un tipo de <input /> diferente, vamos a verlos todos:
Al marcar un <input /> como tipo “submit”, se dibujará un botón con el texto “Enviar” cuya acción será enviar el formulario al destino marcado en el atributo “action” de la etiqueta <form>.
Los botones del tipo “reset” suelen tener un texto similar a “Restablecer”. Este botón reinicia el formulario, dejándolo como si el usuario no hubiese modificado nada.
También es posible insertar botones con otro tipo de acciones, para ello se establece el atributo type=“button”.
Para dotar de acción a estos botones, es necesario trabajar con eventos Javascript; bien intrusivo, mediante atributos como “onclick” o bien no intrusivo, haciendo uso de librerías o scripts no incrustados en HTML.
Esto se verá en el tema Javascript.
Existe un tipo, raramente utilizado, que consiste en usar una imagen como botón. Si establecemos el atributo type=“image”, podremos ver este resultado.
Para este tipo de <input />, se utilizan, del mismo modo que para las imágenes, los atributos alt, para incluir un texto alternativo y src, para especificar la ruta a la imagen.
Este tipo de botones está a medio camino entre estructura y diseño, por lo que desaconsejo su uso. Podremos trabajar el estilo del botón mediante CSS

El atributo “value”, empleado en botones, especifica el texto que aparece en el botón; salvo en el caso de los botones de tipo imagen que, obviamente, no muestran texto.
Para no alargar en exceso el vídeo, he dejado el resto de etiquetas de formularios para un segundo vídeo.

En resumen,

  • Los formularios se envían mediante dos métodos: GET y POST.
  • Con GET, el envío está limitado y la información enviada es visible; sin embargo, es útil para poder guardar el resultado en marcadores o favoritos.
  • y con POST, el envío no tiene limitación y los datos no son visibles en la URL, además, permite la subida de archivos.
  • Todas las etiquetas de formulario deben ir entre etiquetas <form> y </form> para que su información sea enviada con el formulario.
  • Hemos visto que la etiqueta input es muy versátil.

Para terminar, te dejo cuatro consejos que espero te sean útiles:

  • Fuera de las etiquetas <form> y </form> es posible utilizar elementos de formulario, serán visibles, pero no se enviará la información. Repasa el código.
  • Especifica siempre el atributo “type”.
  • Necesitarás un botón “submit” para enviar el formulario.
  • En la medida de lo posible, separa contenido de estilos, lo agradecerás cuando tengas que mantener la web.

Actividad

Actividad

1. Crea una página web que contenga un formulario con los siguientes campos de información:
  • El nombre, con un control de tipo texto.
  • Los apellidos, con un control de tipo texto.
  • El sexo, con dos opciones excluyentes hombre o mujer.
  • El correo electrónico, con un control de tipo texto.
  • Una casilla de verificación con el texto "Deseo recibir información sobre novedades y ofertas".
  • Una casilla de verificación con el texto "Declaro haber leido y aceptar las condiciones generales del programa y la normativa sobre protección de datos".
  • Un botón de envío.
Además, tienes que tener en cuenta los siguientes requisitos:
  • El título de la página debe ser Formulario de registro - Mi web.
  • El método de envío del formulario debe ser GET.
  • El destino del envío del formulario debe ser "".
  • La longitud máxima de entrada de datos de los controles para el nombre y los apellidos debe ser 50 caracteres.
  • La casilla de verificación con el texto "Deseo recibir información sobre novedades y ofertas" debe estar activada por defecto.

<!-- SOLUCIÓN -->
<html>
<head>
<title>Formulario de registro - Mi web</title>
</head>
<body>

<h1>Formulario de registro</h1>

<form action="" method="get">
<p>
Nombre: <input type="text" name="nombre" maxlength="50" />
</p>

<p>
Apellidos: <input type="text" name="apellidos" maxlength="50" />
</p>

<p>
Sexo: <input type="radio" name="sexo" value="h" /> hombre <input type="radio" name="sexo" value="m" /> mujer
</p>

<p>
Correo: <input type="text" name="correo" maxlength="100" />
</p>

<p>
<input type="checkbox" name="info" checked="checked" /> Deseo recibir información sobre novedades y ofertas
</p>

<p>
<input type="checkbox" name="condiciones" /> Declaro haber leido y aceptar las condiciones generales del programa y la normativa sobre protección de datos
</p>

<p>
<input type="submit" value="Enviar" />
</p>
</form>

</body>
</html>