Condividi su Facebook
Scrivere dinamicamente un Feed RSS
Scritto da: Monska il 20/06/2009 alle 12:33
Tag: Programmazione, PHP.Visto 655 volte.


Feed RSS

Un feed RSS, acronimo di Really Simple Syndication, è un formato per la distribuzione di contenuti Web.
Il vero nocciolo del feed è un "semplice" file XML contenente i dati ben formattati per la distribuzione.

Perchè i Feed RSS sono diventati così importanti è molto semplice: avere un unico programma (aggregatore) che mi consente di avere sotto mano tutte le notizie pubblicate su diversi siti, e che con un click posso raggiungere l'articolo al quale sono interessato, è molto molto comodo.
Inoltre quasi la totalità degli aggregatori rimane attivo in background e ci segnala quando un feed viene modificato, avvisandoci così, quasi in tempo reale, dell'uscita di una nuova notizia pubblicata.

Aggregatore Liferea

Vedremo come generare un feed RSS 2.0 senza bisogno di troppi plugin, programmi o applicazioni; in realtà la generazione, se si conosce la sintassi, è molto semplice.
Per prima cosa diamo uno sguardo alle specifiche imposte dal W3C per quanto riguarda i Feed a questo indirizzo; ci risulterà utile per capire quali sono gli elementi obbligatori e quali invece possiamo tralasciare se non siamo interessati. Un altro link interessante per comprendere i vari nodi del file è questo.

Ora non ci resta che scegliere i contenuti che vogliamo pubblicare.
Nel caso di blog, o comunque feed dinamici, quindi RSS il cui contenuto cambia in base a determinati eventi, la scelta migliore è utilizzare la classe DOM del PHP per generare il nostro file.
Questa classe ci fornisce tutti i metodi utili per una generazione semplice e funzionale di un file XML, e nel nostro caso particolare di un XML rappresentante un Feed RSS.

Vediamo ora come avviene la generazione dinamica del contenuto XML.
Per prima cosa instanziamo la class DOMDocument che gestirà la creazione del file:

Code:

$doc = new DOMDocument('1.0', 'UTF-8');

questo assegna alla variabile $doc l'oggetto di tipo DOMDocument e con i parametri 1.0 e UTF-8 dichiariamo che il nostro file XML avrà come versione la 1.0 e come codifica quella UTF-8.
Output XML:

Code:
<?xml version="1.0" encoding="UTF-8"?>

Come da specifiche passiamo a creare il primo nodo del file, quello con conterrà tutti gli altri, il nodo rss.
Per la dichiarazione di questo nodo ci basterà inseririe le seguenti linee di codice:

Code:

$rss = $doc->createElement("rss");
$rss_version = $doc->createAttribute("version");
$rss_version_text = $doc->createTextNode("2.0");
$rss_version->appendChild($rss_version_text);
$rss->appendChild($rss_version);

assegnamo in questo modo alla variabile $rss un elemento XML.
L'output XML è:

Code:
<rss version="2.0">

Sempre seguendo le specifiche il prossimo nodo da creare è il nodo channel.
Il codice PHP è:

Code:

$channel = $doc->createElement("channel");

Il nodo channel è il nodo che specifica al suo interno le informazioni del feed e tutti gli item che devono essere mostrati dal feed.
Per quanto riguarda le informazioni le possiamo generare con il seguente codice PHP:

Code:

/*ELEMENTI OBBLIGATORI DI CHANNEL*/
$node = $doc->createElement("title",<titolo del nostro feed>);
$channel->appendChild($node);
$node = $doc->createElement("link",<link al sito relativo al feed>);
$channel->appendChild($node);
$node = $doc->createElement("description",<una breve descrizione dei contenuti>);
$channel->appendChild($node);s
/*ELEMENTI OPZIONALI DI CHANNEL*/
$node = $doc->createElement("language",<la lingua del file (codice della lingua) >);
$channel->appendChild($node);
$node = $doc->createElement("webMaster",<indirizzo mail del WebMaster (Nome reale)>);
$channel->appendChild($node);
$node = $doc->createElement("generator",<generatore del codice XML (PHP DOM)>);
$channel->appendChild($node);
$img = $doc->createElement("image");
$node=$doc->createElement("title",<titolo dell'immagine>);
$img->appendChild($node);
$node=$doc->createElement("url",<url dell'immagine>);
$img->appendChild($node);
$node=$doc->createElement("link",<link al sito relativo al feed>);
$img->appendChild($node);
$channel->appendChild($img);
$node = $doc->createElement("lastBuildDate",<data dell'ultima generazione>);
$channel->appendChild($node);

Con questo codice stiamo assegnando al feed un titolo, un link a cui fa riferimento, una breve descrizione, la lingua, un manutentore, un logo e la data in cui il file XML è stato generato.
Come si vede da questo codice non basta creare degli elementi, ma bisogna anche "appenderli" all'elemento a cui essi si riferiscono, altrimento rimarrano solo elementi creati ma mai visualizzati.

Dichiarate tutte le informazioni, possiamo passare al vero e proprio contenuto.
Ogni singolo elemento viene definito tramite il nodo item.
Per creare un nuovo nodo utilizziamo il seguente codice:

Code:

$item = $doc->createElement("item");
$node = $doc->createElement("title",<titolo del singolo elemento>);
$item->appendChild($node);
$node = $doc->createElement("link",<link di riferimento a questo elemento>);
$item->appendChild($node);
$node = $doc->createElement("description",<una breve descrizione>);
$item->appendChild($node);
$node = $doc->createElement("author",<indirizzo mail (Nome reale)>);
$item->appendChild($node);
$node = $doc->createElement("category",<categoria di appartenenza dell'elemento>);
$item->appendChild($node);
$node = $doc->createElement("pubDate",<data di pubblicazione>);
$item->appendChild($node);
$channel->appendChild($item);

Come si vede dal codice abbiamo creato un elemento item, lo abbiamo popolato con altri elementi ed infine abbiamo attaccato l'item al nodo channel.

Dopo aver appeso al nostro nodo channel tutti gli elementi che vogliamo inserire nel nostro feed, appendiamo il nodo channel al nodo rss e il nodo rss lo appendiamo alla radice del nostro documento con il seguente codice:

Code:

$rss->appendChild($channel);
$doc->appendChild($rss);

Siamo ora pronti a salvare il documento.
Per farlo basterà utilizzare:

Code:
echo $doc->saveXML();

in questo modo la pagina stamperò in output il codice XML relativo al nostro Feed RSS.
Ora ci basterà mettere nel nostro aggregatore l'url della pagina PHP appena creata e il risultato sarà facilmente fruibile da tutti.
Ricordiamo che anche il sito Codice A Sbarre . Net mette a disposizione dei propri utenti il Feed RSS per una migliore accessibilità ai contenuti.


21/06/2009 - 00:53:14NeRON dice:
non lo so... forse io devrei rifarlo usando il dom... per ora faccio uno stupido echo di tutta la pagina... peró non son cosí sicuro che sia una cosa sbagliata... nel senso.. mi pare che sia parecchio piú semplice di tutto questo.. e poi mi é sempre venuto un certo mal di pancia a scrivere gli xml con il dom...
21/06/2009 - 01:12:49Monska dice:
Eheh DOM è "complicato" un po' all'inizio ma ci fai velocemente l'abitudine. Sicuramente non è sbagliato quello che fai di stampare la stringa XML, senza troppo sbattimento, ma affidare a una classe fatta apposta la genarazione del file mi sembra più ottimale, basta prenderci la mano.
26/06/2009 - 09:34:01Alberto Trussardi dice:
Ottimo, dettagliato e chiaro un bell'articolo! Grazie Dany!

Aggiungi un commento:
Nick:
captchaInserire il codice: