This document is for a version of CakePHP that is no longer supported. Please upgrade to a newer release!
Le Helper RSS permet de générer facilement des XML pour les flux RSS.
Cet exemple suppose que vous ayez un Controller Posts et un Model Post déjà créés et que vous vouliez créer une vue alternative pour les flux RSS.
Créer une version xml/rss de posts/index est vraiment simple avec
CakePHP. Après quelques étapes faciles, vous pouvez tout simplement ajouter
l’extension .rss demandée à posts/index
pour en faire votre URL
posts/index.rss
. Avant d’aller plus loin en essayant d’initialiser et
de lancer notre service Web, nous avons besoin de faire un certain nombre
de choses. Premièrement, le parsing d’extensions doit être activé dans
app/config/routes.php
:
Router::parseExtensions('rss');
Dans l’appel ci-dessus, nous avons activé l’extension .rss. Quand vous
utilisez Router::parseExtensions()
, vous pouvez passer autant
d’arguments ou d’extensions que vous le souhaitez. Cela activera le
content-type de chaque extension utilisée dans votre application. Maintenant,
quand l’adresse posts/index.rss
est demandée, vous obtiendrez une version
XML de votre posts/index
. Cependant, nous avons d’abord besoin d’éditer
le controller pour y ajouter le code « rss-spécifique ».
C’est une bonne idée d’ajouter RequestHandler au tableau $components de votre controller Posts. Cela permettra à beaucoup d’automagie de se produire:
public $components = array('RequestHandler');
Notre vue utilise aussi TextHelper
pour le formatage, ainsi il
doit aussi être ajouté au controller:
public $helpers = array('Text');
Avant que nous puissions faire une version RSS de notre posts/index, nous
avons besoin de mettre certaines choses en ordre. Il pourrait être tentant
de mettre le canal des métadonnées dans l’action du controller et de le
passer à votre vue en utilisant la méthode Controller::set()
,
mais ceci est inapproprié. Cette information pourrait également aller dans
la vue. Cela arrivera sans doute plus tard, mais pour l’instant, si vous
avez un ensemble de logique différent entre les données utilisées pour créer
le flux RSS et les données pour la page HTML, vous pouvez utiliser la méthode
RequestHandler::isRss()
, sinon votre controller pourrait rester
le même:
// Modifie l'action du Controller Posts correspondant à
// l'action qui délivre le flux rss, laquelle est
// l'action index dans notre exemple
public function index() {
if ($this->RequestHandler->isRss() ) {
$posts = $this->Post->find(
'all',
array('limit' => 20, 'order' => 'Post.created DESC')
);
return $this->set(compact('posts'));
}
// ceci n'est pas une requête RSS
// donc on retourne les données utilisées par l'interface du site web
$this->paginate['Post'] = array(
'order' => 'Post.created DESC',
'limit' => 10
);
$posts = $this->paginate();
$this->set(compact('posts'));
}
Maintenant que toutes ces variables de Vue sont définies, nous avons besoin de créer un layout rss.
Un layout Rss est très simple, mettez les contenus suivants dans
app/View/Layouts/rss/default.ctp
:
if (!isset($documentData)) {
$documentData = array();
}
if (!isset($channelData)) {
$channelData = array();
}
if (!isset($channelData['title'])) {
$channelData['title'] = $this->fetch('title');
}
$channel = $this->Rss->channel(array(), $channelData, $this->fetch('content'));
echo $this->Rss->document($documentData, $channel);
Il ne ressemble pas à plus mais grâce à la puissance du RssHelper
il fait beaucoup pour améliorer le visuel pour nous. Nous n’avons pas défini
$documentData
ou $channelData
dans le controller, cependant dans
CakePHP vos vues peuvent retourner les variables au layout. Ce qui est
l’endroit où notre tableau $channelData
va venir définir toutes les
données meta pour notre flux.
Ensuite il y a le fichier de vue pour mes posts/index. Un peu comme le fichier
de layout que nous avons créé, nous avons besoin de créer un répertoire
View/Posts/rss/
et un nouveau index.ctp
à l’intérieur de ce répertoire.
Les contenus du fichier sont ci-dessous.
Notre vue, localisée dans app/View/Posts/rss/index.ctp
, commence par
définir les variables $documentData
et $channelData
pour le layout,
celles-ci contiennent toutes les metadonnées pour notre flux RSS. C’est fait
en utilisant la méthode View::set()
qui est analogue à la
méthode View::set()
. Ici nous passons les canaux de données en
retour au layout:
$this->set('channelData', array(
'title' => __("Most Recent Posts"),
'link' => $this->Html->url('/', true),
'description' => __("Most recent posts."),
'language' => 'en-us'));
La seconde partie de la vue génère les éléments pour les enregistrements
actuels du flux. Ceci est accompli en bouclant sur les données qui ont
été passées à la vue ($items) et en utilisant la méthode
RssHelper::item()
. L’autre méthode que vous pouvez utiliser
RssHelper::items()
qui prend un callback et un tableau des items
pour le flux. (La méthode que j’ai vu utilisée pour le callback a toujours
été appelée transformRss()
. Il y a un problème pour cette méthode, qui est
qu’elle n’utilise aucune des classes de helper pour préparer vos données à
l’intérieur de la méthode de callback parce que la portée à l’intérieur de la
méthode n’inclut pas tout ce qui n’est pas passé à l’intérieur, ainsi ne
donne pas accès au TimeHelper ou à tout autre helper dont vous auriez besoin.
RssHelper::item()
transforme le tableau associatif en un élément
pour chaque pair de valeur de clé.
Note
Vous devrez modifier la variable $postLink comme il se doit pour votre application.
foreach ($posts as $post) {
$postTime = strtotime($post['Post']['created']);
$postLink = array(
'controller' => 'posts',
'action' => 'view',
'year' => date('Y', $postTime),
'month' => date('m', $postTime),
'day' => date('d', $postTime),
$post['Post']['slug']
);
// Retire & échappe tout HTML pour être sûr que le contenu va être validé.
$bodyText = h(strip_tags($post['Post']['body']));
$bodyText = $this->Text->truncate($bodyText, 400, array(
'ending' => '...',
'exact' => true,
'html' => true,
));
echo $this->Rss->item(array(), array(
'title' => $post['Post']['title'],
'link' => $postLink,
'guid' => array('url' => $postLink, 'isPermaLink' => 'true'),
'description' => $bodyText,
'pubDate' => $post['Post']['created']
));
}
Vous pouvez voir ci-dessus que nous pouvons utiliser la boucle pour préparer
les données devant être transformées en éléments XML. Il est important de
filtrer tout texte de caractères non brute en-dehors de la description,
spécialement si vous utilisez un éditeur de texte riche pour le corps de votre
blog. Dans le code ci-dessus nous utilisons strip_tags()
et
h()
pour retirer/échapper tout caractère spécial XML du contenu,
puisqu’ils peuvent entraîner des erreurs de validation. Une fois que nous avons
défini les données pour le feed, nous pouvons ensuite utiliser la méthode
RssHelper::item()
pour créer le XML dans le format RSS. Une fois
que vous avez toutes ces configurations, vous pouvez tester votre feed RSS
en allant à votre /posts/index.rss
et que vous verrez votre nouveau feed.
Il est toujours important que vous validiez votre feed RSS avant de le mettre
en live. Ceci peut être fait en visitant les sites qui valident le XML comme
Le Validateur de Feed ou le site de w3c à https://validator.w3.org/feed/.
Note
Vous aurez besoin de définir la valeur de “debug” dans votre configuration du coeur à 1 ou à 0 pour obtenir un flux valide, à cause des différentes informations de debug ajoutées automatiquement sous des paramètres de debug plus haut qui cassent la syntaxe XML ou les règles de validation du flux.
Action courante
Base URL
donnée du model POSTée
Nom du champ courant
Helpers utilisés par le Helper RSS
URL de l’action courante
Nom du model courant
Paramètre tableau
Version de spec par défaut de la génération de RSS.
string
Retourne un élément RSS <channel />
.
string
Retourne un document RSS entouré de tags <rss />
.
string
Génère un élément XML.
string
Convertit un tableau en un élément <item />
et ses contenus.
string
Transforme un tableau de données en utilisant un callback optionnel, et le
map pour un ensemble de tags <item />
.
string
Convertit un time de tout format en time de RSS. Regardez
TimeHelper::toRSS()
.