{"id":113,"date":"2008-12-13T13:22:08","date_gmt":"2008-12-13T12:22:08","guid":{"rendered":"http:\/\/www.sortea2.com\/blog\/?p=113"},"modified":"2008-12-13T18:30:19","modified_gmt":"2008-12-13T17:30:19","slug":"jquery-plugin-utiles-y-otros-no-tanto","status":"publish","type":"post","link":"https:\/\/www.sortea2.com\/blog\/2008\/12\/jquery-plugin-utiles-y-otros-no-tanto\/","title":{"rendered":"Jquery. Plugin \u00fatiles y otros no tanto."},"content":{"rendered":"<p>La p\u00e1gina de Sortea2 abunda en el uso de Javascript mediante librer\u00edas de Jquery. Quiz\u00e1s a veces los efectos sean hasta molestos (lo sentimos) pero no se puede decir que la p\u00e1gina es est\u00e1tica.<\/p>\n<p>Cuando se utiliza Jquery una de las mayores ventajas que se esgrimen es la existencia de innumerables plugins, a cual m\u00e1s \u00fatil. Y es verdad. Pero tambi\u00e9n es complicado adaptarse a cada uno de ellos. Cada programador tiene sus man\u00edas, 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\u00f3digo.<\/p>\n<p>Si uno se acostumbra a copiar trozos de c\u00f3digo de aqu\u00ed y de all\u00ed, es un <a href=\"http:\/\/en.wikipedia.org\/wiki\/Script_kiddie\"><em>script kiddie<\/em><\/a>, un ni\u00f1ato que no sabe programar, s\u00f3lo mal reutilizar.<\/p>\n<p>Pero ante la ingente cantidad de herramientas tecnol\u00f3gicas, cada una con sus peculiaridades, se debe elegir entre eso o luchar vanamente por tratar de conocer un lenguaje para que pocos d\u00edas despu\u00e9s surja uno nuevo y tambi\u00e9n imprescindible. Por eso creo que es justificable el <em>copypasteo <\/em>de c\u00f3digo ajeno, aunque a veces obtengamos resultados poco coherentes. Pero operativos.<\/p>\n<p>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\u00e1gina del desarrollador, con la demo operativa, se da plamas, se guarda el link y luego cae en el m\u00e1s oscuro de los olvidos, sin pensar la utilidad de aquello.<\/p>\n<p>Por eso si vas a desarrollar un plugin para Jquery, te recomendar\u00eda en que emplearas el m\u00e1ximo tiempo posible en tener una demo que funcione, con dise\u00f1o excelente. Que luego el plugin sea operativo o no, es lo de menos porque no se va a usar tanto como parece.<\/p>\n<p>En fin, que paso a detallar los plugins que hemos usado en <a href=\"http:\/\/www.sortea2.com\/\">Sortea2.com<\/a>, y cuales no y por qu\u00e9. No trata de ser una lista de \u00abmejores plugins\u00bb, sino simplemente de plugins que han funcionado.<\/p>\n<p><span class=\"header\">1. Calendario.<\/span><\/p>\n<p>Hemos empleado <a href=\"http:\/\/www.kelvinluck.com\/assets\/jquery\/datePicker\/v2\/demo\/\">el plugin datePicker<\/a>.<br \/>\nSu funcionamiento no es muy complejo de configurar y el resultado es sencillo, admitiendo d\u00edas y fechas en castellano.<br \/>\nLo tenemos en la ventana de sorteos programados, para ver la fecha en que se programa un sorteo.<\/p>\n<p><a href=\"http:\/\/www.sortea2.com\/sorteos-avanzados\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-114\" title=\"jquery-datepicker\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-datepicker.png\" alt=\"\" width=\"486\" height=\"272\" \/><\/a><\/p>\n<p>Por contra, aunque existen varios plugins para seleccionar la hora que nos pod\u00edan haber servido en esa misma p\u00e1gina, tras probar con varios siempre obtuvimos resultados poco satisfactorios. No dudo que el plugin funcione, pero para nuestro caso no serv\u00eda. Y no ped\u00edamos nada especial, simplemente un selector de fechas.<\/p>\n<p>Tanto <a href=\"http:\/\/labs.perifer.se\/timedatepicker\/\">este TimePicker<\/a>, com este <a href=\"http:\/\/www.oakcitygraphics.com\/jquery\/clockpick\/trunk\/ClockPick.cfm\">otro timepicker<\/a> llegaron a funcionar, pero la hora no hab\u00eda forma de ajustarla al control indicado, siempre aparec\u00eda en la parte de abajo de la p\u00e1gina. Tambi\u00e9n existe un <a href=\"http:\/\/haineault.com\/media\/jquery\/ui-timepickr\/page\/\">tercer plugin<\/a> para seleccionar horas, pero ya es suficiente por el momento.<\/p>\n<p>Seguramente la causa no era otra que alg\u00fan tag de html mal cerrado por nuestra parte, o una mala configuraci\u00f3n de las propiedades. El caso es que tras mucho tiempo perdido, decidimos descartarlo definitivamente.<\/p>\n<p>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\u00e9is ver en la p\u00e1gina de sorteos avanzados.<\/p>\n<p><a href=\"http:\/\/www.sortea2.com\/sorteos-avanzados\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-timepicker.png\" alt=\"\" title=\"jquery-timepicker\" width=\"360\" height=\"364\" class=\"aligncenter size-full wp-image-117\" \/><\/a><\/p>\n<p>Quiz\u00e1s falte coherencia en el dise\u00f1o entre la selecci\u00f3n de fecha y hora. Es algo que podemos mejorar con el tiempo.<\/p>\n<p><span class=\"header\">2. Cookie.<\/span><\/p>\n<p>El que hayamos usado un <a href=\"http:\/\/www.stilbuero.de\/2006\/09\/17\/cookie-plugin-for-jquery\/\">plugin para manejar las cookies<\/a> lo veo m\u00e1s como un error y un s\u00edntoma de la paranoia que hay en torno al uso de los plugins. Hasta para la tarea m\u00e1s sencilla se buscan utilidades hechas por otros. Creo que si hubi\u00e9ramos usado javascript puro y duro, habr\u00edamos necesitado menos c\u00f3digo que con este plugin. Pero al menos permite el uso sencillo de cookies.<\/p>\n<p>En la aplicaci\u00f3n tenemos dos cookies, una para <a href=\"http:\/\/www.sortea2.com\/blog\/?p=66\">controlar el idioma con el que se accede a la p\u00e1gina<\/a> y otra para gestionar las identidades de los usuarios.<\/p>\n<p>El plugin al que me refiero <a href=\"http:\/\/www.stilbuero.de\/2006\/09\/17\/cookie-plugin-for-jquery\/\">es este<\/a>.<\/p>\n<p><span class=\"header\">3. Subida de ficheros mediante Ajax.<\/span><\/p>\n<p>Una de las peores ideas que tuvimos al desarrollar la p\u00e1gina fue permitir el subir un listado de nombres carg\u00e1ndolo desde un fichero. Es una de estas funcionalidades que consumen mucho tiempo de desarrollo y que luego nadie usa. O peor a\u00fan, nadie usa para bien porque son una puerta abierta a las vulnerabilidades.<\/p>\n<p>Al final la hicimos. Tambi\u00e9n 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\u00ednea.<\/p>\n<p><a href=\"http:\/\/www.sortea2.com\/sorteos-avanzados\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-fileupload.png\" alt=\"\" title=\"jquery-fileupload\" width=\"312\" height=\"221\" class=\"alignnone size-full wp-image-120\" \/><\/a><\/p>\n<p>De nuevo aqu\u00ed tiramos de un plugin que permite hacer una subida de fichero en forma totalmente as\u00edncrona, sin tener que recargar la p\u00e1gina y sin causar problemas.<\/p>\n<p>Este es el <a href=\"http:\/\/www.phpletter.com\/Our-Projects\/AjaxFileUpload\/\">plugin para subir ficheros<\/a> con Jquery. Caus\u00f3 numerosos problemas conseguir adaptarlo al funcionamiento de la p\u00e1gina, en gran parte porque fue una de las primeras tareas desempe\u00f1adas, cuando a\u00fan est\u00e1bamos inici\u00e1ndonos con el Jquery.<\/p>\n<p>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\u00e9nes participar\u00e1n en el sorteo. Pero con el tiempo se nos fue acabando el sitio en la ventana y ya era todo muy complicado. Cost\u00f3 quitar una funcionalidad que ya estaba hecha, pero era necesaria una mayor simplicidad.<\/p>\n<p><span class=\"header\">4. Livequery.<\/span><\/p>\n<p><a href=\"http:\/\/brandonaaron.net\/docs\/livequery\/\">Livequery <\/a>es posiblemente <strong>el plugin m\u00e1s \u00fatil<\/strong> de todos los que hemos empleado.<\/p>\n<p>Nuestro problema es que cuando cre\u00e1bamos controles din\u00e1micamente (como las listas de nombres y la de premios, que se amplian conforme el usuario va a\u00f1adiendo m\u00e1s) era complicado hacer que estos controles heredaran los eventos de los controles iniciales en la p\u00e1gina.<\/p>\n<p>La tarea de a\u00f1adir un <em>listener <\/em>a los eventos para nuevos controles era un motivo de quebraderos de cabeza. Y sin embargo con usar livequery esto se solucion\u00f3 autom\u00e1ticamente.<\/p>\n<p>Adem\u00e1s fue el plugin m\u00e1s sencillo de implementar, pues es casi trivial. \u00a1Estamos enamorados de Livequery!<\/p>\n<p><span class=\"header\">5. Dynacloud.<\/span><\/p>\n<p>Tambi\u00e9n tenemos una nube de etiquetas, como toda aplicaci\u00f3n que quiera parecer 2.0. Y para ello lo primero era buscar el plugin correspondiente. En este caso, <a href=\"http:\/\/johannburkard.de\/blog\/programming\/javascript\/dynacloud-a-dynamic-javascript-tag-keyword-cloud-with-jquery.html\">Dynacloud<\/a>, para hacer una nube de tags.<\/p>\n<p>Pues bien, no conseguimos hacerlo funcionar en la forma en que nos hubiera gustado. De nuevo mil historias, y cuando logr\u00e1bamos que apareciera algo, estaba fuera de formato o al final de la p\u00e1gina. Hicimos la funcionalidad desde cero, no es nada dif\u00edcil.<\/p>\n<p><a href=\"http:\/\/www.sortea2.com\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-tagcloud.png\" alt=\"\" title=\"jquery-tagcloud\" width=\"292\" height=\"433\" class=\"aligncenter size-full wp-image-121\" \/><\/a><\/p>\n<p><span class=\"header\">6. Sugerir tag.<\/span><\/p>\n<p>Finalmente, un <a href=\"http:\/\/remysharp.com\/2007\/12\/28\/jquery-tag-suggestion\/\">plugin para sugerir un tag<\/a> cuando est\u00e1s escribiendo un nuevo sorteo. Como se hace en <a href=\"http:\/\/delicious.com\">delicious<\/a>, cuando introduces las primeras letras realiza una consulta y obtiene tags similares ya empleados para crear mayor uniformidad en la informaci\u00f3n.<\/p>\n<p>No sin algo de sufrimiento, tambi\u00e9n se pudo poner en marcha con un resultado que consideramos muy bueno.<\/p>\n<p><a href=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-tag-suggest.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/jquery-tag-suggest-300x98.png\" alt=\"\" title=\"jquery-tag-suggest\" width=\"300\" height=\"98\" class=\"alignnone size-medium wp-image-122\" \/><\/a><\/p>\n<p>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.<\/p>\n<p>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 \u00ablike\u00bb en SQL no es lo m\u00e1s r\u00e1pido y directo que digamos).<\/p>\n<p>Como resumen, espero que esta entrada le sirva a alguien de ayuda para ver c\u00f3mo los plugins te solucionan problemas y ahorran tiempo, pero a veces pierdes mucho tiempo sin poder hacerlos funcionar y otras es m\u00e1s eficaz codificar uno mismo la tarea que necesita.<br \/>\nTambi\u00e9n puedes ver plugins que a lo mejor no son muy espectaculares, pero son operativos y necesarios para el funcionamiento de una p\u00e1gina.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La p\u00e1gina de Sortea2 abunda en el uso de Javascript mediante librer\u00edas de Jquery. Quiz\u00e1s a veces los efectos sean hasta molestos (lo sentimos) pero no se puede decir que la p\u00e1gina es est\u00e1tica. Cuando se utiliza Jquery una de las mayores ventajas que se esgrimen es la existencia de innumerables plugins, a cual m\u00e1s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,5],"tags":[],"class_list":["post-113","post","type-post","status-publish","format-standard","hentry","category-jquery","category-tutoriales"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/comments?post=113"}],"version-history":[{"count":7,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":116,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/113\/revisions\/116"}],"wp:attachment":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/media?parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/categories?post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/tags?post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}