1. Introducción

La idea que siempre tuve en mente, era la de hacer un agregador de contenidos que mostrara al usuario la información filtrada de forma inteligente, captando y aprendiendo de los gustos del usuario. Todos somos conscientes del problema que representa el gran volumen de información que circula cada día por la red y lo fácil que resulta en ocasiones no enterarse de cosas que podrían haber sido de nuestro interés.

Los RSS, que de echo son la base de la denominada web semántica, suelen estar categorizados y gracias a eso son un buen sistema para montar un sistema inteligente que sea capaz de aprender de nuestros y gustos y nos muestre la información que realmente nos interesa.

Fideos.net no llega a ese punto, como me parece que no llega ningún otro agregador RSS. A lo máximo que llega es a mantener un contador de clicks en los enlaces para montar "El Caldo" una clasificación de lo más visitado por todos los usuarios.

Este documento no pretende ser ni muy exhaustivo ni formal, simplemente se intenta explicar como funcionan más o menos las partes más importantes del proyecto y el porque de algunas decisiones de diseño.

2. Librerías utilizadas

En Fideos.net se utilizan las siguientes librerías:

3. Instalación

La instalación es muy sencilla, únicamente se trata de seguir los siguientes pasos:

  • Crear la base de datos (herramientas como phpMyAdmin ayudan mucho)
  • Ejecutar el script SQL "docs/database/create_db.sql"
  • Configurar el fichero "includes/config.inc.php" modificando los siguientes valores:
    • SERVER_PATH: Indicar el directorio donde se encuentra fideos
    • Configurar el acceso a la base de datos poniendo los valores adecuados en las entradas DB_* (DB_SERVER, DB_USERNAME,...)
    • Configurar el envío de e-mails (entradas de tipo SMTP_*)
A tener en cuenta que si Fideos no se va a servir desde la raíz del dominio se deberá modificar el valor de APP_PATH. Por ejemplo, si se va a servir desde "http://foo.bar/fideos" APP_PATH deberá valer "/fideos". En el fichero de configuración están explicadas con más detalle cada una de las entradas.

4. ¿Cómo se actualizan los "feeds"?

Fideos.net es una web donde el usuario puede escoger y organizar en carpetas las fuentes RSS de las que quiere estar informado.

Los RSS, que de echo son la base de la denominada web semántica, suelen estar categorizados y gracias a eso son un buen sistema para montar un sistema inteligente que sea capaz de aprender de nuestros y gustos y nos muestre la información que realmente nos interesa.

El proceso de actualización de las fuentes es muy simple, cada hora se ejecuta un "cron" (Updater) que actualiza todas las fuentes RSS y las guarda en caché. De esta manera aceleramos el proceso de generación de la página con el panel de RSS del usuario.

Asimismo, el proceso de actualización también inserta en la base de datos las entradas de cada RSS para permitir llevar la estadística de las noticias mas visitadas por los usuarios y poder generar el RSS llamado "El Caldo".

Si un usuario pide un RSS cuya caché ha expirado se actualiza la caché pero no se inserta nada en la BDD. La BDD solo la actualiza el "cron" de actualización. Si prescindiéramos del "Caldo" no haria falta el "cron" y por lo tanto no seria necesario mantener la tabla de entradas en la BDD.

5. La generación del Layout

Para la generación de las páginas HTML se utiliza el patrón de diseño "Decorator", es decir, existe una plantilla HTML marco (o decorador) con un hueco donde se coloca el contenido de cada página. En otras palabras, en lugar de hacer los típicos "includes" lo que se hace es inyectar la página solicitada dentro de la plantilla marco. Para implementarlo se ha usado el motor de plantillas patTemplate.

Esto solo aplica a los requests de páginas completas, no a las llamadas AJAX, donde solo se devuelve el HTML que se deba incrustar en la capa indicada.

La clase FLayout.php que extiende de Layout es la que se encarga de montar las páginas. Básicamente necesita que se le indique una plantilla "marco" (en nuestro caso "/templates/layout.tpl") y el contenido a pintar en el área "main_content". En el siguiente ejemplo se verá más claro como funciona.

<?php
   include ("includes/common.php");
   $layout = new FLayout();
   $tplMain = &new patTemplate();
   $tplMain->setRoot( TEMPLATE_PATH );
   $tplMain->readTemplatesFromInput( 'contact.tpl' );
   $layout->setMainContent($tplMain->getParsedTemplate());
   $layout->display();
?>

Creamos un nuevo Flayout y leemos la plantilla contact.tpl, que colocaremos en el hueco [MAIN_CONTENT] del marco mediante el metodo setMainContent. Una vez finalizado, se muestra la página con el método display.

6. Un simple MVC

Para demostrar que se pueden aplicar patrones de diseño en PHP y trabajar al estilo Java, obviamente salvando las distancias, he tratado de aplicar ciertos conceptos que se utilizan mayoritariamente en los proyectos "javeros", como los Beans, a los que he llamado Peans (PHP Beans) y un DAO por cada entidad.

De esta manera tenemos una capa que genera el HTML, otra que accede a los datos, un controlador que se comunica con ambas y unos objetos, los Peans, que viajan de un lado a otro.

Todos los DAOs se encuentran en "/lib/pdaos" y los objetos del modelo en "/lib/peans".

Un módulo típico, por ejemplo el de las carpetas de usuario, constaría de lo siguiente:

  • Un Pean (/lib/peans/folder_pean.php)
  • Un DAO (/lib/pdaos/fd_folders.php)
  • Una o varias plantillas HTML (/templates/folders.tpl)
  • Uno o varios controladores (/ajax/create_folder.php)

7. El Caldo y El Fideotipo

El Caldo y el Fideotipo son los dos RSS que genera Fideos.net. El Caldo muestra las noticias más vistas por los usuarios y El Fideotipo las Últimas entradas de toda la nube de RSS.

Los RSS, que de echo son la base de la denominada web semántica, suelen estar categorizados y gracias a eso son un buen sistema para montar un sistema inteligente que sea capaz de aprender de nuestros y gustos y nos muestre la información que realmente nos interesa.

Para saber cuales son las noticias más visitadas y generar El Caldo, lo que se hace es agregar al evento "onclick" de los enlaces una llamada AJAX que incrementa el contador de visitas. Una vez lanzado el "click" se ejecuta el HREF del enlace y se abandona la página.

Lo del Fideotipo es más sencillo, simplemente se busca en la BDD los Últimos posts agregados de todas las fuentes RSS de Fideos.net.

8. Modelo de datos

8.1. Diagrama Entidad-Relación

8.2. Estructura de datos

8.2.1 Tabla: fd_webusers

Los usuarios que se registren se almacenan aquí.

Campo

Tipo

Descripción

wus_id

bigint

Clave primaria

wus_Email

varchar(255)

Email del usuario

wus_Password

varchar(255)

Password encriptado del usuario

wus_Username

varchar(50)

Nick del usuario

wus_Active

int

Indica si está activo (1), puede hacer login, o inactivo (0)

wus_Registered

DateTime

Fecha de registro

wus_ValidationKey

varchar(255)

Clave de validación para confirmar el alta

8.2.2 Tabla: fd_links

En esta tabla se almacenan los feeds RSS

Campo

Tipo

Descripción

lnk_id

int

Clave primaria

lnk_Title

varchar(100)

Título del feed

lnk_URL

varchar(255)

URL del feed RSS

lnk_Description

text

Descripción del feed

lnk_Order

int

Orden en que se muestra (no se usa)

lnk_SiteUrl

varchar(255)

URL del site origen del RSS

lnk_Active

Int

Indica si el feed está activo (1), para mostrarlo en la web, o no (0).

lnk_Category_fk

int

Categoria del feed. Clave foránea a la tabla fd_categories

lnk_User_fk

bigint

Usuario que registró el feed. Clave foránea a la tabla fd_webusers

8.2.3 Tabla: fd_categories

Campo

Tipo

Descripción

cat_id

int

Clave primaria

cat_Name

varchar(150)

Nombre de la categoría

8.2.4 Tabla: fd_folders

Carpetas de los usuarios de Fideos.net

Campo

Tipo

Descripción

fol_id

bigint

Clave primaria

fol_Name

varchar(15)

Nombre de la carpeta

fol_Order

int(11)

Orden en que el usuario decide mostrar la carpeta

fol_User_fk

bigint

Usuario propietario de la carpeta. Clave foránea a la tabla fd_webusers

8.2.5 Tabla: fd_itemsfeed

Se almacenan las entradas/posts de cada feed RSS.

Campo

Tipo

Descripción

itf_id

bigint

Clave primaria

itf_Title

varchar(255)

Título de la entrada

itf_Description

text

Descripción de la entrada

itf_Url

varchar(255)

URL de la entrada/post original

itf_Date

varchar(100)

Fecha de publicación del post

lnk_SiteUrl

varchar(255)

URL del site origen del RSS

itf_Visit

int

Número de veces que los usuarios han pulsado el enlace para ver el post. Se usa para "El Caldo"

itf_Link_fk

int

Feed al que pertenece la entrada. Clave foránea a la tabla fd_links

8.2.6 Tabla: fd_userfeeds

Feeds que los usuarios han añadido a su perfil

Campo

Tipo

Descripción

usf_Link_fk

int

Clave primaria. Clave foránea a la tabla fd_links

usf_User_fk

bigint

Clave primaria. Clave foránea a la tabla fd_webusers

usf_Order

int

Orden en que el usuario decide mostrar sus feeds

usf_Folder_fk

bigint

Carpeta usuario donde el usuario coloca el feed. Clave foránea a la tabla fd_folders.

8.2.7 Tabla: fd_feedvotes

Votos que los usuarios dan a los feeds. Comofd_userfeeds, es una relación entre usuarios y feeds, pero como un usuario puede votar feeds que no tiene porque tener agregados a su perfil es por ello que se monta en una tabla diferenciada.

Campo

Tipo

Descripción

fvo_Link_fk

int

Clave primaria. Clave foránea a la tabla fd_links

fvo_User_fk

bigint

Clave primaria. Clave foránea a la tabla fd_webusers

fvo_Points

int

Puntuación del 1 al 5 que el usuario ha dado al feed

8.2.8 Tabla: fd_comments

Comentarios que los usuarios hacen sobre los feeds

Campo

Tipo

Descripción

com_id

int

Clave primaria.

com_Comment

text

Comentario.

com_Date

datetime

Fecha del comentario

com_Link_fk

int

Enlace que se comenta. Clave foránea a la tala fd_links

com_user_fk

bigint

Usuario que ha hecho el comentario. Clave foránea a la tabla fd_webusers