Gravatar en PHP, Clase para generar avatares.
Hace poco, trabajando con un proyecto del que ya hablaré otro día me encontré con la necesidad de interactuar desde PHP con el servicio gravatar. Una herramienta on-line cuyo uso se ha generalizado bastante y que permite a los usuarios usar su avatar en aquellos servicios web que lo soporten de manera automática, sin tener que registrarse y subir su avatar en diferentes páginas.
Ya existen un par de clases en PHP que permiten interactuar con el servicio de gravatar, sin embargo no se ajustaban exactamente a lo que quería, así que me decidí por implementarla yo mismo. La dejo aquí por si a alguien más le es de utilidad.
Funcionalidades
Esta clase nos permitirá:
- Determinar a partir de un email si el usuario esta utilizando el servicio, es decir, si dispone o no de gravatar.
- Establecer que imagen por defecto se usara, una propia, un identicon, un monster id, o un wavatar.
- Generar el código html para ese gravatar, o bien obtener solo la url.
- Especificar el tamaño en el que se mostrará o descargará el avatar
- Usar dos métodos de acceso, uso de fopen o Curl. Útil si hay restricciones o limitaciones en tu hosting.
Usando la class Gravatar
Aquí un pequeño ejemplo de implementación:
<?php
$gravatar = new Gravatar();
$gravatar->setEmail('admi'.'n@comentalo.net');
$gravatar->setSize(40);
$gravatar->useIdenticonAsDefault();
if( $gravatar->exists() ){
echo "<img src='".$gravatar->getImageUrl()."'>";
echo "EXISTS!!";
}else{
echo "Doesnt exists<br>Showing autogenerated avatars<br>";
echo "<img src='".$gravatar->getImageUrl()."'>";
}
?>
Metodos de uso público
El constructor no requiere parametros, pero podemos especificar el email.
$gravatar = new Gravatar('email@ejemplo.com');
Gravatar::setEmail(string)
Especifica el email sobre el que queremos generar el gravatar
$gravatar->setEmail('ejemplo@test.com');
Gravatar::setSize( integer )
Especifica el tamaño de la imagen, las imágenes de gravatar son cuadradas, así que es tanto el ancho como el alto.
$gravatar->setSize(40);
Gravatar::setRating( string )
Especifica el rating de las imágenes a mostrar, gravatar utiliza un sistema de ratings para impedir que imágenes 'poco adecuadas' aparezcan en servicios que no aceptan ese tipo de imágenes como avatar.
Las opciones posibles son 'g','pg','r', y 'x'. Siendo los avatares de tipo 'G' los aptos para todos los publicos, y los de tipo 'X' aquellos que contengan escenas muy gores o p0rnog4ficas. Si especificamos un rating de tipo 'X' se mostraran todos los avatares.
$gravatar->setRating('PG');
Gravatar::setDefaultImage(string)
Especifica la imagen que se usará en caso de que el usuario no este registrado en gravatar, el servicio de gravatar se encargará del redimensionado por nosotros.
$gravatar->setDefaultImage('http://nidodecuervos.comentalo.net/img/default_avatar.png');
Gravatar::useIdenticonAsDefault(), useMonsterIdAsDefault, y useWavatarAsDefault
Si llamamos a uno de estos métodos haremos que el servicio gravatar genere auto-mágicamente un avatar 'único' para ese correo electrónico solo en caso de que el usuario no este registrado en gravatar. Así, todos los comentarios de 'ejemplo@test.com' mostrarán siempre el mismo avatar generado. Cabe decir que los avatares generados mediante MonsterId son realmente feos :P
$gravatar->useIdenticonAsDefault();
// o
$gravatar->useMonsterIdAsDefault();
// o
$gravatar->useWavatarAsDefault();
Un ejemplo usando los diferentes sistemas de generado
Identicon
|
Wavatar
|
MonsterId
|
|
|
|
Gravatar::getImageUrl()
Nos retornará la url de la imagen en el el servidor de gravatar.
$url = $gravatar->getImageUrl();
Gravatar::getImageTag( [string] )
Nos retornara en forma de string un tag html 'image' con la url del avatar, opcionalmente podemos especificar una clase CSS para nuestra imagen.
$image = $gravatar->getImageTag('avatar_image_class');
Gravatar::exists()
Haciendo uso de la opción 404, este método retornará true(verdadero) si el usuario especificado mediante setEmail() esta dado de alta en el servicio de gravatar, y false(falso) en caso contrario.
if( $gravatar->exists() )
{
echo "User is registered at gravatar";
}
else
{
echo "User is NOT registered at gravatar";
}
Este método no estaba implementado en las clases que encontré por la red. Quizás la opción es relativamente nueva.
En algunos hostings el use de fopen para abrir conexiones HTTP no está soportado, pero como alternativa, si nos permiten usar CURL. Si este método determina que CURL está disponible usará CURL,
si no, intentara la conexión mediante fopen.
A tener en cuenta: Este método abre una conexión, así que no es recomendable abusar de el, si tienes 300 avatares y usas este método cada vez que muestras un avatar para determinar si tiene o no gravatar, estarás abriendo 300 conexiones desde tu servidor, posiblemente no quieras hacer eso, consumiras ancho de banda para nada y además si el servicio de gravatar no responde rápido ralentizarás la carga de tu página. En vez de eso sería recomendable determinar solo una vez si el usuario dispone de gravatar o no y guardar ese dato.
Demostración, creando un gravatar en php
Aquí tenemos un código del ejemplo, que también encontrareis en el archivo comprimido.
<html>
<head>
<style>
.avatar{ border:1px solid black; margin:10px; }
*{ font-size: 11px }
body{ background-color: #F5F5F5; margin:0px; padding:10px;}
#email{ border:1px solid #444444; }
h1,h2{ font-size:14px; }
</style>
</head>
<body>
<h1>Ejemplo de gravatar</h1>
<!-- el formulario -->
<form method='GET'>
Introduce un email:
<input type='text' name='email' id='email' value="<?= $_GET[email] ?>">
<input type='submit' value='ver gravatar'>
</form>
<!-- pongo via JS un email para probar si no han introducido ninguno -->
<?php if( empty($_GET[email]) ): ?>
<script>
document.getElementById('email').value= 'admin'+'@'+'comentalo.net'
</script>
<?php endif; ?>
<?php
////////////////////////////////////////////////////////////////////////////////
// Ejemplo de uso de la clase gravatar
////////////////////////////////////////////////////////////////////////////////
if( $_GET[email] )
{
require 'Gravatar.class.php';
$gravatar = new Gravatar();
$gravatar->setEmail($_GET[email]);
if( $gravatar->exists() )
{
echo "<h2 style='color:#009900'>Ese email dispone de gravatar</h2>";
$gravatar->setSize(40);
echo $gravatar->getImageTag('avatar');
$gravatar->setSize(70);
echo $gravatar->getImageTag('avatar');
$gravatar->setSize(120);
echo $gravatar->getImageTag('avatar');
}
else
{
echo "<h2 style='color:#880000'>Ese email NO dispone de gravatar</h2>";
echo "<p>Mostrando Identicono, MonsterId, y Wavatar (autogenerados)</p>";
$gravatar->setSize(120);
$gravatar->useIdenticonAsDefault();
echo $gravatar->getImageTag('avatar');
$gravatar->setSize(70);
$gravatar->useMonsterIdAsDefault();
echo $gravatar->getImageTag('avatar');
$gravatar->setSize(40);
$gravatar->useWavatarAsDefault();
echo $gravatar->getImageTag('avatar');
}
}
?>
</body>
</html>
Demostración en funcionamiento
Descargar clase Gravatar + ejemplos
Aquí podéis descargar la clase + ejemplo de uso en tres divertidos formatos de compresión.