Archivo

Archivo para la categoría ‘HTML’

Curioso e interesante V: Windows phone VS SD, Cubo en 3D con HTML5+CSS3,Curiosidades de la sangre, número PI y frigoríficos linuxeros y más

Sábado, 27 de Noviembre de 2010 Gaspar Fernández 2 comentarios

Cuando Facebook hace de las suyas [ BUG CSS ]

Sábado, 17 de Abril de 2010 Gaspar Fernández Sin comentarios

Durante este año y varias veces ha habido un pequeño bug CSS que hace que los que mantenemos aplicaciones para Facebook (y no es un trabajo a tiempo completo) nos tiremos de los pelos.

Y es que al cargar nuestra aplicación, los estilos css no funcionan, no cargan, y si cargamos el archivo de Facebook del tipo:

http://external.ak.fbcdn.net/fbml_static_get.php?src=http%3A%2F%2Fmiurl.com%2Faplicacion%2Fcss%2Ffilo.css%3F_fb_q%3D1&appid=107083291268&pv=1&sig=5ee8229e4afbee29836224de876dfa&filetype=css

nos devolverá un precioso mensaje que dice:

Parámetro no válido: Error desconocido

Lo mejor es que el mensaje está traducido al español, por lo que al principio podemos sospechar que falla nuestra aplicación y luego cuando buscamos el error lo tenemos más difícil, aunque podemos buscar lo siguiente (aparece también en inglés, según nuestra localizacion):

Invalid parameter: Unknown error

El bug aún está abierto (a día 17 de Abril de 2010): podéis consultar el estado actualizado aquí.

Pero mientras investigaba el bug, encontré un pequeño fragmento de código interesante (y podemos utilizarlo como solución temporal al problema):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function minify( $css ) {
        $css = preg_replace( '#\s+#', ' ', $css );
        $css = preg_replace( '#/\*.*?\*/#s', '', $css );
        $css = str_replace( '; ', ';', $css );
        $css = str_replace( ': ', ':', $css );
        $css = str_replace( ' {', '{', $css );
        $css = str_replace( '{ ', '{', $css );
        $css = str_replace( ', ', ',', $css );
        $css = str_replace( '} ', '}', $css );
        $css = str_replace( ';}', '}', $css );

        return trim( $css );
}

function includeStyleCSS($filename)
{
        // due to: http://bugs.developers.facebook.com/show_bug.cgi?id=9053
        // We either must print the stylesheet inline
        // or include it with a link tag that does not include rel="stylesheet".
        // Fixed 3/6/2010
        // Broken 4/13/2010:http://bugs.developers.facebook.com/show_bug.cgi?id=9601

        // use this block when linked CSS is broken
        echo "<style type=\"text/css\">";
        $content = @file_get_contents($filename);
        echo minify( $content );
        echo "</style>";

        // use this block when linked CSS is working
        //      echo "<link rel=\"stylesheet\" href=\"http://MYSERVER.COM/$filename\" type=\"text/css\" />\n";
}

He dejado el fragmento de código original, pero podemos verlo atentamente y analizar lo que hace:

  • Dentro de minify(), el primer regexp_replace elimina cuando hay más de un espacio seguido; el segundo, elimina los comentarios. Los str_replace que le siguen, sirven para eliminar espacios sobrantes cerca de caracteres de inicio y fin, y separación.
  • includeStyleCss() introduce dentro de nuestro archivo resultante el CSS del archivo (más o menos reducido por minify()).

Hay que destacar que es una medida provisional, pero es interesante incluir este código en nuestras aplicaciones porque Facebook es reincidente en este fallo y no descartamos que vuelva a ocurrir.

Pero bueno, como yo no me puedo quedar quieto, vamos a intentar mejorar este código (propuesto en la discusión del bug por Ed Holzwarth, aunque he podido encontrar algún fragmento de minify por la red.

La modificación de este código viene de un poquito de investigación por otras webs:

1
2
3
4
5
6
7
8
9
10
11
12
13
function minify($css)
{
  // Quitamos comentarios
  $css = preg_replace('#/\*.*?\*/#s', '', $css);
  // Quitamos espacios en blanco cerca de {}|:;,
  $css = preg_replace('/\s*([{}|:;,])\s+/', '$1', $css);
  // Quitamos espacio en blanco al inicio
  $css = preg_replace('/\s\s+(.*)/', '$1', $css);
  // Quitamos ; innecesarios
  $css = str_replace(';}', '}', $css);

  return $css;
}

Por cierto, sería interesante aplicar este minificador al script de cache y compresión de ficheros CSS. que publiqué hace un tiempo.

Andanzas en Facebook: Diálogos

Miércoles, 10 de Febrero de 2010 Gaspar Fernández Sin comentarios

Una de las posibilidades que nos brinda la plataforma Facebook para crear aplicaciones es la de tener diálogos con el Look&Feel de la propia red social. Y todo esto sin crujirnos la cabeza para hacerlos. Podemos hacer diálogos simples (con un botón) o de decisión (con dos botones), y además pueden ser pop-ups:

Diálogo Pop-upo contextuales:

Diálogo contextual de FacebookPara ello sólo bastan algunas líneas de FBJS:

1
2
3
4
5
6
7
var usuario_pulsa_ok = function() {
 // Ejecutaremos este código cuando el usuario acepte el diálogo
         };
         
         var dialog = new Dialog(Dialog.DIALOG_POP);
         dialog.onconfirm = usuario_pulsa_ok;
         dialog.showMessage('Test de diálogo', 'Sólo tienes una salida ! Pulsar Ok', 'Ok');

Con este código vemos un diálogo simple con un texto y un mensaje de Ok, si quisiéramos hacer este diálogo contextual deberíamos cambiar DIALOG_POP por DIALOG_CONTEXTUAL. Y si quisiéramos que el diálogo se cerrara automáticamente pasados unos segundos:

1
setTimeout(function(){ dialog.hide(); }, 2000); // Cerrar tras 2 segundos

Un diálogo de dos botones sería también así de fácil (basta con cambiar de método a la hora de mostrarlo:showMessage por showChoice. Quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
var cerrar = function()
    {
       // Se ejecutará esto cuando el usuario cancele el diálogo (responda no a la pregunta, o lo cierre)
    }
    var aceptar = funcion ()
    {
       // Se ejecutará esto cuando el usuario acepte la pregunta.
    }
    var dialog = new Dialog(Dialog.DIALOG_POP);
    dialog.oncancel = cerrar;
    dialog.onconfirm = aceptar;
   
    dialog.showChoice('¿Esta seguro?', '¿De verdad que no te gusta la nueva versión de Facebook?', 'Sí, prefiero la anterior', 'No, renovarse o morir');

Ahora sólo queda una cuestión pendiente, estos diálogos aún tienen más posibilidades, aunque están llenas de bugs, dentro de los diálogos se acepta texto, imágenes, divs, tablas y lo que queramos, aunque hay que introducirlo todo de una forma especial y no siempre va a funcionar. Sólo necesitamos crear una fb-string:

1
<fb:js-string var="loquequierodentrodeldialogo"><div><img src="imagen.jpg" />Esto es lo que podemos hacer con el diálogo</div></fb:js-string>

Y podemos hacer esto más sencillo con una función en PHP que introduzca los contenidos dentro del tag:

1
2
3
4
function facebook_fbstr($var, $string)
{
  echo '<fb:js-string var="'.$var.'">'."\n".$string."\n".'</fb:js-string>'."\n";
}

Así cuando llamemos al diálogo, sólo tendremos que poner:

1
dialog.showMessage(loquequierodentrodeldialogo, 'Pulsa Ok', 'Ok');

Aunque esta última característica es muy bonita, puede ser que en ocasiones necesitemos para que funcione correctamente eliminar las cookies del navegador, o incluso cerrar y reabrir sesión, y ya sabemos que a un usuario normal no le podemos decir eso, ya que se cabrearía y no usaría nuestra aplicación (a no ser que fuera vital para su existencia); tampoco le podemos decir que la culpa la tiene Facebook ya que aunque los usuario vean todos los días fallar a Facebook, cuando pasa en tu aplicación, la culpa la tienes tú… por lo tanto, me reservo para una futura entrega una solución un poco más original para hacer que siempre funcionen los diálogos más complicados.

Hacer que Facebook coja una buena imagen de nuestra web cuando nos enlacen

Miércoles, 10 de Febrero de 2010 Gaspar Fernández Sin comentarios

fb_publishFacebook es la red de moda, y si queremos promocionar nuestra web o nuestros servicios, éste es un buen punto de partida. Por otra parte, puede ser que usuarios de Facebook enlacen a nuestra web o nuestro blog y para tener nuevos visitantes queremos hacer nuestro link atractivo: poner una imagen y una descripción es muy interesante. (En la imagen, tenemos el contraejemplo (un link poco atractivo para nuevos visitantes).

Pero todo esto se puede arreglar con dos líneas en el header de nuestra web:

1
2
<link rel="image_src" type="image/jpeg" href="http://midominio.com/imagen.jpg" />
<meta name="description" content="Descripción de mi web" />

Aunque el metadato description es muy utilizado; decido incluirlo aquí ya que Facebook es de donde extrae información. La línea anterior sirve para especificar una imagen; así nuestro enlace quedará de la siguiente manera:

fb_publish2

Para buscar imágenes más originales podemos hacer una captura de pantalla de nuestra web, o una fracción de nuestro logotipo, eso sí, la imagen tampoco debe pesar demasiado y la relación de aspecto debe ser 1:1, es decir, una imagen cuadrada.

Visita otras webs de la red