Générer un flux RSS avec CakePHP
Proposer un flux RSS est devenu une fonctionnalité incontournable sur la plupart des sites, et CakePHP simplifie grandement le processus de création de flux.
Partons d’un blog publiant des articles. Nous souhaitons créer un flux des articles récents, à la norme RSS version 2.0 et disponible via l’URL suivante : /articles/flux.rss.
1. Prise en compte de l’extension .rss dans le Router
Nous commençons par configurer le Router pour qu’il reconnaisse l’extension .rss. Nous ajoutons la route suivante dans le fichier {app}/config/routes.php :
1 2 | // {app}/config/routes.php Router::parseExtensions('rss'); |
Ainsi, CakePHP reconnaîtra les URL terminant par ‘.rss’ et appellera la bonne action.
2. Le Contrôleur
Nous allons maintenant créer l’action flux dans le Contrôleur des articles. Cette action récupère simplement la liste des 10 articles les plus récents classés par ordre de date de création décroissante.
Mise à jour du 12/04/08 : nous devons également configurer les informations générales qui seront affichées dans l’entête du flux (titre, description, langue, email du webmaster, etc.). Merci à foxmask qui a décelé que la déclaration de ces informations dans la Vue plutôt que dans le Contrôleur déclenchait la duplication de la balise <description>.
Pour en savoir plus sur les balises disponibles dans la norme RSS, nous renvoyons le lecteur vers cet article complet et clair : Spécifications du format RSS.
Nous commençons par inclure le composant RequestHandler, qui en complément de la configuration du Router vue plus haut, va permettre d’appeler l’action flux lorsque l’url /articles/flux.rss est demandée. C’est ce composant qui va changer automatiquement le layout par défaut pour permettre la sortie du flux au format défini par l’extension requise (rss, xml, etc.).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // {app}/controllers/articles_controller.php class ArticlesController extends AppController { var $components = array('RequestHandler'); function flux() { $articles = $this->Article->find( 'all', array( 'order' => 'created DESC', 'limit' => 10 ) ); $channel = array( 'title' => utf8_encode("Mon flux RSS"), 'description' => utf8_encode("Les derniers articles"), 'language' => 'fr', 'webMaster' => 'contact@monsite.com' ); $this->set(compact('articles', 'channel')); } } |
3. La Vue
Nous créons un nouveau fichier {app}/views/articles/rss/flux.ctp (notez le sous-répertoire rss dans le répertoire articles) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // {app}/views/articles/rss/flux.ctp <?php e($rss->items($articles, 'sortieRSS')); function sortieRSS($article) { return array( 'title' => utf8_encode($article['Article']['titre']), 'link' => 'http://www.monsite.com/articles/view/'.$article['Article']['id'], 'description' => utf8_encode($article['Article']['description']), 'pubDate' => $article['Article']['created'] ); } ?> |
Quelques explications :
3 | e($rss->items($articles, 'sortieRSS')); |
CakePHP a créé automatiquement un objet $rss, duquel nous appelons la méthode items(). Cette dernière prend en premier paramètre un tableau de données, ici les 10 articles trouvés dans l’action flux, et en deuxième paramètre le nom d’une fonction que nous construisons juste après, sortieRSS, qui sera appliquée sur chaque élément du tableau $articles.
5 6 7 8 9 10 11 12 13 | function sortieRSS($article) { return array( 'title' => utf8_encode($article['Article']['titre']), 'link' => 'http://www.monsite.com/articles/view/'.$article['Article']['id'], 'description' => utf8_encode($article['Article']['description']), 'pubDate' => $article['Article']['created'] ); } |
Le rôle de cette fonction est de formater les données passées en paramètre avec les balises à la norme RSS.
Nous utilisons la fonction PHP utf8_encode pour rendre les caractères accentués lisibles par tous les agrégateurs de flux.
4. Liens vers le flux RSS
4.1 Dans l’entête HTML
La plupart des navigateurs récents peuvent détecter la présence d’un lien vers un flux RSS dans l’entête HTML d’une page et affichent une petite icône orange à droite de la barre d’adresse (comme nous le voyons sur ce site même). Nous établissons ce lien particulier dans notre layout général, quelque part entre les balises <head>...</head> :
1 2 | // {app}/views/layouts/default.ctp e($html->meta('rss', array('controller' => 'articles', 'action' => 'flux.rss'), array('title' => "Les derniers articles"))); |
4.2 Dans un lien classique
N’importe quel autre lien vers le flux se fera de la façon suivante :
e($html->link("Flux RSS des articles récents", array('controller' => 'articles', 'action' => 'flux.rss')));
Pierre-Emmanuel Fringant
Article très sympa !
Il faut penser à faire un petit Configure::write(’debug’, 0); sinon l’affichage n’est pas correct en mode hors-production.
J’ai néenmoins un petit soucis : lorsque j’accède à mon flux, firefox me propose de le télécharger au lieu de l’afficher. Les données à l’intérieur sont correctes. Je suppose que c’est un problème de type mime ! Mais mêmeen faisant echo $rss->header(); dans la vue, ca ne fonctionne pas …
une idée ?
merci !
24 avril 2008 à 13:50
Auteur : Neveldo