Sindicalización (o Sindicando) usando Almidón


En este articulo aprenderemos a utilizar PHP y Smarty con ayuda de almidṕon para diseñar canales/fuentes web (feeds), estos son una forma efectiva de difundir y compartir información, su aplicación general abarca la distribución (syndication en inglés) de noticias o información tipo noticias contenidas en sitios web y weblogs.

Feed, técnicamente, se emplea para denominar a los documentos con formato RSS o Atom, basados en lenguaje XML.

En este entrada hablaremos de como crear un feed en RSS 1.0 (o RDF), RSS 2.0 y ATOM

Consideraciones Previas


Antes de comenzar quisiera establecieramos el ambiente sobre cuál esta enfocada la practica, todo el material se enfocara en un sitio web que provee información de noticias y contenido de bitácora (blogs), por lo que haremos el feed para las noticias, la estructura de la tabla la establesco a continuación:

articulo.php
<?php
class articuloTable extends Table {
  function articuloTable() {
    $this->Table('articulo');
    $this->key = 'idarticulo';
    $this->title = 'Articulos';
    $this->order = 'fecha desc';
    $this->addColumn('idarticulo','serial',0,1,0,'Id');
    $this->addColumn('fecha','date',0,0,0,'Fecha');
    $this->addColumn('articulo','varchar',500,0,0,'Titulo');
    $this->addColumn('autor','varchar',200,0,0,'Autor');
    $this->addColumn('fuente','varchar',200,0,0,'Fuente');
    $this->addColumn('texto','text',0,0,0,'Texto');
    $this->addColumn('keywords','text',0,0,0,'Claves');
    $this->addColumn('imagen','image',0,0,0,'Imagen');
    $this->addColumn('pie','text',0,0,0,'Pie de foto');
  }
}
?>


Sindicando con RSS 1.0 (Recomendado)


Crearemos un archivo php con el nombre de la siguiente manera nombre_rss.xml.php, donde nombre_rss es el nombre que queramos usar para el archivo, rdf es la extensión que se utiliza para la versión 1.0 del RSS y php es la extensión necesaria para que se ejecute el archivo como un archivo script.

Archivo php:
rss.rdf.php
<?php
require('../classes/app.class.php');

$articulo = new articuloTable();
$rows = $articulo->readData();

$smarty->assign('rows',$rows);

header('Content-type: text/xml; charset=utf-8');
$smarty->display('rss.rdf.tpl');
?>


Archivo tpl
rss.rdf.tpl
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  {* URL que identifica en canal *}
  <channel rdf:about="{$smarty.const.URL}/rss.rdf">
  {* Información del channel, subelementos *}
    {* título del RSS, se sugiere un máximo de 40 caracteres *}
    <title>El Observador Económico | {$smarty.const.DOMAIN}</title>
    {* La URL que origina o representa el RSS *}
    <link>{$smarty.const.URL}</link>
    {* un sumario del RSS, se sugiere un máximo de 400 caracteres *}
    <description>Monitoreo, Periscopio, Notas C.A., Opinion, Analisis, Actualidad para el Desafío Económico Global - FIDEG</description>
    {* logo *}
    <image rdf:resource="{$smarty.const.URL}/imgs/elobservEco.png" />
    {* El idioma - español (es) o inglés (en) *}
    <dc:language>es</dc:language>
    {* define la relación entre el canal y algún item encontrado del documento RSS. Tiene un aspecto complicado pero muy necesario *}
    <items>
      <rdf:Seq>
        {* la información que tiene el campo rdf:about de cada item  *}
        {section name=i loop=$rows}
        <rdf:li resource="{$smarty.const.URL}/articulo/{$rows[i].idarticulo}" />
        {/section}
      </rdf:Seq>
    </items>
    {* Para busquedas, sino omitir *}
  </channel>
  <image rdf:about="{$smarty.const.URL}/imgs/elobservEco.png">
    <title>El Observador Económico</title>
    <link>{$smarty.const.URL}</link>
    {* src de la imagen, ancho maximo 144 px y alto de 400 px; por convención 88x31 *}
    <url>{$smarty.const.URL}/imgs/elobservEco.png</url>
  </image>
  {section name=i loop=$rows}
  <item rdf:about="{$smarty.const.URL}/articulo/{$rows[i].idarticulo}">
    <title>{$rows[i].articulo}</title>
    <link>{$smarty.const.URL}/articulo/{$rows[i].idarticulo}</link>
    <description><![CDATA[{$rows[i].texto|strip_tags|truncate:350}]]></description>
    <dc:date>{$rows[i].fecha|date_format:"%Y-%m-%dT%T-06:00"}</dc:date>
  </item>
  {/section}
</rdf:RDF>


vea el ejemplo aquí
Nota: podes añadir imagenes en el campo descripción de cada item, pero se tiene que escapar el html, yo use este código para lograrlo.

    <description>{if $rows[i].imagen}{capture name=image}{html_image file=$smarty.const.URL|cat:'/cms/pic/250x250/articulo/'|cat:$rows[i].imagen}{/capture}{if $smarty.capture.image!=""}{$smarty.capture.image|cat:"<br />"|escape}{/if}{/if}{$rows[i].texto|strip_tags|truncate:350}</description>


Sindicando con RSS 2.0


Crearemos un archivo php con el nombre de la siguiente manera nombre_rss.xml.php, donde nombre_rss es el nombre que queramos usar para el archivo, xml es la extensión que se utiliza para la versión 2.0 del RSS y php es la extensión necesaria para que se ejecute el archivo como un archivo script.

Archivo php:
rss.xml.php
<?php
require('../classes/app.class.php');

$articulo = new articuloTable();
$rows = $articulo->readData();

$smarty->assign('rows',$rows);

header('Content-type: text/xml; charset=utf-8');
$smarty->display('rss.xml.tpl');
?>


Archivo tpl
rss.xml.tpl
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>    <title>El Observador Económico | {$smarty.const.DOMAIN}</title>
    <link>{$smarty.const.URL}</link>
    <description>Monitoreo, Periscopio, Notas C.A., Opinion, Analisis, Actualidad para el Desafío Económico Global - FIDEG</description>
    <language>es</language>
    <category>Economia</category>
    {* Util si usamos cache o el rss se vuelve a generar cada cierto tiempoi, identifica la ultima vez que el contenido del rss cambio *}
    <lastBuildDate></lastBuildDate>
    <webMaster>{$smarty.const.EMAIL}</webMaster>
    {* Mensaje copyright para el contenido en el feed *}
    <copyright></copyright>    <generator>El Nuevo Diario Online v2.0.1 {$smarty.const.URL}</generator>
    <image>
      <title>El Observador Económico</title>
      <url>{$smarty.const.URL}/imgs/elobservEco.png</url>
      <link>{$smarty.const.URL}</link>
      <description>Monitoreo, Periscopio, Notas C.A., Opinion, Analisis, Actualidad para el Desafío Económico Global - FIDEG</description>
      <width>358</width>
      <height>85</height>
    </image>
    {section name=i loop=$rows}
    <item>
      <title>{$rows[i].articulo}</title>
      <pubDate>{$rows[i].fecha|date_format:"%Y-%m-%dT%T-06:00"}</pubDate>
      <link>{$smarty.const.URL}/articulo/{$rows[i].idarticulo}</link>
      {* estructura: uatsap@uatsap.com (uatsap.com) *}
      <author>{$rows[i].autor}</author>
      <guid isPermaLink="true">{$smarty.const.URL}/articulo/{$rows[i].idarticulo}</guid>
      <description>{$rows[i].texto|strip_tags|truncate:350}</description>
      {* opcionales
      <comments></comentarios> - Es la dirección web (URL) donde se encuentran los comentarios acerca del item
      <category></category> -- Categoría a la que pertenece la notícia.
      *}

    </item>
    {/section}
  </channel>
</rss>


vea el ejemplo aqui
Nota: ocurre lo mismo aqui en el campo item, podes añadir imagenes en el campo descripción de cada item, pero se tiene que escapar el html.

Sindicando con ATOM 1.0


Siguiendo la nomenclatura de los feeds anteriores crearemos un archivo php con el nombre de la siguiente manera nombre_rss.xml.php, donde nombre_rss es el nombre que queramos usar para el archivo, xml es la extensión que se utiliza para la versión de ATOM y php es la extensión necesaria para que se ejecute el archivo como un archivo script.

Archivo php
atom.xml.php
<?php
require('../classes/app.class.php');

$articulo = new articuloTable();
$articulo->limit = 10;
$rows = $articulo->readData();

$smarty->assign('rows',$rows);

header('Content-type: text/xml; charset=utf-8');
$smarty->display('atom.xml.tpl');
?>


Archivo tpl
atom.xml.tpl
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>El Observador Económico | {$smarty.const.DOMAIN}</title>
  {* Contiene una descripción o un subtítulo para el feed *}
  <subtitle>Monitoreo, Periscopio, Notas C.A., Opinion, Analisis, Actualidad para el Desafío Económico Global - FIDEG</subtitle>
  {* Enlace al mismo feed *}
  <link rel="self" href="{$smarty.const.URL}/atom.xml" />
  {* Enlace al sitio *}
  <link href="{$smarty.const.URL}" />
  {* Util si usamos cache o el rss se vuelve a generar cada cierto tiempoi, identifica la ultima vez que el contenido del rss cambio *}
  <updated>{$smarty.now|date_format:"%Y-%m-%dT%T-06:00"}</updated>
  <author>
    <name>Grupo Telenica</name>
    {*<email></email>
    <uri>http://siteurl.tld</uri>*}

  </author>
  {* Identifica al feed usando una única y permantente URI. *}
  <id>{$smarty.const.URL}</id>
  {*
  <category term="sports" /> - Especifica una categoría a la que el feed pertenece, puede contener varios si pertenece a varias categorias
  <icon>/icon.jpg</icon> - Identifica una imagen pequeña que da una información visual icónica del feed.
  <rights> © 2005 John Doe </rights> - ensaje copyright para el contenido en el feed
  *}

  <logo>{$smarty.const.URL}/imgs/elobservEco.png</logo>
  <category>Economia</category>
  <generator>El Nuevo Diario Online v2.0.1 {$smarty.const.URL}</generator>
  {section name=i loop=$rows}
  <entry>
    <title>{$rows[i].articulo}</title>
    <updated>{$rows[i].fecha|date_format:"%Y-%m-%dT%T-06:00"}</updated>
    <published>{$rows[i].fecha|date_format:"%Y-%m-%dT%T-06:00"}</published>
    <link href="{$smarty.const.URL}/articulo/{$rows[i].idarticulo}" />
    {* estructura: uatsap@uatsap.com (uatsap.com) *}
    <author>{$rows[i].autor}</author>
    {* Identifica la entrada usando una URI permanente y universal *}
    <id>{$smarty.const.URL}/articulo/{$rows[i].idarticulo}</id>
    {* Contiene un pequeño resumen o parte del comienzo de una entrada *}
    <summary type="html">{if $rows[i].imagen}{capture name=image}<img src="{$smarty.const.URL}/cms/pic/250x250/articulo/{$rows[i].imagen|escape:"url"}" />{/capture}{if $smarty.capture.image!=""}{$smarty.capture.image|cat:"<br />"|escape}{/if}{/if}{$rows[i].texto|strip_tags|truncate:350}</summary>
    {* Contiene o enlaza al contenido de la entrada *}
    <content><![CDATA[{if $rows[i].imagen}{capture name=image}<img src="{$smarty.const.URL}/cms/pic/250x250/articulo/{$rows[i].imagen|escape:"url"}" />{/capture}{if $smarty.capture.image!=""}{$smarty.capture.image|cat:"<br />"}{/if}{/if}{$rows[i].texto|nl2br}]]></content>
  </entry>
  {/section}
</feed>


vea el ejemplo aqui
Nota: ocurre lo mismo aqui en el campo entry, que reemplaza al campo item de RSS 1.0 y 2.0, podes añadir imagenes en el campo summary, reemplazo del campo description de cada entry (entrada), pero se tiene que escapar el html y poner en summary como atributo type="html", ver la linea 38 que se muestra a continuación.

atom.xml.tpl (line 37)
  1.     {* Contiene un pequeño resumen o parte del comienzo de una entrada *}
  2.     <summary type="html">{if $rows[i].imagen}{capture name=image}<img src="{$smarty.const.URL}/cms/pic/250x250/articulo/{$rows[i].imagen|escape:"url"}" />{/capture}{if $smarty.capture.image!=""}{$smarty.capture.image|cat:"<br />"|escape}{/if}{/if}{$rows[i].texto|strip_tags|truncate:350}</summary>


Alertar al navegador que hay un feed RSS en el sitio


Para Incrustarl cualquiera de los Feed en el sitio web y que aparezca el logo de feed en la barra de direcciones, hay que poner cualquiera de las siguientes etiquetas en dependencia del caso. Explicación: href ruta del feed, title etiqueta que aparecera cuando se pressione el icono del feed en la barra de direcciones del navegador

RSS 1.0 - <link rel="alternate" type="application/rss+xml" href="/rss.rdf" title="RSS 1.0" />
RSS 2.0 - <link rel="alternate" type="application/rss+xml" href="/rss.xml" title="RSS 2.0" />
ATOM - <link rel="alternate" type="application/atom+xml" href="/atom.xml" title="ATOM" />

Enlaces de Interes


RSS, Tutorial
RSS: Sindicando Contenido
¿Qué es RSS –y XML, RDF, Atom,...?
RSS 1.0: Motores de recuperación de documentos XML/RDF
RSS 2.0
web.resource.org RSS 1.0
RSS 2.0 Spec
Atom: Una pequeña introducción
Atom



CategoryDev
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki