Continuando con nuestra larga saga de tutoriales sobre diseño Web, en esta ocasión les traemos un pequeño desarrollo que sin duda puede ser de gran utilidad para nuestros sitios, en especial si queremos montar una especie de portafolio o una simple galería para desplegar imágenes.
En un esfuerzo conjunto e integración de tecnologías como PHP, jQuery, CSS, XHTML y un poco de MySQL, hoy veremos un paso a paso de como construir una simple galería de imágenes desde cero.
El detalle, como siempre, después del salto.
Como siempre, lo primero:
Detalles del tutorial
- Tiempo aproximado de implementación: 60 minutos.
- Dificultad: Intermedio.
- Conocimientos requeridos: Idealmente nociones de PHP, XHTML, CSS, jQuery y bases de datos, especialmente si quieren personalizar el diseño final. De cualquier forma, todo será explicado paso a paso en caso de que deseen implementar tal como está acá.
Implementos necesarios:
- Un servidor que pueda ejecutar archivos PHP. (Recomendamos XAMPP para Windows, Linux y Mac).
- Un sistema gestor de bases de datos MySQL (En XAMPP viene uno incluido).
- Opcionalmente un editor Web (Recomendamos Adobe Dreamweaver o Aptana Studio).
- Un editor de imágenes (Recomendamos Adobe Photoshop).
- La librería jQuery, que pueden obtener desde su sitio oficial.
- Imágenes para montar en la galería. Para este caso utilizamos algunas de la galería de JoesSistah, las cuales están bajo una licencia Creative Commons.
Con eso claro, vamos, manos a la obra:
1.- Lo primero que haremos será crear una base de datos en nuestro MySQL y en el una tabla llamada imagen, la cual contendrá 4 campos de información:
CREATE TABLE 'clh'.'imagen' ( 'id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 'titulo' VARCHAR( 50 ) NOT NULL , 'descripcion' TEXT NOT NULL , 'archivo' VARCHAR( 20 ) NOT NULL ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci
Repasando nuestro código anterior, lo que hemos hecho ha sido crear una tabla llamada imagen, la cual contiene 4 campos:
2.- Luego que hemos creado la tabla, insertaremos información de 4 imágenes:
INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 1', 'Imagen representativa de un paisaje con costa', '1.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 2', 'Imagen representativa de un paisaje con nieve', '2.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 3', 'Imagen representativa de un paisaje con una luna en el fondo', '3.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Imagen abstracta', 'Representacion de una mariposa', '4.jpg')
3.- Con eso debiésemos tener una tabla de la siguiente forma:
[table id=2 /]
4.- Con nuestra tabla creada, y antes de empezar a codificar, haremos la preparación de nuestras imágenes. Para la galería, necesitaremos 3 tamaños de las mismas imágenes, 2 los fijaremos en imágenes distintas y 1 lo redimensionaremos vía CSS. Así que necesitaremos:
Los 2 primeros pueden hacerlo mediante su editor de imágenes favorito.
5.- Con todo aquello listo, procedemos a codificar. Nuestra galería contará de 2 archivos en formato PHP, uno donde desplegaremos un preview de las imágenes y añadiremos un pequeño efecto en jQuery para que estas aparezcan oscuras al cargar la página y que solo sean completamente visibles cuando el usuario pase el mouse por encima, y el otro funcionará como un visor de la imagen en tamaño completo, con su respectiva información y enlaces para imágenes siguientes y anteriores, así como otro preview de la misma galería en un tamaño más pequeño. Adicionalmente codificaremos un archivo en formato CSS para el estilo de la galería y un archivo en formato JS para nuestras funciones en jQuery. Así que resumiendo, los archivos que crearemos son:
Vamos con el primero. Los comentarios como siempre, dentro del código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> /* Incluimos la hoja de estilos, la libreria jquery y nuestra libreria de funciones */ <link rel="stylesheet" href="css/estilos.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/funciones.js"></script> <title>Galería de Imágenes</title> </head> <body> <div id="galeria"> <h1>Mi galería de imágenes</h1> <?php /* Conectamos a la BD para obtener la informacion de las imagenes que tenemos guardadas */ $conexion = new mysqli('localhost', 'usuario', 'clave', 'clh'); $consulta = "SELECT id, titulo, descripcion, archivo FROM imagen"; // Obtenemos el resultado de la consulta $resultado = $conexion->query($consulta); // Desplegamos las imagenes con un enlace a su id while($filas = $resultado->fetch_array(MYSQLI_ASSOC)) { ?> <a href="visor.php?id=<?php echo $filas['id']; ?>"> <img src="img/t-<?php echo $filas['archivo']; ?>" alt="imagen" /> </a> <?php } ?> </div> </body> </html>
En resumen, lo que hemos hecho en nuestro index.php, yendo paso a paso:
Y ahora continuamos con el visor, en donde podremos mostrar las imágenes en tamaño completo y con más información:
<?php /* Obtenemos el id que fue pasado como parametro por URL, y luego creamos 2 variables: prev y sig que corresponden a la id anterior y siguiente de la imagen actual */ $id = $_GET['id']; $prev = $id-1; $sig = $id+1; /* Conectamos a la BD y obtenemos la informacion de la imagen actual*/ $conexion = new mysqli('localhost', 'usuario', 'clave', 'clh'); $consulta = "SELECT titulo, descripcion, archivo FROM imagen WHERE id = $id"; $resultado = $conexion->query($consulta); $fila = $resultado->fetch_array(MYSQLI_ASSOC); /* Luego conectamos a la BD y obtenemos la primera y ultima id de imagen, para saber cuando se trata de la ultima y/o primera imagen de la galeria */ $consulta = "SELECT min(id) as minimo, max(id) as maximo FROM imagen"; $resultado = $conexion->query($consulta); $datos = $resultado->fetch_array(MYSQLI_ASSOC); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> // Creamos el titulo de la pagina de acuerdo a la imagen <title>Galería de Imágenes - <?php echo $fila['titulo'];?> </title> // Incluimos la hoja de estilo y librerias <link rel="stylesheet" href="css/estilos.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/funciones.js"></script> </head> <body> <div id="contenedor"> <?php /* Comparamos la id actual con la menor id de la tabla para saber si es la primera imagen de la galeria. Si no es igual, mostramos un enlace para la imagen anterior */ if($id != $datos['minimo']) { ?> <a href="visor.php?id=<?php echo $prev; ?>"> <img src="img/back.png" /> </a> /* De lo contrario, mostramos una imagen indicando que no hay nada antes */ <?php } else { ?> <img src="img/block.png" alt="Primera imagen" /> <?php } ?> /* Desplegamos la imagen actual en tamaño completo con su respectiva descripcion */ <img id="imgcompleta" src="img/<?php echo $fila['archivo']; ?>" alt="<?php echo $fila['descripcion'];?>" /> /* Comparamos la id actual a la mayor id de la tabla para saber si es la ultima imagen. Si no es igual mostramos un enlace para la imagen siguiente */ <?php if($id != $datos['maximo']){ ?> <a href="visor.php?id=<?php echo $sig; ?>"> <img src="img/next.png" /> </a> /* De lo contrario, mostramos una imagen indicando que no hay nada despues */ <?php } else { ?> <img src="img/block.png" alt="Última imagen" /> <?php }?> /* Establecemos un pequeño div para la informacion de la imagen. Cuando el usuario pase el mouse por encima, apareceran los datos (titulo y descripcion) */ <div id="masinfo"><h4>Información de la imagen <a href="#"><img src="img/add.png" alt="Más información" /></a></h4></div> /* Este div mostrara la informacion de la imagen. Por defecto lo dejaremos oculto mediante CSS y solo se mostrara al pasar el mouse sobre el */ <div id="info"> <p>Título: <?php echo $fila['titulo'];?></p> <p>Descripción: <?php echo $fila['descripcion'];?></p> </div> </div> /* Al igual que en index, mostraremos la galeria completa, solo que esta vez las imagenes seran mas pequeñas */ <div id="galeria-small"> <h3>Mis otras imágenes</h3> <?php $cons = "SELECT id, titulo, descripcion, archivo FROM imagen"; $res = $conexion->query($cons); while($filas = $res->fetch_array(MYSQLI_ASSOC)) { ?> <a href="visor.php?id=<?php echo $filas['id']; ?>"> <img src="img/t-<?php echo $filas['archivo']; ?>" alt="imagen" /> </a> <?php } ?> </div> </body> </html>
Resumiendo el archivo anterior, lo que hicimos fue:
Ya con eso listo, nos falta declarar nuestras funciones en jQuery y nuestra hoja de estilos. Partiremos por las funciones:
$(function(){ /* Este es un efecto inicial sobre la galeria, en el cual decimos basicamente que cuando la pagina cargue, las imagenes se muestren mas oscuras y que al pasar el mouse por encima tomen su opacidad natural. Para esto utilizamos las funciones animate, hover y stop de jQuery. */ $('#galeria img').animate({ "opacity" : .5 }); $('#galeria img').hover(function(){ $(this).stop().animate({ "opacity" : 1 }); }, function(){ $(this).stop().animate({ "opacity" : .5}); }); /* Repetimos el mismo efecto para la galeria pequeña que mostramos en el visor */ $('#galeria-small img').animate({ "opacity" : .5 }); $('#galeria-small img').hover(function(){ $(this).stop().animate({ "opacity" : 1 }); }, function(){ $(this).stop().animate({ "opacity" : .5}); }); /* Ahora aplicamos la funcion para que cuando un usuario pase el mouse por encima del div con id masinfo, se despliegue la informacion del div info del visor. Esto lo haremos mediante las funciones hover, fadeIn y fadeOut de jQuery */ $('#masinfo').hover(function(){ $('#info').fadeIn(); }, function(){ $('#info').fadeOut(); }); });
En resumen, lo que hicimos aquí fue:
Y ahora nos queda la parte final, que es declarar los estilos:
body { background: black; color: white; font-family: Arial, Helvetica, sans-serif; width: 100%; margin: 0 auto; } #galeria{ width: 800px; margin: 0 auto; } #galeria img{ border: 1px solid white; padding: 1px; margin-right: 10px; margin-bottom: 10px; } #galeria-small{ width: 800px; margin: 0 auto; } #galeria-small img{ width: 100px; height: 100px; border: 1px solid white; } #contenedor{ width: 800px; margin: 0 auto; padding-top: 10px; } #imgcompleta{ border: 1px solid white; } a img{ border: none; } /* Este es el div con informacion de la imagen. Inicialmente cargara con display:none para que no sea visto a menos que el usuario pose el mouse encima */ #info { display: none; }
Y con eso tenemos nuestro resultado final:
Primera vista de la galería
La imagen toma su opacidad natural al pasar el mouse por encima
Vista completa de la primera imagen
Información de la primera imagen al pasar el mouse por encima del div de información
Vista completa de imagen que tiene una previa y una siguiente
Vista completa de la última imagen
Antes de terminar, y comprendiendo que este tutorial ha sido largo, integramos una nueva característica a estos tutoriales:
Y con eso damos por terminado este tutorial, recordándoles como siempre que ha sido:
Esperamos que haya sido de utilidad para Uds. Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas en el área habilitada a continuación.
Muchas gracias por leer y será hasta una próxima oportunidad.
9:13:20 am
Muy bueno, pero no me funciona… me da error en la línea 12 del arhcivo visor.php
Fatal error: Call to a member function fetch_array() on a non-object in /homepages/38/d317505483/htdocs/imagesgallery/visor.php on line 12
Alguna solución?
No lo he copiado, me he descargado vuestro archivo 🙂
10:11:28 am
@Kuassar: Recuerda en visor cambiar los datos de la conexión a la base de datos por los que corresponden a tu instalación, con eso se te solucionará el problema.
Saludos!
3:11:11 pm
No… he puesto los datos bien pero no funciona… ese error me viene con los datos puesto, y si elimino la linea 12 aparece la galeria (vacia) y no puedo añadir ninguna imagen…
4:13:56 pm
@Kuassar: El error que te aparece es porque el objeto que llama a fetch_array ($resultado, que contiene lo devuelto por la consulta) no fue creado. Es decir, existe un problema ya sea con la conexión a la BD o la consulta.
Acá descargamos el código y lo probamos sin problemas. Si quieres puedes publicar lo tuyo acá en los comentarios para que lo veamos de cerca.
Saludos!
3:42:52 pm
Hola, cuando sale el nuevo tutorial… jejejeje ya estoy esperando impacientemente.
11:33:47 am
vaya excelente tutorial en verdad muy bueno me a enseñado mucho, muchas gracias al la gente de “como lo hago.cl” lo unico es una idea… es que la galeria fuese auto actualizable por la parte front end
9:52:40 pm
Excelente amigo me has salvado de un gran conflicto, espero estar contigo en contacto para que me ayudes o intercambiemos ideas, yo apenas estoy empezando a programar en php y me parece que eres un genio de la programacion.
7:08:44 pm
muy bien!, stá perfecto
5:14:12 pm
Muchas gracias. estaba buscando algo asi, en donde pudiera agregar comentarios a las imagenes..
2:04:51 am
ya intente hacer este tipo de galeria par mi sitio web que estoy construyendo y no sales lo que se muestra en el tutorial