domenica 3 marzo 2013

Generare dinamicamnte i Feed RSS con PHP (Parte 1/2)

Really Simple Syndication 2.0, o semplicemente RSS, è un metodo per diffusione di contenuti aggiornati tramite file conforme alle specifiche xml 1.0.

Tramite tale file gli RSS reader, come molti browser che lo integrano o Microsoft Outlook, presentano all'utente i contenuti più recenti sotto forma di mail (una per ogni contenuto diffuso). In tal modo l'utente può prendere visione subito, in toto o in parte del contenuto ed eventualmente decidere di andare sul sito di riferimento.

I contenuti si presentano sotto forma di mail, quindi lette o non lette, e ogni contenuto è scaricato non più di una volta dal reader (se siamo stati bravi).

Non ha importanza che il file si presenti come pippo.xml o pippo.php. L'importante è che sia un file xml correttamente formattato.

In questa prima parte vedremo cosa contiene un file xml per la diffusione di Feeds (una lista di contenuti).

Il primo elemento deve essere <rss>, che deve avere al suo interno l'attributo version. Al suo interno trova posto il solo elemento <channel>, che contiene i meta dati del canale e le voci o contenuti (i feeds). 

<rss version="2.0">
    <channel>

    </channel>
</rss>


La specifica prescrive la presenza, all'interno dell'elemento <channel>, degli elementi <title>, <link> e <description>. Esistono molte altre voci facoltative, ma in questo tutorial ci soffermeremo sulle sole realmente necessarie a comporre un Feed RSS ben formattato

  • <title> è il titolo del canale. Se ad esempio abbiamo un blog e inseriamo nel nostro RSS gli ultimi contenuti estratti dal blog, il titolo può essere quanto contenuto dall'elemento <title> della nostra pagina HTML. Se invece il canale è una categoria specifica, allora potrà essere il nome di tale categoria o come gli utenti si riferiscono a tale servizio.
  • <link> conterrà al suo interno un URL. Riprendendo gli esempi utilizzati per title potremo avere l'URL al sito web o ad una sezione specifica se il canale fa riferimento a tale sezione.
  • <description> fornisce una descrizione della categoria oggetto di diffusione. 
Compilando ulteriormente il nostro file xml avremo ad esempio:

<rss version="2.0">
    <channel>
        <title>Frutto Digitale</title> 

        <description>
            Il mio personale laboratorio PHP in cui metto in opera gli script 
            illustrati nel mio blog. 
        </description>
        <link>http://fruttodigitale.altervista.org</link>

    </channel>
</rss>



Ci sono ulteriori elementi opzionali che compongono i meta dati di <channel>. Uno di questi è <image> che accetta un url ad una immagine che potrà (ma non è detto) essere visualizzata dal reder o <language> per indicare al reader la lingua utilizzata. Per un elenco più dettagliato degli elementi si rimanda alle specifiche RSS.

Ora che abbiamo anche i metadati del canale, ciò che manca sono i feeds ossia l'elenco delle notizie che intendiamo diffondere. Le notizie sono contenute nell'elemento <item>. Sebbene tale elemento non sia obbligatorio, un <channel> senza neanche un <item> non diffonde nulla.

Ogni <item>, se presente, non ha elementi obbligatori, ma è comunque fatto obbligo che sia presente un <title> o un <description>. Può anche esserci l'elemento <link>. Esattamente i tre elementi di <channel> ma che questa volta fanno riferimento ad un feed.

Un feed potrebbe contenere il riassunto del contenuto, nel qual caso potremo utilizzare il <title> per il titolo, <description> per un riassunto e <link> per rimandare al contenuto completo sul sito. Ma il feed potrebbe esporre tutto il contenuto, nel qual caso potremmo utilizzare solo l'elemento <description>. O ancora potremmo esporre un elenco di titoli, come un indice, e mettere a disposizione il link al sito (elementi <title> e <link>).

Il nostro esempio si arricchisce come segue:

<rss version="2.0">
    <channel>
        <title>Frutto Digitale</title>
        <description>
            Il mio personale laboratorio PHP in cui metto in opera gli script
            illustrati nel mio blog.
        </description>
        <link>http://fruttodigitale.altervista.org</link>
        <item>
            <title>Generatore dinamico di Feed RSS</title>
            <description>
                Lo script php che è possibile lanciare da questa pagina
                mostra come generare facilmente dei feed RSS in modo
                dinamico. Come sempre è possibile dare un'occhiata ai file
                sorgenti.
            </description>
            <link>http://fruttodigitale.altervista.org/phprss.html</link>
        </item>
    </channel>
</rss>



Esiste un elemento facoltativo, ma molto utile, che permette di evitare che un contenuto sia duplicato nel reader dell'utente. E' <guid> che, quando presente, permette ai reader di capire, senza ombra di dubbio, se un feed è già stato scaricato oppure no. Se non presente i reader si affidano all'analisi degli altri campi, ma esiste la possibilità che un feed inizi a duplicarsi nel reader dell'utente ogni volta che il reader aggiorna i feed.

L'elemento <guid> può contenere un link alla notizia se tale link è univoco. Ad esempio se il nostro motore di blog o cms permette di recuperare il così detto PermaLink. In alternativa è possibile inserire un identificativo che individua il contenuto, specificando con l'attributo isPermaLink="false" che il contenuto di <guid> non è un url. Ad esempio se tutti i contenuti provengono da una tabella del DB, di certo avremo un id univoco per il record che potremo utilizzare come contenuto di <guid>. Occorre però tener presente che se l'id è certamente univoco localmente, sarebbe opportuno che lo sia globalmente. Una soluzione potrebbe essere farlo precedere nome del sito o comunque creare dei guid basandosi su più elementi concatenati fra loro.

Ad esempio

    <guid>http://fruttodigitale.altervista.org/phprss.html</guid>

Oppure se non è un link

    <guid isPermaLink="false">fruttodigitale.altervista.org.2515</guid>

Il nostro file diventa

<rss version="2.0">
    <channel>
        <title>Frutto Digitale</title>
        <description>
            Il mio personale laboratorio PHP in cui metto in opera gli script
            illustrati nel mio blog.
        </description>
        <link>http://fruttodigitale.altervista.org</link>
        <item>
            <guid isPermaLink="false">
                fruttodigitale.altervista.org.2515
            </guid>
            <title>Generatore dinamico di Feed RSS</title>
            <description>
                Lo script php che è possibile lanciare da questa pagina
                mostra come generare facilmente dei feed RSS in modo
                dinamico. Come sempre è possibile dare un'occhiata ai file
                sorgenti.
            </description>
            <link>http://fruttodigitale.altervista.org/phprss.html</link>
        </item>
    </channel>
</rss>

Inserendo ulteriori elementi <item>, possiamo popolare di feed il nostro documento xml. Documento che passa la validazione W3C Feed a meno dell'assenza del link atom (consigliata per aumentare l'interoperabilità con un più ampio gruppo di reader di feed ... la questione è abbastanza controversa dato che atom non fa parte delle specifiche RSS 2.0).

Nota conclusiva ma molto importante e su cui spesso si cade in errore. L'elemento description  può contenere codice HTML. Attenzione però, perchè le parentesi angolare < e > indicano l'inizio e la fine di un tag xml. Per tale motivo non è possibile scrivere

    <description>
        Il testo che segue è enfatizzato: <em>Testo Enfatizzato</em>
    </description>


Ne inserire un maggiore o minore direttamente nel testo. Un cosa del genere causa un errore nella formattazione, perché la seconda < dovrebbe presentare la chiusura del tag description e non em. Tale errore rende inutilizzabile al reader il file. Per tal motivo, almeno le parentesi angolate del contenuto di description vanno sostituite con la relative entità html.

Versione corretta:

    <description>
        Il testo che segue è enfatizzato: &lt;em&gt;Testo Enfatizzato&lt;/em&gt;
    </description>


Al momento della visualizzazione da parte del reader, em sarà correttamente interpretato come tag HTML.
Nella seconda parte del tutorial vedremo come realizzare un semplice script per generare Feeds RSS.