Sortea2 Blog

  • Problemas CSS en Internet Explorer

    Problemas de CSS en Internet Explorer

    Internet Explorer tiene una manera de entender CSS muy “peculiar” que  hace que todos los diseñadores web tengan que dedicar gran parte de su tiempo en hacer que su proyecto funcione particularmente en Internet Explorer. Esto es una gran pérdida de tiempo y puede que de dinero, pero que no hay más remedio que afrontar, por esto:

    estadisticas_navegadores.jpg

    Hay que preocuparse por el volumen de visitas que van a llegar al website por parte de Internet Explorer, porque es tal que no se puede despreciar.

    Caso particular

    Particularmente, en Sortea2, nuestra página de sorteos, también tuvimos que lidiar con estos problemas, tuvimos que tomar medidas porque la página, que se visualizaba correctamente en firefox, opera, etc., era impresentable en Explorer, las cosas normalmente se montaban unas encima de otras y tal.

    Qué cosas dan problemas

    Tras haber terminado el diseño de Sortea2, he llegado a la conclusión de que estas cosas son las que dan problemas:

    1. Listas.
    2. Márgenes negativos para posicionar.
    3. Posicionamiento normal.
    4. Desbordamiento de divs.
    5. Imágenes de fondo.

    1.  Las listas es lo que habitualmente más problemas da, cuando quieres formatearlas con padding y margin suelen tratar las cosas de diferente manera que los navegadores normales. Por ejemplo, no puedes variar el valor de margin-left en las listas para que estén alineadas a la izquierda con tan solo poner: “margin-left:0px;”.
    También suelen dar problemas las listas que se colocan a lo ancho (float:left;), hay que ir probando con qué valores funcionan bien. Por ejemplo, en nuestro menú horizontal, el valor float:left; había que ponerlo en #menu_horizontal li a {} para que funcionase, mientras que en otros lugares se podía colocar directamente en #menu_horizontal li {}.

    2. Los márgenes negativos no sé exactamente por qué dan tantos problemas. A veces funcionan, otras veces no, y otras veces hay que poner valores distintos a lo habitual para que se coloque en el lugar que se desea. El mejor ejemplo es en la parte de arriba de sortea2, en la que se ve una diferencia de colocación entre cualquier navegador y Internet Explorer, esto es debido a que a veces los márgenes negativos no funcionaban y tuvimos que intentar colocar las cosas con otros valores.

    3. El posicionamiento normal, con “position:relative y absolute” no suele dar muchos quebraderos de cabeza, simplemente algunas veces hay que cambiar los valores un poco para que las cosas cuadren.

    4. El desbordamiento de divs tiene su “particularidades” en Internet Explorer cuando se quiere hacer “overflow”. Normalmente al desbordarlo suele tener después un tamaño extraño que cuesta colocar. Esto nos pasó con el div #resultado, que se despliega en la pantalla de sorteos simples al hacer un sorteo, en firefox funciona perfectamente, pero en internet explorer se ve como se contrae un poco cuando la lista de ganadores es demasiado grande y hace que salga el scroll en el div.

    5. Las imágenes de fondo se suelen colocar correctamente y tal, el problema es el orden en que se cargan. Por ejemplo, al principio, en las pestañas que se utilizan cuando se utiliza el buscador o en la pantalla de Mis Sorteos, utilizábamos un hover que consistía en otra imagen, Bien, pues firefox y opera cargaban esa imagen antes de que terminara de cargar la página, por lo que el efecto se hacía correctamente; el problema lo daba Internet Explorer, porque se cargaba la imagen en el momento en que se hacía el hover, con lo que había que esperar un tiempo para ver el efecto. Fue tan desastroso el resultado que optamos por subrayar esos links al pasar por encima y listo, de camino lo dejamos igual para ambos navegadores.

    Soluciones

    La solución por la que optamos nosotros fue:

    • Una hoja de estilos común, en la que las propiedades que funcionasen en ambas estuvieran recogidas.
    • Una hoja de estilos para Internet Explorer, con todas las correcciones posibles para que se mostrase bien la página.
    • Una hoja de estilos para los demás navegadores. Para evitar que unas propiedades se pisaran a otras, optamos por poner en una hoja de estilos independiente todas las propiedades que daban problemas en Explorer, pero con los valores que serían normales.

    Ahora bien, ¿cómo sabemos qué navegador está mostrando la página y por lo tanto qué hoja de estilo abrir?
    Bien, nuestra página está hecha con PHP, por lo que os voy a mostrar un método para hacerlo con este lenguaje (también se podría hacer con javascript).

    Abrir una hoja u otra dependiendo del navegador

    Bien, PHP recibe por parte del navegador una serie de variables de servidor (idioma, navegador, versión de este último, etc.), pues tenemos que recoger lo que diga la variable que dice qué navegador está mostrando la página:

    $idnavegador = $_SERVER[‘HTTP_USER_AGENT’];

    Esto es lo que obtendríamos de firefox:
    Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5

    Y esto es lo que nos devuelve Internet Explorer:
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)

    Debe haber alguna manera universal que distinga ambos códigos, porque Internet Explorer da problemas igualmente en su versión 6 como en su versión 7.
    Bueno, pues vamos a buscar las diferencias entre ambas cadenas para ver qué podemos sacar que nos diga que estamos en Explorer.

    En Mozilla/X.0 no se puede sacar mucho, la verdad, porque es casi idéntico y con PHP no se podría hacer un cálculo. Pero si nos metemos dentro del paréntesis  empezamos a ver cosas interesantes, y ya si nos metemos en ver que hay después del punto y coma, ya lo tenemos.

    Uno nos devuelve una U y otro nos dice MSIE X.XX, ahí está la diferencia; pero queremos detectar cualquier explorer, no una versión determinada; bien, pues recoges la palabra MSIE y listo, con un parseo veremos que se puede hacer fácilmente:

    $puntocoma = ";";
          
    $total_length = strlen($idnavegador);
    $puntocoma1 = strpos($idnavegador, $puntocoma);
    $navegador = substr($idnavegador, ($puntocoma1 + 2), ($total_length – $puntocoma1));
    $navegador = substr($navegador, 0, 5);

    Es cierto que puede ser un poco lioso, pero es simple: se busca el punto y coma, se coge lo que hay después de él, y luego se cogen 5 caracteres (con 4 recuerdo que dio problemas una vez) de lo que se haya sacado. Con esto ya tenemos esto: “MSIE “, ¡era lo que queríamos!, bueno, pues ahora con un if abrimos una hoja u otra y ya está todo listo.

    if ($navegador == "MSIE ")
    echo "\t<link href=’../css/ie-hacks.css’ rel=’stylesheet’ type=’text/css’>\n";
    else
    echo "\t<link href=\"../css/normal.css\" rel=\"stylesheet\" type=\"text/css\" />\n";

    Ya está, ahora ponemos las propiedades que dan problemas en ie-hacks y ya solo se verán en ese navegador.

    Conclusión

    Internet Explorer es un navegador problemático y tenemos que poner nuestros medios para hacer que esos problemas desaparezcan porque tiene una cuota de mercado espectacular y merece la pena dedicarle tiempo.
    Puede que nuestro método de obtención del navegador no sea precisamente la mejor y la más simple, pero lo cierto es que funciona y que jamás ha dado ningún problema.

    Consejo final

    Como consejo final te diré que cada vez que hagas algún cambio relativamente importante en tu web, si no eres un asiduo a Internet Explorer, que la pruebes ahí antes de seguir con otra cosa, porque luego volver atrás para resolver problemas antiguos es muy molesto.

  • Resultado sorteo del premio gordo de Navidad 2008

    Número premiado con «el gordo»:

    32365

    El sorteo se ha celebrado el 22 de diciembre de 2008.

    Los premios mayores, por serie, son los siguientes:

    • 1 primer premio de 3.000.000 €
    • 1 segundo premio de 1.000.000 €
    • 1 tercer premio de 500.000 €
    • 2 cuartos premios de 200.000 €
    • 8 quintos premios de 50.000 €

    Esta ha sido la mecánica que se ha llevado a cabo durante el sorteo

  • Detectar a los comentaristas más antiguos en el blog

    Si queremos detectar quiénes son nuestros lectores más fieles, podemos mediante una simple select de SQL obtener una lista de nuestros lectores más veteranos que alguna vez han comentado.
    Calculamos la fecha del primer comentario que dejaron y la del último. Aquellos que tengan una diferencia mayor son los que han usando nuestra página durante más tiempo.

    Para WordPress, los diez comentaristas más veteranos:

    SELECT comment_author_email ,
    comment_author,
    max( comment_date ) – min( comment_date ) AS diferencia
    FROM wp_comments
    GROUP BY comment_author_email , comment_author
    ORDER BY diferencia DESC
    LIMIT 0,10

    Para Movable Type, los diez comentaristas más veteranos:

    SELECT comment_email, comment_author
    max(comment_created_on) – min(comment_created_on) as diferencia
    FROM mt_comment
    GROUP BY comment_email, comment_author
    ORDER BY diferencia DESC
    LIMIT 0,10

    Nótese que con este sistema se entiende como un mismo autor a aquel que siempre deja el mismo nombre de usuario y dirección de correo. Si cambiara alguna de estas, no habría forma de distinguirlo.

  • Octavos de final – Champions 08/09

    Resultados del sorteo de octavos de la UEFA Champions League 2008/2009:

    Juventus
    Chelsea
    Liverpool
    Real Madrid
    F.C. Barcelona
    O. Lyon
    Panathinaikos
    Villarreal
    Manchester United
    Inter de Milán
    Roma
    Arsenal
    Oporto
    Atlético de Madrid
    Bayern de Munich
    Sporting de Portugal

    El sorteo ha sido celebrado el 19 de diciembre de 2008 a las 12:00 (GMT+1), el objetivo consistía en conocer los enfrentamientos que protagonizarán los clasificados en la fase de grupos.

    Los criterios de este sorteo fueron los siguientes:

    1. No pueden enfrentarse dos equipos que hayan coincidido en la fase de grupos
    2. No pueden enfrentarse dos equipos del mismo país
    3. Los equipos que terminaron primeros de grupo jugarán el partido de vuelta en casa
    4. Los emparejamientos estarán compuestos por equipos de diferente bombo

    Bombo 1: Bayern, FC Barcelona, Juventus, Liverpool, Manchester United, Oporto, Panathinaikos y Roma.
    Bombo 2: Arsenal, Atlético, Chelsea, Inter de Milán, Olympique de Lyon, Sporting de Portugal, Real Madrid y Villarreal.

    Los partidos de ida se disputarán los días 24 y 25 de febrero, los de vuelta serán el 10 y el 11 de marzo.

  • Jquery. Plugin útiles y otros no tanto.

    La página de Sortea2 abunda en el uso de Javascript mediante librerías de Jquery. Quizás a veces los efectos sean hasta molestos (lo sentimos) pero no se puede decir que la página es estática.

    Cuando se utiliza Jquery una de las mayores ventajas que se esgrimen es la existencia de innumerables plugins, a cual más útil. Y es verdad. Pero también es complicado adaptarse a cada uno de ellos. Cada programador tiene sus manías, sus ideas propias, su forma de hacer las cosas diferente. El uso de plugins tomados cada uno de un sitio, creados por programadores diferentes, da una absoluta falta de homogeneidad en el código.

    Si uno se acostumbra a copiar trozos de código de aquí y de allí, es un script kiddie, un niñato que no sabe programar, sólo mal reutilizar.

    Pero ante la ingente cantidad de herramientas tecnológicas, cada una con sus peculiaridades, se debe elegir entre eso o luchar vanamente por tratar de conocer un lenguaje para que pocos días después surja uno nuevo y también imprescindible. Por eso creo que es justificable el copypasteo de código ajeno, aunque a veces obtengamos resultados poco coherentes. Pero operativos.

    Siempre luchando por entender las peculiaridades de cada uno de los plugins, a veces uno se frustra al ver que no hay forma de hacer funcionar uno en particular. Esto no se suele comentar mucho, porque se mira la página del desarrollador, con la demo operativa, se da plamas, se guarda el link y luego cae en el más oscuro de los olvidos, sin pensar la utilidad de aquello.

    Por eso si vas a desarrollar un plugin para Jquery, te recomendaría en que emplearas el máximo tiempo posible en tener una demo que funcione, con diseño excelente. Que luego el plugin sea operativo o no, es lo de menos porque no se va a usar tanto como parece.

    En fin, que paso a detallar los plugins que hemos usado en Sortea2.com, y cuales no y por qué. No trata de ser una lista de «mejores plugins», sino simplemente de plugins que han funcionado.

    1. Calendario.

    Hemos empleado el plugin datePicker.
    Su funcionamiento no es muy complejo de configurar y el resultado es sencillo, admitiendo días y fechas en castellano.
    Lo tenemos en la ventana de sorteos programados, para ver la fecha en que se programa un sorteo.

    Por contra, aunque existen varios plugins para seleccionar la hora que nos podían haber servido en esa misma página, tras probar con varios siempre obtuvimos resultados poco satisfactorios. No dudo que el plugin funcione, pero para nuestro caso no servía. Y no pedíamos nada especial, simplemente un selector de fechas.

    Tanto este TimePicker, com este otro timepicker llegaron a funcionar, pero la hora no había forma de ajustarla al control indicado, siempre aparecía en la parte de abajo de la página. También existe un tercer plugin para seleccionar horas, pero ya es suficiente por el momento.

    Seguramente la causa no era otra que algún tag de html mal cerrado por nuestra parte, o una mala configuración de las propiedades. El caso es que tras mucho tiempo perdido, decidimos descartarlo definitivamente.

    Preparar un selector de horas y minutos es trivial, ni siquiera hace falta javascript, por lo que al final tomamos ese camino, con el resultado que podéis ver en la página de sorteos avanzados.

    Quizás falte coherencia en el diseño entre la selección de fecha y hora. Es algo que podemos mejorar con el tiempo.

    2. Cookie.

    El que hayamos usado un plugin para manejar las cookies lo veo más como un error y un síntoma de la paranoia que hay en torno al uso de los plugins. Hasta para la tarea más sencilla se buscan utilidades hechas por otros. Creo que si hubiéramos usado javascript puro y duro, habríamos necesitado menos código que con este plugin. Pero al menos permite el uso sencillo de cookies.

    En la aplicación tenemos dos cookies, una para controlar el idioma con el que se accede a la página y otra para gestionar las identidades de los usuarios.

    El plugin al que me refiero es este.

    3. Subida de ficheros mediante Ajax.

    Una de las peores ideas que tuvimos al desarrollar la página fue permitir el subir un listado de nombres cargándolo desde un fichero. Es una de estas funcionalidades que consumen mucho tiempo de desarrollo y que luego nadie usa. O peor aún, nadie usa para bien porque son una puerta abierta a las vulnerabilidades.

    Al final la hicimos. También en la ventana de sorteos avanzados, se puede cargar una lista de nombres de un fichero, idealmente un .txt en que cada nombre ocupa una línea.

    De nuevo aquí tiramos de un plugin que permite hacer una subida de fichero en forma totalmente asíncrona, sin tener que recargar la página y sin causar problemas.

    Este es el plugin para subir ficheros con Jquery. Causó numerosos problemas conseguir adaptarlo al funcionamiento de la página, en gran parte porque fue una de las primeras tareas desempeñadas, cuando aún estábamos iniciándonos con el Jquery.

    La idea inicial y algo que llegamos a hacer era mostrar la lista de nombres en un espacio dentro de la ventana, para que el usuario pueda ver quiénes participarán en el sorteo. Pero con el tiempo se nos fue acabando el sitio en la ventana y ya era todo muy complicado. Costó quitar una funcionalidad que ya estaba hecha, pero era necesaria una mayor simplicidad.

    4. Livequery.

    Livequery es posiblemente el plugin más útil de todos los que hemos empleado.

    Nuestro problema es que cuando creábamos controles dinámicamente (como las listas de nombres y la de premios, que se amplian conforme el usuario va añadiendo más) era complicado hacer que estos controles heredaran los eventos de los controles iniciales en la página.

    La tarea de añadir un listener a los eventos para nuevos controles era un motivo de quebraderos de cabeza. Y sin embargo con usar livequery esto se solucionó automáticamente.

    Además fue el plugin más sencillo de implementar, pues es casi trivial. ¡Estamos enamorados de Livequery!

    5. Dynacloud.

    También tenemos una nube de etiquetas, como toda aplicación que quiera parecer 2.0. Y para ello lo primero era buscar el plugin correspondiente. En este caso, Dynacloud, para hacer una nube de tags.

    Pues bien, no conseguimos hacerlo funcionar en la forma en que nos hubiera gustado. De nuevo mil historias, y cuando lográbamos que apareciera algo, estaba fuera de formato o al final de la página. Hicimos la funcionalidad desde cero, no es nada difícil.

    6. Sugerir tag.

    Finalmente, un plugin para sugerir un tag cuando estás escribiendo un nuevo sorteo. Como se hace en delicious, cuando introduces las primeras letras realiza una consulta y obtiene tags similares ya empleados para crear mayor uniformidad en la información.

    No sin algo de sufrimiento, también se pudo poner en marcha con un resultado que consideramos muy bueno.

    Como se hacen consultas continuas al servidor, para cada uno de los caracteres, en orden a aliviar la carga sobre la base de datos, optamos por cargar todos los tags en un fichero. De esta forma, no se realiza ninguna consulta a base de datos, simplemente se abre el fichero, se vuelca directamente sobre un array y se buscan las coincidencias.

    Este fichero de tags se va actualizando cada cierto tiempo mediante una tarea y santas pascuas. Nos libramos de tener que estar machacando la base de datos realizando consultas poco eficientes (el «like» en SQL no es lo más rápido y directo que digamos).

    Como resumen, espero que esta entrada le sirva a alguien de ayuda para ver cómo los plugins te solucionan problemas y ahorran tiempo, pero a veces pierdes mucho tiempo sin poder hacerlos funcionar y otras es más eficaz codificar uno mismo la tarea que necesita.
    También puedes ver plugins que a lo mejor no son muy espectaculares, pero son operativos y necesarios para el funcionamiento de una página.