Plugin Coppermine "Graphic_Keywords_Editor"

Me gusta mucho la galería de fotos Coppermine, considero que es una gran herramienta para poder gestionar todas las fotos que hago, tanto con la cámara como con el móvil. Lo genial de esta aplicación es que las fotos las tengo siempre disponibles en mi servidor, y no sólo eso, sino que familia y amigos también pueden acceder a las fotos, comentarlas y bajárselas si las desean usar; pero todo ello desde una plataforma que este controlada y donde la autoría y propiedad de las fotos siga siendo mía, al contrario que con Facebook que al subir las fotos, estas automáticamente les pasan a pertenecer a ellos. Quizás podría ser interesante utilizar herramientas tipo Flickr, DevianArt o Picasa, pero aunque algunas las he probado, me gusta más mi Coppermine ;-).
Con Coppermine, no pretendo evitar que me copien y/o utilicen las fotos sin consentimiento, simplemente me aseguro no estar "regalándoselas" a ninguna empresa. Además, el hecho es que las fotos en su mayoría, las tengo puestas en galerías de libre acceso, es decir que cualquier persona puede acceder y verlas o bajarlas (y por lo tanto usarlas). Eso no es algo que me preocupe, es más me alegraría saber que alguna persona le gustara tanto alguna de mis fotos que quiera utilizarla, si se da el caso estaría muy agradecido de que me dijera donde la ha utilizado para verlo.
Y por estos motivos, cuando veo algo que echo en falta en Coppermine, pienso si podría haberlo programado alguien, o si no, si podría hacerlo yo y colaborar de esa forma al crecimiento de la herramienta.
Este es uno de esos casos, a mi siempre me ha parecido genial la idea de etiquetar las fotos, porque facilita la tarea de encontrar luego fotos de personas, lugares o las fotos de un viaje concreto. Pero la forma de etiquetar en Coppermine es horrible, ya que hay que ir etiquetando las fotos de una en una, es tedioso, arduo y lo peor es que a menudo se comenten errores (unas veces utilizas una etiqueta con espacios para una persona, y otras veces sin espacios) y luego tienes varias fotos de una misma persona con varias etiquetas diferentes, por lo tanto pierdes la potencia de las etiquetas para localizar las fotos de esa persona.

Por estos motivos he implementado un pequeño plugin que me facilita la tarea de etiquetar mis fotos en Coppermine. Etiquetar las fotos en Coppermine ahora es más fácil y eficiente. Las características que cumple el plugin son las siguientes:

  • Se pueden seleccionar varias fotos simultáneamente para etiquetarlas.
  • Se pueden aplicar varias etiquetas simultáneamente a una o varias fotos.
  • La selección de fotos a etiquetar se realiza con el ratón y de manera similar a como se trabaja en un explorador de archivos en el PC; es decir se pueden seleccionar fotos pinchando y arrastrando, se pueden añadir fotos a la selección usando la tecla "control" (Ctrl), se puede de-seleccionar fotos haciendo clic nuevamente en ellas, etc. En cualquier caso aunque el funcionamiento se ha intentado que sea lo más similar posible al del explorador de archivos, hay algunas funcionalidades que no son iguales por limitaciones de la librería utilizada (JQuery v1.9)
  • Ver las etiquetas de cada foto al pasar el ratón por encima de la misma.
  • Ofrecer una lista de las etiquetas utilizadas anteriormente al escribir la etiqueta (el típico autocompletar).
  • Permitir operaciones de añadir etiquetas a una foto, eliminar etiquetas a la foto y reemplazar las etiquetas de una foto (esta última operación sustituye todas las etiquetas de golpe, quizás para una próxima versión mejore esta operación).
  • Cada usuario sólo puede editar las etiquetas de sus fotos; con excepción de administrador que puede etiquetar lo que quiera.
  • Permitir localizar todas las fotos SIN etiquetas; esto lo hace buscando todas las fotos con el campo de etiquetas vacio, y acto seguido les pone una etiqueta especial "_noKeywords_" de manera que se puedan localizar mediante la búsqueda normal de Coppermine.
  • Multilenguaje (actualmente español e inglés).

A continuación dejo un vídeo donde se ve el funcionamiento y la idea:

Limitaciones actuales:

  • Sólo funciona con el tema por defecto ("curve") de Coppermine; esto de debe a problemas con el hook para añadir botones.
  • En algunas tablet/móviles no funciona bien el autocompletar.

Comentarios útiles para desarrolladores:
La idea inicial del plugin era que simplemente permitiera seleccionar varias fotos con el ratón pinchando y arrastrando, esto fue más o menos sencillo de implementar con la funcionalidad "selectable" de JQuery UI; el problema vino al intentar utilizar la librería JQuery en Coppermine porque ya tiene una versión de la misma, pero es antigua (1.3 creo) y para usar el "selectable" necesitaba la 1.9 (la que había usado en las pruebas), tras investigar me encontré que una posible solución era cambiar el nombre de la función JQuery, el conocido "dollar" $(' ... '); para ello utilicé la función "noConflict":

Mediante "noConflict", podemos utilizar varias versiones de JQuery en una misma aplicación sin que se estorben unas a otras, básicamente lo que hace es que a cada versión de JQuery a utilizar le asigna un nombre diferente, en mi caso utilicé "jQuery19" como puedes ver. Esa línea la tienes que poner al final de la declaración de la librería de JQuery; y cada vez que en tu código quieras utilizar esa versión de JQuery simplemente llamas a JQuery con el nombre en cuestión en lugar del dollar, como puedes ver en el siguiente ejemplo:

Una vez que logré hacer funcionar la selección de imágenes en Coppermine sin problemas de conflictos entre versiones de JQuery, tenía otro problema, que fue el CSS necesario para que las fotos seleccionadas se vieran destacadas. El problema era que las etiquetas CSS que yo daba a las imágenes destacadas se veían sobrescritas por el CSS propio del Coppermine, por lo que no tenían efecto. Esta tontería me costo unas pocas horas de repaso de teoría del HTML, HTML5 y de las Hojas de Estilo en Cascada (no hay mal que por bien no venga) hasta que recordé que en CSS para conseguir sobrescribir una propiedad que está declarada después de la tuya, lo que puedes hacer es ser más específico en el selector. Resumiendo, que tenía que utilizar "td.ui-selected" en vez de ".ui-selected" en el selector para darle las propiedades a la foto seleccionada (si te quedan dudas, ya sabes, a recordar la teoría del CSS ;-)). Y por fin fui capaz de seleccionar fotos...

Selección de fotos con el mi plugin para Coppermine

Selección de fotos con mi plugin para Coppermine

Después implementé las funciones que añadían o eliminaban etiquetas en el servidor. No fue complicado pues hay bastante documentación para conocer el funcionamiento de los plugins en Coppermine, su BD, tablas y la forma de acceder y tocar en la BD.

Llegado a este punto tenía una primera versión funcional, pero al utilizarla me di cuenta que carecía de cosas importantes para que me fuera realmente útil, entre ellas:

  • La posibilidad de ver las etiquetas que tenía cada foto que estaba etiquetando
  • Ver las etiquetas previas que había utilizado con anterioridad en otras fotos (autocompletar).

La primera cuestión se solucionó más o menos rápido, pero para la segunda, después de investigar, encontré la librería "select2" basada en JQuery, pero no se puede decir que tenga mucha documentación (a día de hoy poco más de 3 ejemplos), y me costo lo suyo hacer que funcionara (mucho buscar en Internet y prueba y error). Cuando conseguí que funcionaran las pruebas, resultó que al añadir el código al plugin del Coppermine no funcionaba nada, tras más quebraderos de cabeza, resultó que me estaba pillando (lógicamente) la JQuery del Coppermine en vez de la mía (la 1.9); tenía que modificar la librería para que usara la versión nueva, para ello sustituí todas las llamadas a la función JQuery en la librería Select2 por la llamada a la mía ("jQuery19"); esto implicaba sustituir todos los "dollar", todas las definiciones de nuevas funciones y todas las llamadas (así dicho parece fácil, que lo es, pero la dificultad estuvo en darse cuenta del fallo y después en encontrar todas esas llamadas). Cuando todo funcionó ya tenía el autocompletar de las etiquetas, y al utilizarlo, ya sí empezaba a resultarme un plugin útil.

Muestra del autocompletar del plugin para Coppermine

Muestra del autocompletar del plugin para Coppermine

Con esta versión he organizado bien mis fotos, he realizado pruebas en la tablet y también funciona, pero con el uso, me han surgido nuevas necesidades. Concretamente la de localizar todas las fotos SIN etiquetas. Esto ha sido fácil de implementar, apenas me ha llevado una tarde. De esta forma ya puedo localizar rápidamente todas las fotos que aún no les he dado una etiqueta.

También comentar que NO he podido hacer que el botón que activa/desactiva la edición de las etiquetas se ponga mediante el uso del hook que Coopermine tiene para ello, el "sys_menu" ni con el "sub_menu". Desconozco porqué, pero cuando he tratado de buscar solución, toda la referencia que encuentro es para la creación de temas. En un futuro tengo que tratar de arreglar esto, porque tal y como está montado, el plugin sólo funciona con el Coppermine con el tema por defecto "curve"; si está usando otro tema, el botón de activar/desactivar no sale.

Después de todo esto, comentar que estoy abierto a nuevas ideas que puedan hacer de Coppermine un herramienta más útil aún :-).

Graphic Keywords Editor plugin for Coppermine
Graphic Keywords Editor plugin for Coppermine
graphic_keywords_editor.zip
Version: 1.0
244.9 KiB
40 Downloads
Details...

Cambiar la codificación a UTF-8

Hoy me he encontrado con el problema siguiente, un cliente al que le tengo montada la tienda con OSCommerce me dice que los productos le salen con caracteres raros (típico rombito) en la vista de tienda, pero en la parte de administración todo sale OK.

Tras investigar un poco, por algún motivo, el navegador no coge bien el charset de la página, que OSCommerce monta para la tienda, y donde el charset está correctamente puesto a ISO-8859-1, y curiosamente, si le pido al navegador que me utilice la codificación de UTF-8 si me muestra correctamente los caracteres. ¿Pero qué está pasando aquí?

Hay que tener en cuenta que hay dos problemas, el primero es que OSCommerce me esta usando la codificación ISO, tanto en la interfaz de la administración, como en la propia tienda, podría intentar cambiar sólo uno de ellos (la tienda), pero es posible que me encuentre con otros problemas, de hecho lo he intentado pero entonces se mostraban bien los artículos antiguos, pero volvía a tener el problema con los artículos nuevos que creaba. Entonces he tenido que cambiar la codificación a utilizar para la interfaz de la administración de la tienda en un archivo, y después también la codificación para la interfaz "frontend" de la tienda en otro:

Como la solución pasa por utilizar la codificación UTF-8 (que por cierto es la que debería usarse, no sé porque motivo OSCommerce no la usa por defecto), me dispongo a configurar OSCommerce a UTF-8, pero no sólo hay que decírselo en los archivos mencionados, ¿qué pasa con todas las traducciones de los archivos de OSCommerce que están en ISO-8859-1? Y no son ni uno, ni dos archivos, son unos pocos, total que me he montado este pequeño script en Shell-Script para realizar la tarea:

 

Con dicho script transformo los archivos al UTF-8, pero además, habra que decirle en algún sitio al OSCommerce que el estilo de codificacion de caracteres a indicar en el HTML (el charset del HTML generado) es utf-8.
Los comandos "file" y "iconv" estan por defecto en la mayoría de sistemas Linux. Y para una explicación de los comandos puedes echar un vistazo por aquí.

El mismo comando, pero separando las ordenes en varias, para facilitar la comprensión:

Lo que yo he montado es un simple bucle "for" que para cada uno de los archivos "php" de la carpeta actual, si su codificación de caracteres es ISO-8859-1 la cambia a UTF-8.

Create PDF from an image on PHP

Recently a friend asked me to create a script to make a PDF document from a set of images. The initial idea was get a table of 3x3 images randomly from a bunch. He need to run it into his web server, for this reason I think PHP (language supported) is the best option. He has a lot of cards, for example (the full set is about 25-30 cards):

Image of exampleExample cardExample card

And he want to allow people to download random cards from Internet. This random characteristic is the key he wants to reach. The solution is very simple as you can see below.

Example of final image of random cards

Example of final image of random cards

First, as always, I look for information on the net and I get a couple pages of interest.

Here we can get basics functions to create simple images as rectangles or lines:
http://bulma.net/body.phtml?nIdNoticia=671
As you can see the simplest way is use "gd" library. This library is commonly installed on PHP web servers. I make a couple of test and everything works, so I'll develop the script with it. Another solution will be "ImageMagick" library, in my case I can use both, but if you are interested you must test wich one you can use.

On this other page I find some function to get my image on a PDF file.
http://blog.unijimpe.net/crear-pdf-con-imagenes-en-php
With R&OS library you get "ezImage" function that is your solution. I must dig in by source code to understand all parameters because I can't find good documentation, but after couple tests I get my script work!

This script can be configured with the number of images on columns and rows. You can select the distance between images in pixels too. It's easy, I left some comments along the code.

I hope it will be usefull, here you can get my final script.

The script must be located on a folder next to all cards and the PDF library. I put here a compressed file with all together.

I hope it will be usefull, here you can get my final script.

Cards maker in PHP
Cards maker in PHP
creadorCartas.tar.bz2
525.2 KiB
197 Downloads
Details...

Foto aleatoria en WordPress

Objetivo del proyecto:
Lograr que las imágenes de la cabecera de mi WordPress se tomen aleatoriamente de mi Coppermine.

Hoy he terminado de montar un pequeño script que comencé ayer. La idea era cambiar las imágenes que me muestra WordPress en la cabecera, que si bien son monas, pero me gustan más las que yo hago, concretamente quería que las imágenes se cargarán desde un Coppermine que tengo montado. Para ello he indagado un poco y he encontrado una referencia para hacer algo parecido:

Ese código PHP simplemente hace uso de una función ya implementada en el Coppermine que se llama "get_pic_data(...)", tras buscar información sobre la misma en la documentación del código de la aplicación, (concretamente la función se puede ver aquí) he podido comprender su funcionamiento, parámetros que recibe y como los utiliza (es lo maravilloso de Software Libre).

Yo tome ese código original y lo he adaptado para que me devuelva aleatoriamente una imagen de uno de mis álbumes de mi Coppermine, dicho álbum es expresamente para almacenar estas cabeceras; por último sólo necesito tocar en el WordPress para que muestre la imagen a partir del script en cuestión en lugar de las que el tiene.

El código final después de las modificaciones es el siguiente:

He dejado al final comentado las líneas necesarias para mostrar una o todas las imágenes del álbum seleccionado, quizás sea útil.

Como comentaba en el WordPress hay que tocar un último detalle para que en vez de tomar las fotos que tiene por defecto, llame a mi nuevo script. Esto es muy simple desde la propia interfaz del WordPress editando el archivo "header.php" para cambiar que en lugar de mostrar la imagen devuelta por la función "header_image()" muestre la imagen que devuelve mi Script.

Esto mismo se puede hacer (y más elegante/bonito) desde mi punto de vista, en vez de tocando el header.php, editando el archivo "wp-includes/theme.php" para hacer que la funcion "header_image()" devuelva la ruta que llama a mi Script, el único inconveniente de esta segunda opcion es que hay que tener acceso al archivo "wp-includes/theme.php" (normalmente por FTP).

Por ultimo añadir que yo también he tocado el CSS del WordPress para hacer que el título de la web y demás salga encima del banner, ya que no me gusta que se desaproveche tanto espacio en la pantalla, citando a Juande (un ex-jefe mio del que aprendí muchísimo) "la pantalla es un recurso más, y como tal debe ser gestionado eficientemente".

La solución creada cumple con el objetivo inicialmente planteado. Y de hecho está funcionando ahora mismo.

Posibles mejoras:

  1. Sería interesante modificar mi Script para que corrija el MIME type del archivo devuelto y sea acorde a la imagen que se envía, actualmente el MIME type está fijo a "image/png", y las imagenes almacenadas en el Coppermine no tienen siempre ese formato, aunque yo lo suelo utilizar.
  2. Resultaría interesante hacer una modificación al Coppermine, de manera que no sea necesario subir expresamente los banners ya editados desde el PC, sino que al subir cualquier foto, pregunte si quieres sacar un banner a partir de ella, y en caso afirmativo, te muestre una interfaz en la propia web que te permita recortar la imagen subida y el Coppermine se encargue de crear la imagen/banner y guardarlo en el álbum correspondiente de "banners" (además de la imagen original).