giovedì 21 marzo 2013

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

Ora che abbiamo visto nella parte uno di questo tutorial cosa è, e cosa contiene un file XML utile ad essere interpretato dai Feeds RSS Reader, non resta che utilizzare PHP per produrre al volo tale semplice file di testo affichè possano essere diffusi i contenuti.

Per prima cosa occorre informare il browser web di predisporsi a ricevere non un file HTML, ma un file XML indicando altresì il charset utilizzato. Personalmente utilizzo sempre e per ogni elemento il charset UTF-8, ognuno si senta però libero di utilizzare il charset che ritiene più appropriato. Quindi  scriveremo:



<?php
header('Content-Type: text/xml; charset=utf-8');
?>


Se non lo facessimo, il browser si aspetterebbe un un file text/html e otterremmo un errore.

Fatto questo occorre recuperare i dati che si intende diffondere come ad esempio gli ultimi 5 post pubblicati su un nostro ipotetico sito web. Dovremo quindi accedere al DB, che nel nostro caso supponiamo essere MySQL. Recuperato il recordset  necessario, procediamo con la produzione del codice XML da inviare all'utente.

<?php
header('Content-Type: text/xml; charset=utf-8');

//Inizializzazione variabili 

$items = '';
$conn = new mysqli('localhost', 'fruttodigitale', '', 'my_fruttodigitale');

//Recupero informazioni dal DB

if(($result=$conn->query('select * from rss_test order by id desc limit 0,5'))!==false){    
    while($row = $result->fetch_assoc()){           
        //Per ogni record recuperato è creata una sezione
        //<item> del file xml finale
        $row['titolo'] = htmlspecialchars($row['titolo']); 
        //htmlspecialchars mi permette di converitre nelle
        //rispettive entità i caratteri <, > e &       
        $row['testo'] = htmlspecialchars($row['testo']);        
        $items .=<<<EOF
            <item>
               <guid>                   http://fruttodigitale.altervista.org/testRSS/index.php/postid/{$row['id']}
               </guid>
               <title>{$row['titolo']}</title>
               <description>
                   {$row['testo']}
               </description>                
            </item>
                
EOF;
    }    
}
?>


Ora che la variabile $item è stata riempita con tutte i nodi <item> che compongo il nostro fedd RSS, non resta che completare l'output con la parte fissa del documento xml che intendiamo produrre, in cui integreremo gli item appena prodotti.

<?php
header('Content-Type: text/xml; charset=utf-8');

$items = '';
$conn = new mysqli('localhost', 'fruttodigitale', '', 'my_fruttodigitale');
if(($result=$conn->query('select * from rss_test order by id desc limit 0,5'))!==false){  
    while($row = $result->fetch_assoc()){        
        $row['titolo'] = htmlspecialchars($row['titolo']);      
        $row['testo'] = htmlspecialchars($row['testo']);      
        $items .=<<<EOF
            <item>
               <guid>                   http://fruttodigitale.altervista.org/testRSS/index.php/postid/{$row['id']}
               </guid>
               <title>{$row['titolo']}</title>
               <description>
                   {$row['testo']}
               </description>              
            </item>
             
EOF;
    }  
}
?>

<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>
        <?php echo $items; ?>
    </channel>
</rss> 


Questo documento. salvato con nome rss.php è lo script che ci permette di produrre al volo il feed RSS. In questo esempio, a differenza di quanto esposto nel post precedente, è stato soppresso il nodo link perchè è stato utilizzato il nodo <guid> per fornire un permalink ovvero un link univoco all'articolo del feed, utilizzato dai feed Reader al posto del nodo <link>.

Questo è solo un esempio di base per far capire che:
  • un feed RSS non è altro che un file di testo producibile con PHP come si fa per le pagine HTML
  • è fondamentale informare il browser a predisporsi alla ricezione di un file xml, con l'utilizzo dell'istruzione header(), altrimenti otterremo un errore
  • i contenuti dei nodi devono essere elaborati in modo da sostituire almeno < e > con le rispettive entità
Un esempio funzionante con possibilità di visualizzare il codice è disponibile al link http://fruttodigitale.altervista.org/testRSS/.