Iniciar sesión

Ver la versión completa : [Ayuda] symfony 2 - Menú dinámico con imágenes



akualung
22/04/2014, 09:56
Buenas. Tengo una dudilla de carácter conceptual (seguro que es una chorrada muy básica) sobre lo siguiente:

Estoy realizando una aplicación web en symfony 2. Dicha aplicación tendrá un menú de categorías que será dinámico, es decir, las categorías disponibles están en una tabla de BD, así que se hace una consulta a la BD y el menú se crea de manera dinámica en un <UL>, etc. Mi duda es que dichas categorías tendrán una imagen asociada, y no tengo claro cual es el procedimiento estandar para eso, si poner el nombre de la imagen como un campo más en la tabla categorias (p. ej. un campo de tipo String que se llamase "filename") y así, mientras creamos el menú, cargar la imagen con un <img src="asset({{ categoria.filename }})"></img> o si eso es una burrada y se hace de otra forma. Se que se puede poner la imagen como un campo de BD de tipo blob directamente en la tabla, pero no creo que fuese una buena idea porque si más adelante se quiere cambiar un icono, es más fácil sencillamente reemplazar un archivo jpg o png que tener que modificar un campo de BD, no?.

En el caso de que la idea buena fuese la de poner un campo con el nombre del archivo, ¿recomendais que el nombre del archivo tenga también la extensión, o es mejor no ponerla? Aparte, obviamente, en ese campo se pondría solo el nombre del archivo, y la ruta a dicho recurso dejamos que la gestione el propio Symfony, no?

Si al final resulta que se suele hacer de otra forma diferente a todo lo que he dicho, soy todo oídos.

Merci.

josepzin
22/04/2014, 13:34
No conozco Simphony pero sí te puedo decir que meter imágenes en las bases de datos creo que no es muy recomendable.

Lo de filename creo es lo correcto o directamente usa el ID de la categoría como identificador de la imagen.

akualung
22/04/2014, 13:48
No conozco Simphony pero sí te puedo decir que meter imágenes en las bases de datos creo que no es muy recomendable.

Lo de filename creo es lo correcto o directamente usa el ID de la categoría como identificador de la imagen.

Es verdad, lo del id es buena idea. Lo del campo filename se me ocurrió porque el nombre en sí de la categoría puede tener espacios, acentos, diéresis, etc, pero creí conveniente un nombre de archivo que no tuviese todo eso, p. ej. una posible categoría "paragüeros y ropa de protección" (sí, categoría algo surrealista, pero es lo primero que se me ha ocurrido que tenga caracteres raros XDDD) tendria como filename "paragueros_y_ropa_de_protección" o incluso se podria abreviar y que fuese "parag_ropa_prot". Algo así como aplicar el concepto de slug pero para nombres de imágenes, no sé si me explico bien.

Estudiaré qué me conviene más, si usar el id o el nombre del archivo. Lo del id, ahora que lo pienso con más calma, me escama un poco por si en algún momento se ha de rehacer la BD e insertan las categorías en otro orden (una vez hecha, la web ya no dependerá de mí), pero no sé si eso es algo muy común.

Gracias, josepzin :)

otto_xd
22/04/2014, 17:52
Usa el md5 trimeado a un numero optimo de caracteres como identificador de la imagen que equivalga a la ruta de lamisma y renombrala cuando la subas.

Las imagenes (y resto de binarios) se sirven como contenido estatico desde fuera de la db, para que se puedan usar cdns, etc.

Estopero
23/04/2014, 02:41
Bueno, yo veo varios problemas, algunos de simple lógica y otros de como hacerlo en symfony2.

Por un lado te diría que como te han dicho guardaría solo el nombre de la imagen en la base de datos, no la imagen completa como contenido binario, siempre me ha parecido una chapuza que te cagas guardar el contenido completo, le metes un peso a la base de datos completamente innecesario, y no hablemos ya si quieres generar varios tamaños de imagen y cachearlas de alguna forma o qué se yo.

Por otro lado solo guardaría el nombre de la imagen, y con extensión, además de pasarle al nombre de la imagen un filtrado rollo "urlize" o "slugify" para quitarle carácteres extraños.

Y por último, ya que has escogido symfony2 para tu proyecto, resulta que alguien ya ha pensado en todo esto y ha creado un bundle llamado VichUploader:

https://github.com/dustin10/VichUploaderBundle
Documentación de uso: https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/usage.md

Este bundle es un imprescindible en casi cualquier proyecto symfony. Sencillamente tienes que crear un campo "file" asignado a VichUploader en tu entidad (En este caso categoría), y ya se encarga el bundle de hacer todo el proceso anterior por tí.

En el fichero de configuración asignas un path para las imágenes de cada entidad, y luego al acceder al campo de la imagen desde la plantilla (Twig) tal que:

En la config:


vich_uploader:
db_driver: orm
mappings:
category_image:
uri_prefix: /images/categories
upload_destination: %kernel.root_dir%/../web/images/categories


En la plantilla (Twig):

<img src="{{ vich_uploader_asset(category, 'image') }}" />

Ya se encarga vich_uploader de generar la ruta por ti. Además puedes seleccionar que estrategia de "naming" para los ficheros escoger, si rollo "md5" como dice otto, o con el propio nombre del fichero "slugificado" o implementar la tuya propia.

Merece la pena gastar un rato en aprender a usar este bundle porque te ahorrará mucho tiempo después :)

Y como extra, si quieres generar y cachear distintos tamaños de las imágenes:

https://github.com/liip/LiipImagineBundle

Ya nos contarás XD

josepzin
23/04/2014, 04:29
Lo del ID es infalible, te evitas historias de limpieza de nombre, de caracteres raros, de archivos duplicados, etc. Nunca habrá otro 345.jpg

Estopero
23/04/2014, 11:11
Lo del ID es infalible, te evitas historias de limpieza de nombre, de caracteres raros, de archivos duplicados, etc. Nunca habrá otro 345.jpg

Si lo programas bien es cierto que te evitas cualquier problema de colisión de nombres, sin embargo a mi me gusta incluir un nombre descriptivo en el nombre del fichero, principalmente pensando un poco en el SEO, también cuenta el nombre de las imágenes de tu web/artículo a la hora de buscar en google.

Una mezcla de nombre slugificado con por ejemplo 3 caracteres de ID puede ser una buena opción :) nombre-del-fichero-345.jpg

akualung
24/04/2014, 00:13
Hola, perdón por tardar en responder, he estado todo el día fuera (Sant Jordi y tal, jejeje).

Merci por todas las respuestas. Tal como pensaba, es mucho mejor dejar la BD para lo que se supone que es, que es guardar datos y no recursos de la aplicación. Es que hace tiempo trabajé en una consultoría donde tenían un framework basado en Struts2 y trabajé en una aplicación donde guardaban unos pdfs con firma electrónica que la susodicha generaba de forma dinámica, como objetos BLOB en la Base de datos (y la verdad es que programar eso fué un cristo, lo hizo el analista que me pusieron como mentor y le costó tela).

Me encantaría mirarme la librería que me has dicho, Estopero, pero la verdad es que llevamos la aplicación fuera de tiempo y no se, me miraré el bundle con más calma para una siguiente aplicación que haga con este framework, ya seguramente hecha solo para mí por afán de aprender más sobre este framework, porque la verdad es que me ha gustado bastante (aunque tampoco es que haya visto muchos, así que en ese campo soy altamente impresionable xDDD). Lo de la mezcla de nombre slugificado y ID me parece perfecta, miraré de hacerlo así :)

De todas formas esta no será la última duda que tenga, esperad verme por este hilo unas cuantas veces más en los próximos días, jejeje.