Validación nativa de formularios en HTML5

Seguimos con las virtudes de HTML5, y el como en principio este nuevo standar nos facilitará la vida a los programadores web. Porque una de las evoluciones más potentes que incorpora es la validación de formularios de forma nativa, sin necesidad de Javascript (da la impresión de que a largo plazo la idea es cargarse este lenguaje cliente).

Como ya sabéis, tenéis varios tipos de input, que paso a listar debajo:

  • search: Para cajas de búsqueda
  • number: Para añadir o restar números mediante botones.
  • range: Para seleccionar valores dentor de un rango.
  • color: Para seleccionar un color.
  • tel: Para números de teléfono.
  • url: Para direcciones web.
  • email: Para direcciones de correo electrónico.
  • month: Para meses.
  • date: Para fechas.
  • week: Para semanas.
  • time: Para horas.
  • datetime: Para una fecha exacta, absoluta y con hora
  • datetime-local: Para fechas locales y frecuencia

Al definir el tipo de campo la validación de formato ya se realiza de forma nativa sin necesidad de tener que recurrir a una expresión regular. Pero si queréis una validación más compleja (por ejemplo, que el teléfono sólo pueda empezar por 6, 9 u 8, que son las tres posibilidades en España) podéis recurrir al atributo pattern, que nos permite insertar un patrón, con el estilo de una expresión regular, para validar el contenido. Y eso no es todo, si queréis que el campo sea obligatorio basta con añadir el atributo required, y ya de forma nativa se comprueba que haya datos. Con el atributo title podéis introducir el texto que queréis que se muestre en el tool tip que saldrá para informaros del error. Podéis ver varios ejemplos:

<input type="email" title="Use el siguiente formato: direccion@mail.com" required/><!--Esto validaría un correo electrónico de forma nativa-->
<input class="hiddenSpellError" type="text" />type="text" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$" name="email" required/> <!-- Esto validaría un correo electrónico con una expresión regular -->
<input class="hiddenSpellError" type="text" />type="date" /> <!--Esto nos sacaría un "datepicker" para seleccionar una fecha (varía según navegador)-->

Ya lo veis, la validación es fácil. Pero además, resaltar los campos erróneos se facilita también con CSS3, ya que aparece una nueva pseudo-clase: invalid. Esto nos ahorra tener que andar jugando con javascript para marcarlos. Con la pseudoclase, basta con una sencilla regla CSS para conseguirlo, sin tener que capturar ningún evento:

input:invalid{
  border: 1px solid red;
  color: red;
}

Sólo con ese código los campos inválidos ya se pondrán automáticamente en rojo, quedando resaltados.

De momento no todos los navegadores dan soporte a la validación nativa en HTML5, pero es evidente el potencial de esta característica, que proveerá de gran productividad y comodidad al programador.

Vídeo en HTML5 (básico)

Utilizando HTML siempre nos encontramos con el problema de tener que depender de QuickTime y AdobeFlash para insertar audio o vídeo. HTML5 nos da las etiquetas AUDIO y VIDEO que nos permiten, con mayor facilidad, insertar este tipo de recursos multimedia en nuestra página.

En esta ocasión nos centraremos en la etiqueta VIDEO, que como habréis podido deducir nos permite insertar vídeos en nuestra página. El uso de esta etiqueta es tan simple como lo que podéis ver en el siguiente ejemplo:


<video src="example.mp4" width="600" height="320" controls preload></video>

Ya ves que no es complejo, aunque requiere una cierta explicación. Estos son los atributos que tienes a tu disposición:

  • SRC: Enlaza con el archivo de video que queremos reproducir
  • WIDTH: El ancho del video en pixeles.
  • HEIGHT: El alto del video en pixeles.
  • CONTROLS: Nos permite incluir los controles del reproductor del navegador como el botón de play o el volumen.
  • AUTOPLAY: Permite especificar si el archivo de video se reproduce desde que se carga la pagina.
  • PRELOAD: Carga un poco el archivo de video en el buffer antes de iniciar la reproducción, para que no se trabe mientras se reproduce.

Todo parecía muy fácil hasta aquí, pero, mi querido programador web, ya sabes que NUNCA es tan fácil. Si los problemas para conseguir la compatibilidad de tu maquetación en CSS en todos los navegadores te ha hecho envejecer prematuramente varios años ya sabes lo que viene ahora: Los distintos navegadores dan soporte a distintos formatos de vídeo (seguro que no te sorprende, seguro que te lo venías oliendo). Las compatibilidade de los motores de los navegadores con los codecs de vídeo son:

  • H.264 :: Soportado por Safari, Google Chrome e Internet Explorer 9. Se trata de un codec propietario
  • OGG Theora :Soportado por Firefox, Opera y Google Chrome. Es libre, pero menos eficiente que H.264, ya que ofrece menor calidad y mayor tamaño de los archivos.
  • WebM : Soportado por Google Chrome, Firefox y Opera, aunque Google también ha creado un plugin para que funcione en IE9, y en Safari debería funcionar ya que usa como base QuickTime para reproducir vídeo. Es libre, ofrece una calidad similar a H.264 pero además consigue una mejor compresión, creando archivos más ligeros. Incluso el FlashPlayer de Adobe soportará este formato.

Todo esto provocado por el enfrentamiento entre los consorcios WHATWGs (apoyado mayoritariamente por Google, Mozilla y varias empresas del campo de software libre) y MPEG-LA (este apoyado por el eje del mal: Apple/Microsoft). Tal cual está el tema de las licencias a día de hoy, en 2016 el codec H.264 podría pasar a ser de pago, así que habrá que tener ojo con eso.

Entonces ¿cómo consigo la compatibilidad entre varios navegadores? Tampoco es difícil. Lo que tienes que hacer es no poner el atributo src dentro de la etiqueta VIDEO. En su lugar, tienes que crear etiquetas SOURCE con los distintos src y especificando en cada uno el codec, y ponerlas entre la apertura y el cierre de VIDEO, como en el siguiente ejemplo:

<video width="600" height="320" controls preload>
  <source src="ejemplo.ogv" type='video/ogg; codecs="theora,vorbis"' />
  <source src="ejemplo.mp4" type='video/mp4; codecs="avc1,mp4a"' />
  <source src="ejemplo.webm" type='video/webm; codecs="vp8,vorbis"' />
</video>

Como ves, la etiqueta SOURCE tiene como argumentos el src y type, donde definís el tipo de vídeo y el codec a reproducir.

En fin, el futuro próximo de la web está aquí, en HTML5. Haciendo uso de CSS además podréis lograr un reproductor más personalizado, más «bonito» y visible. Id pegándole un ojo.

Encriptando en MD5 con java

Todavía no he buceado mucho en JavaSE7, pero que yo recuerde JSE6 no incluía ninguna función que encriptara en MD5, y a la hora de trabajar con contraseñas (a nivel de seguridad web, por ejemplo) este algoritmo es muy útil. Normalmente en mis desarrollos en PHP suelo encriptar en el cliente usando una función md5 en Javascript, pero en Java podréis hacerlo con el siguiente código. Se trata de una función que recibe una cadena y devuelve su hash md5.

Bueno, primero tendréis que incluir estas dos librerías:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

En todo caso, si usáis Eclipse o NetBeans para programar en Java ya os pedirá que importéis dichas librerías al añadir referencias a ellas en el código. La función es la siguiente:

        public static String cryptMD5(String textoPlano)
	{
		try
		{
		   private static final char[] HEXADECIMALES = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };

		   MessageDigest msgdgt = MessageDigest.getInstance("MD5");
		   byte[] bytes = msgdgt.digest(textoPlano.getBytes());
		   StringBuilder strCryptMD5 = new StringBuilder(2 * bytes.length);
		   for (int i = 0; i < bytes.length; i++)
		   {
		       int low = (int)(bytes[i] & 0x0f);
		       int high = (int)((bytes[i] & 0xf0) >> 4);
		       strCryptMD5.append(HEXADECIMALES[high]);
		       strCryptMD5.append(HEXADECIMALES[low]);
		   }
		   return strCryptMD5.toString();
		} catch (NoSuchAlgorithmException e) {
		   return null;
		}
	}

La he testeado y ha ido funcionando, así que creo que os puede hacer un buen servicio a la hora de trabajar con contraseñas de forma segura.

Utilizando el cache de páginas con PHP

Cuando desarrollamos una página en PHP que necesita cargar información desde una base de datos nos encontramos que, en principio, se lanza una petición a la base de datos con cada recarga, que luego se procesa con el código PHP. Si tenemos una página web con poco tráfico (un blog, la página web de un grupo musical o un negocio), una web cuya información no cambie mucho, nos puede interesar crear un archivo de cache para evitar esta recarga. Esto ralentizará un poco la primera carga de la web, pero agilizará las sucesivas recargas de la misma, facilitando la navegación. En caso de páginas web optimizadas para dispositivos móviles (smartphone y tabs), que suelen depender de redes más lentas que los PC (por tirar de conexión 3G) es una opción muy válida.

Lo primero es crear una carpeta con permisos de escritura a la que llamaremos cache/ para almacenar ahí los archivos. Ok, allright, yeah man. Cuando nos metamos con el código (que pondré en un ejemplo más abajo) tenemos que pensar que hay que establecer un tiempo de expiración de la página, ya que si no no se recargaría nunca. Lo mejor es darle un tiempo que creamos prudencial para que sea eficiente sin llegar a dejar desactualizado al usuario. En fin, teniendo en cuenta todo esto, el código sería el siguiente:

$archivoCache = "cache/".$elnombrequecorresponda.".html"; //El archivo con el caché
$tiempoCache = 600; // el parámetro va en segundos, así que serían 10 minutazos

if (file_exists($archivoCache) && (time() - $tiempoCache
< filemtime($archivoCache)))
{
    include($archivoCache);
    echo "\n";
    exit;
}
ob_start(); //inicialización del buffer de salida

//Aquí iría el código PHP y HTML que corresponda

$fp = fopen($archivoCache, 'w'); //Abrimos el archivo con el cache

fwrite($fp, ob_get_contents());//Escribirmos el archivo
fclose($fp);//Cerramos el archivo IMPORTANTE!!!!! que mucha gente se olvida
ob_end_flush(); //limpiamos el buffer para evitar errores

En fin, creo que con estas instrucciones comentada ya os vais pispando todos de cómo funciona la cosa. Par el ejemplo di un tiempo de 10 minutos (ajustad vosotros según creáis conveniente) y la variable $elnombrequecorresponda pues… eso, que ahí ponéis el nombre que corresponda al archivo que queréis cachear.

En fin, chavatares, con esto me voy a dormir, que es tarde… o puede que no, porque no se si mi ordenador a cambiado o no la hora automáticamente. Si mañana llego tarde a todas partes le echaré la culpa. Un cibersaludo!!

Ventanas modales con jQueryUI

Como soy masoquista, tras un duro día desarrollando en PHP/Javascript creo que voy a hacer una entrada sobre informática en mi blog… por seguir esta racha.

Hoy he tenido mi primera experiencia con jQueryUI, una biblioteca para el framework jQuery. Lo he utilizado para crear un formulario de correo en una ventana modal y… oye, qué fácil, qué productividad reporta esta librería. En este enlace tenéis a vuestra disposición dicha librería, con muchas demos y documentación.

Para el caso de las ventanas modales tendremos que recurrir al widget «dialog», que nos permitirá hacer desde una suerte de alert más sofisticado hasta introducir todo un formulario (como era mi caso).

El uso de dialog() puede resumirse con facilidad en el siguiente ejemplo:

<html>
    <head>
        <link rel="stylesheet" href="css/darkness/jquery-ui-1.8.18.custom.css">
        <script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
        <script type="text/javascript" src="js/jquery-ui-1.8.18.custom.min.js"></script>
        <script>
            $(function(){
                $("#ventanaModal").dialog({
                   title:"Título a elegir",
                   modal: true
                });
            })
        </script>
    </head>
    <body>
        <div id="ventanaModal"></div>
            <p>Aquí metes lo que quieras</p>
        </div>
    </body>
</html>

Con esto tenéis lo mínimo para tener una ventana modal: un div con el contenido al que aplicáis el método dialog pasándole como parámetros el título y el parámetro modal como true (si no le pasárais modal: true se abriría también, pero no bloquería los elementos del fondo, como debe hacer una ventana modal). Pero esto queda muy soso, así que vamos a ir haciendo cosillas.

Lo primero es meter algo más de contenido, para que veas las posibilidades. Por ejemplo, una pregunta que requiera confirmación (como en un window.confirm de los de antaño):

<div id="ventanaModal">
<span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>
    ¿Acepta usted las condiciones de uso y que le espiemos impunemente?
</div>

Ahora ya tenemos un aviso de seguridad, vamos con lo siguiente, meterle algún efectillo a la página para que quede chulo cuando se despliega en pantalla:

               $("#ventanaModal").dialog({
                   title:"Título a elegir",
                   modal: true,
                   show: "slide",
                   hide: "explode"
                });

Con esto aparecerá deslizándose y desaparecerá explotando en mil pedazos (bueno, realmente en nueve pedazos). En cualquier caso te habrás fijado en que no hay botones dentro del div. ¿Por qué? Porque los creó la desde javascript definiendo la propiedad buttons, que recibe como parámetro un objeto json con la información y con su función:

           buttons: {
            "Sí": function(){
                alert("has aceptado, tu alma es nuestra");
            },

            "No": function(){
                alert("no has aceptado, te jodes y te quedas sin servicio");
            }
        }

Como resumen entonces el javascript completo quedaría tal que así:

$("#ventanaModal").dialog({
   title:"Título a elegir",
   modal: true,
   show: "slide",
   hide: "explode",
   buttons: {
            "Sí": function(){
                alert("has aceptado, tu alma es nuestra");
            },

            "No": function(){
                alert("no has aceptado, te jodes y te quedas sin servicio");
            }
        }
});

En este caso son dos alerts chorras, pero sirve para que te hagas una idea del potencial que tiene este widget si ya has trabajado antes con javascript.

Nos queda añadir un botón, mismamente, en el html que llame a la ventana y la abra (es decir, el botón en el marcado y el script con la acción). Algo tipo:

<input type="button" name="accept" id="accept" value="Aceptar"/>
<script>
    $("#accept").button().click(function() {
	$("#ventanaModal").dialog("open");
    });
</script>

Y con esto y un bizcocho… se acabó el ejemplo. Ahora te recomiendo que te pelees un rato con esta librería, porque parece que puede dar muchas alegrías.

Firebug, tu mejor amigo.

¿Eres desarrollador web? ¿Estás interesado en serlo? ¿Buscas herramientas que te simplifiquen la vida? Entonces necesitas Firebug

¿Qué es Firebug? te dirás. Firebug es una herramienta cojonuda, Open Source y con licencia BSD (y además gratis), que puedes instalar como un add-on en Mozilla Firefox. Si conoces otras herramientas como el Firefly de Opera, ChromeInspector, o las herramientas de desarrollo web de Internet Explorer te puedo decir que Firebug se las merienda. Mucho más simple, claro, usable y productivo.

¿Qué nos permite Firebug? Nos permite inspeccionar el código HTML de las páginas, depurar código javascript, comprobar la comunicación con el servidor, testear ciertos aspectos de la seguridad de la página, inspeccionar DOM, probar modificaciones en el CSS (con la seguridad de que no te cargas nada)… Todo con pasmosa facilidad, y además, para los hispanoparlantes, disponemos de él en castellano (y es posible que aparezca próximamente una versión en gallego pero… de momento dejadlo en rumore)

¿Su principal defecto? Mayormente que no haya una versión para cada navegador, de momento sólo dispones para él en Mozilla Firefox

Existen inclusive parches que te permitirán utilizarlo para testear código flash, e incluso decompilar los archivos swf.

Tienes también a tu disposición una wiki con diversa información (en inglés) sobre este plugin en el siguiente enlace. Y me reitero, Firebug es una herramienta que me ha salvado el culo en muchos desarrollos, tanto como autónomo como en empresas, no es un juguete, sino una buena herramienta de trabajo. No podía dejar de declararle mi amor en este blog, es un proyecto que merece mucho la pena y que, si lo sabes utilizar, te facilitará mucho el trabajo. No dejes de probarlo.

Introduciendo Prototype // Combinar jQuery con Prototype

Aunque me había planteado llevar mi debate de Twitter con mi colega Jumnper sobre el «Rock the Rebel, Metal the Devil» de Volbeat a este blog (a él le encanta, a mi me recuerda terriblemente al Load de Metallica), creo que mejor seguiré un poco más con entradas centradas en informática, por «comercialidad» porque son las más leídas (curiosamente tengo un montón de visitas desde México en este tipo de entradas)

Más de una vez he hablado de jQuery aquí, un gran facebook que nos da gran productividad en javascript, pero que no es la única opción. Prototype desde un primer momento ha protagonizado una encarnizada batalla con jQuery por la corona de «framework más usado». Podéis descargarlo en este enlace para trastear con él.

Al igual que en jQuery existe una función $, que en Prototype nos permite seleccionar los elementos por su ID. Dirás «en jQuery es mejor porque permite cualquier selector CSS», cierto, pero también existe una función para eso, que es $$

Otros métodos intersantes son $F, que accede al valor de un campo de un formulario, $A, que convierte listas de nodos o colecciones HTML en arrays, $H, que permite crear arrays asociativos o $R, que permite crear rangos de valores.

A la hora de trabajar con cadenas tenemos el método escapeHTML(), que permite transformar los caracteres problemáticos en su entidad HTML. También puedes usar toArray(), que convierte la cadena en un array de caracteres, y dispones de camelize(), que convierte una cadena separada por guiones a notación CamelCase.

Los métodos .show() y .hide() son lo que parecen ser, ocultan o muestran el elemento seleccionado (como sus homónimas en jQuery). En cambio .toogle() lo que hace es cambiar el estado entre show y hide dependiendo de en cual esté el elemento.

En cuanto a métodos para campos de formulario lo más interesante me parece .clear(), que vacía el valor de un campo, y .present(), que es cojonudo para validar campos, dado que devuelve false si el campo está vacío. Y si aplicas .disable() a un formulario lograrás desactivar todos sus campos.

Pero es con Ajax con lo que Prototype realmente te facilita la vida. Tienes Ajax.Updater(), que recibe tres parámetros: el ID del elemento a recargar por ajax, la página php que generará el código y varias opciones, y con Ajax.PeriodicalUpdater sólo tendréis que pasarle el parámetro frecuency seguido de un número ({frecuency:30}) para que realice una recarga automática por cada intervalo de ese número de segundos.

Y trabajando con DOM tampoco os dejará tirados este framework. El método .insert(), por ejemplo, os dejará elegir si queréis ponerlo detrás de, delante de, antes o encima de, y después o debajo de un elemento en concreto.

¿Mejor jQuery o Prototype? Bueno, cada uno tiene sus debilidades y sus potenciales. Yo uso más jQuery, por conocerlo mejor, pero incluso los podéis usar a la vez. Pero cuidado, tenéis que hacer un apañito antes para evitar conflictos, dado que ambos tienen un método $. La forma de evitar el conflicto es usando el método .noConflict() como en el ejemplo:

var $jQ = jQuery.noConflict();

A partir de ese momento la abreviatura de jQuery (que por defecto es $) pasar a ser la que tú has definido en la variable (en este caso $jQ), permitiéndote usar ambos frameworks sin conflicto entre ellos.

De todas formas, no suele ser práctico utilizar dos frameworks, aunque evites los conflictos siempre estás metiendo más carga a la web (aunque por otra parte, pesan bastante más muchas imágenes que los archivos .js de estos frameworks).

Programa en C que imprime el código ASCII// Imprimir letra ñ en C y CPP

Así, a lo tonto, voy a hacerme aquí un típico ejemplo académico de C. No se si aportará mucho o si le interesará a alguien, pero lo hago por una cuestión más bien curricular (vamos, que he mandado curriculums a academias para dar clases de c y quiero que vean que podría dar clase… sí, lo digo así de sincero).

Lo primero es comentar que cuando uno hace un programa en C en castellano se va a topar con una «coñetta» muy jodona… Los caracteres ñ y Ñ no se imprimen si los pones a saco directamente en una cadena. Es decir, la instrucción «printf(«coñetta»);» saldría con algún símbolo raro en lugar de la Ñ. Pero don’t worry, imprimir una ñ, minúscula o mayúscula en C y C++ no requiere ser ingeniero informático. Y hasta tenéis varias opciones que podréis ver en el siguiente ejemplo:

void main(){
  printf(" %c ",164);//imprime una ñ minúscula
  printf(" %c ",165);//imprime una Ñ mayúscula
  printf(" xA4 ");//imprime una ñ minúscula
  printf(" xA5 ");//imprime una Ñ mayúscula
  printf(" co%co ",164);//imprime coño
  printf(" cumpleaxA4os ");//imprime cumpleaños
}

En los dos primeros ejemplos estaríamos diciendo «imprime una variable de caracter con el caracter cuyo valor ASCII sea 164» (165 en el segundo caso). Si estás mirando esto supongo que ya sabes algo de C, ya sabes que la función printf imprime datos en pantalla y que %c es una variable de caracter, y 164 y 165 no serían más que los parámetros con el valor ASCII.

En los casos 3 y 4 realmente es lo mismo. La instrucción viene a decir «imprime el caracter cuyo valor ASCII hexadecimal es A4» (A5 en el caso de la mayúscula). En cualquier caso ambos ejemplos hacen referencia a la tabla de valores ASCII.

Claro, el valor ASCII en principio es ese si nos ceñimos a Windows/MS-DOS. Pero en un SO Apple, BSD o Linux podría variar dependiendo de la distribución. Con este sencillo programa podéis imprimir toda la tabla ASCII para comprobarlo:

#include stdio.h;
void main(){
  int i; //variable contador para el bucle
  printf(“C%cdigo\t-\tLetrann”, 162);

  for(i=0; i<256; i++)//bucle for que recorre los 256 caracteres ASCII
    {
      printf(“%d\t-\t%c\n”, i, i);//imprimimos el número y el caracter
    }
}

Y así a lo tonto ya tenés in práctico programa que os imprimirá toda la tabla ASCII. Y si soy capaz de escribir esto a las cinco de la mañana volviendo de un pub, imaginad cómo puedo dar clase descansado y preparado.

Creando ToolTips chulos con TinyTip y jQuery

Un aspecto que muchas veces descuidamos en nuestras webs son los Tooltips. A día de hoy, con tanta paranoia por el diseño instalada en nuestras cabezas por las políticas apple, el tradicional Tooltip estilo Windows será percibido como «chapucero» por el usuario (o cliente) que demandará una imagen más «2.0» (el palabro de moda).

TinyTip es un plugin ligerito, fácil de usar e implementar, que le dará una estética muy chula a vuestros proyectos. Os lo podéis descargar desde este enlace, en el que tenéis el .css el .js y una carpeta con imágenes de prueba.

Lo primero que debéis hacer es incluir en vuestro proyecto los archivos css, jQuery y el javascript de Tinytips, tal que así:

rel="stylesheet" type="text/css" media="screen" href="styles/tinyTips.css" />
<script type="text/javascript">// <![CDATA[
type</span>="text/javascript" src="js/jquery-1.7.1.min.js">
// ]]></script>
<script type="text/javascript">// <![CDATA[
type</span>="text/javascript" src="js/jquery.tinyTips.js">
// ]]></script>

Recordad poner la ruta en la que hayáis guardado los archivos. Si queréis no necesitáis descargar jQuery, sino que podréis enlazarlo a la página de google. El siguiente paso es inicializar los Tooltips

<script type="text/javascript">// <![CDATA[
type</span>="text/javascript">
		$(document).ready(function() {
			$('a.tTip').tinyTips('title');
			$('a.imgTip').tinyTips('<img <span="" class="hiddenSpellError" pre="img ">src="imagenes/demo-image.jpg" />
Puedes usar imágenes en tus Tooltips.', 'yellow');
			$('img.tTip').tinyTips('title', 'green');
		});
      </script>

Bueno, puedes ver tres inicializaciones: La primera implica que los enlaces de la clase tTip mostrarán como texto el que metáis en el parámetro title. El segundo es lo mismo, con la clase imgTip, pero mostrará una imagen y, debajo de ella, el texto, y además recibe el parámetro ‘yellow’, que define el color de fondo. La tercera es un tooltip para una imagen, de nuevo con el texto definido en title y fondo verde (los colores que podéis usar los veréis al descargar la carpeta images). En el siguiente ejemplo podéis ver la implementación dentro de un html:


<div id="<span class=" hiddenspellerror"="" pre="id ">demo"></div>

    
<img <span="" class="hiddenSpellError" pre="img ">class="tTip" src="imagenes/demo-image.jpg" title="Hola, soy una imagen de muestra!" />Lorem ipsum dolor sit amet. <a class="imgTip" href="#">Enlace con un tooltip con la misma imagen que la de al lado</a> In ligula mauris, aliquam quis tempor quis, consectetur a erat. Nulla non justo pellentesque dui elementum pharetra nec eu magna. <a class="tTip" href="#" title="Y en este último ejemplo podéis ver que puedo poner un texto todo lo largo que quiera, aunque lo normal es una explicacioncilla corta, no un parrafazo tan largo">Último ejemplo</a>

    </p>
</div>

En fin, con estas simples instrucciones veis que podéis tener vuestros Tooltips personalizados y bien chulos sin romperos la cabeza

// ]]>

Ordenando un array multidimensional por un campo en PHP

Aunque había pensado publicar «como hacer una encuesta en la que no pueda votar ni dios para así poder inventarte el resultado tranquilo» no lo haré porque se me han adelantado los del diario ABC. En lugar de eso he pensado que a alguien podría interesarle una función que ordene un array multidimensional por un campo en concreto.

La función en si recibirá tres parámetros: el array, el nombre del campo y un valor booleano que indique si se querrá en orden inverso o no. Podéis ver este ejemplo de código:

function orderMultiDimensionalArray ($array, $campo, $invertir) {
    $posicion = array();
    $newRow = array();
    foreach ($array as $key => $row) {
            $posicion[$key]  = $row[$campo];
            $newRow[$key] = $row;
    }
    if ($invertir) {
        arsort($posicion);
    }
    else {
        asort($posicion);
    }
    $arrayRetorno = array();
    foreach ($posicion as $key => $pos) {
        $arrayRetorno[] = $newRow[$key];
    }
    return $arrayRetorno;
}

La función asort ordena un array por los valores que contiene en orden de menor a mayor (si hay valores numéricos los pondrá antes que los alfabéticos). El caso de arsort es el mismo sólo que inverso, ordena de mayor a menor.

Ya véis que es sencillo y no tiene mucha ciencia. Existe también la función ksort (con su versión «reverse», la función krsort) que también ordena, pero en lugar de ordenenar por el valor lo hace por el índice.