martes, 24 de junio de 2008

Utilizando Zend_Feed

Estoy haciendo el desarrollo de un portal de noticias, que dentro de poco voy a liberar una primer version. Hoy me tocaba la tarea de hacer la suscripcion Atom de las noticias del portal para lo cual use Zend_Feed.

Voy a mostrar como quedo mi ejemplo.

En un primer paso arme el controller para el modulo Rss.


class Rss_IndexController extends Me_Generic_Controller
{
public function indexAction ()
{
Zend_Loader::loadClass('Zend_Feed');
Zend_feed::importArray(Rss::getArray(), 'atom')->send();
$this->_helper->viewRenderer->setNoRender();
}
}
?>


Tenemos por ahora solo un metodo index, desde ese index cargamos Zend_Feed con Zend_loader, despues vamos a obtener del modelo Rss un array con el contenido que va a tener nuestro Atom. Para procesar ese Array vamos a usar Zend_Feed::importArray, el cual convierte el array en un xml valido. Lo otro que vamos a hacer es evitar que cargue la vista del modulo.

Por ahora va muy simple. Ahora vamos al modelo.



class Rss extends Zend_Db_Table
{
const CANT_NOTICIAS = '20';
const CHARSET = 'utf-8';
public static function getArray ()
{
$noticias = Noticias::getXCantidad(self::CANT_NOTICIAS);
$datos['title'] = 'Portal de noticias';
$datos['link'] = 'http://localhost/diario/rss/';
$datos['lastUpdate'] = Fechas::getMkFromFechaHora(Noticias::getLastDate());
$datos['charset'] = self::CHARSET;
$i = 0;
foreach ($noticias as $noticia) {
$datos['entries'][$i]['title'] = utf8_encode($noticia->titulo);
$datos['entries'][$i]['link'] = 'http://localhost/diario/noticias/?noticia=' . $noticia->id_noticia;
$datos['entries'][$i]['description'] = utf8_encode($noticia->texto_portada);
$datos['entries'][$i]['content'] = utf8_encode($noticia->texto);
$datos['entries'][$i]['lastUpdate'] = Fechas::getMkFromFechaHora($noticia->aud_fecha_hora_ingreso);
++ $i;
}
return $datos;
}
}
?>



Por ahora tambien va a tener un metodo solo, getArray en la primeras lineas traemos desde el modelo de Noticias las ultimas 20 noticias cargadas y activas. Declaramos un titulo a nuestro feed, que va a ser el titulo del portal de noticias, agregamos el link al feed, la fecha de la ultima actualizacion que va a estar con formato mktime y el charset, en nuestro ejemplo sera utf-8.

Con el objeto con las ultimas veinte noticias, vamos a iterarlos, para conseguir el detalle de cada noticia. Y vamos a completar los datos correspondientes, y por ultimo vamos a devolver el array generado.

Cuando le devolvemos al controller el array, este lo transforma en un Atom valido.

Cuando ejecutamos.

http://www.dominio.com/rss


nos va mostrar el Atom de las ultimas 20 noticias ;)




Pero falta algo, como hacer que desde el home nos aparezca el icono de rss y nos permita agregar en nuestro feed con la url http://www.dominio.com/ como hacemos con cualquier blog.

Muy facil
Dentro del head de nuestro html, agregamos la siguiente linea

1

2 <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $this->baseUrl;?>/rss/" />



en href ponemos la url a nuestro feed.



asi nos quedaria

Facil, no?

Otros links

Syndicate content with Zend Framework Zend_Feed classes

4 comentarios:

g05l21 dijo...

Hola, genial la explicación y genial el blog. ;-)

Ahora, se me ocurren unos detalles viendo el código.

*Las constantes podrías cambiarlas y meterlas en un posible archivo de configuración. A parte de poder, incluso, darle las posibilidad cambiar el número de noticias al usuario.

*A parte de eso, veo que usas en la clase Rss_IndexController el metodo Load de la clase Zend_Loader, pero en Rss usas el método autoloader. No es malo, ni mucho menos, pero comentaló para no crear confusión ;-)

A parte de los consejos, genial el post (como el resto del blog! xD )

Pablo Morales dijo...

Hola g05121.

Cuando emepeze a escribir la entrada en algun momento dije intermanete "ACORDATE DE ESCRIBIR QUE USAS AUTOLOAD!!!". Mi cerebro olvido de procesarlo. Gracias por aclararlo y estar atento.

Por el lado de las constantes, eso es relativo a cada uno. Seguramente el ideal sea tenerlo en un archivo .ini de configuracion, pero es particular de cada uno.

Saludos.

g05l21 dijo...

jejeje...
Tenía toda la pinta de que se te pasó el Autoload, miralo por el lado bueno. Ahora podrás escribir un artículo dedicado, en exclusiva, a él xDD

Pablo Morales dijo...

Buena idea puede ser que le dedique un post ;)