Créer un flux RSS avec CakePHP

Bien le bonjour !

Le suivi de ce tutoriel implique que vous utilisez déjà le framework CakePHP et que vous ayez un Controller Articles, une Table Articles et une Entity Article déjà créés et que vous voulez créer une vue alternative pour les flux RSS.
J'écris ces lignes suite à la réalisation de mon propre flux RSS disponible ici : https://frenchco.de/rss. Je vais expliquer ici comment reproduire ce flux.

Pour info je me suis d'abord basé sur le tuto de CakePHP mais celui-ci ne répondant pas exactement à mes besoins, j'explique mon alternative ici. Le tuto de CakePHP donne le code nécessaire pour créer un flux via un lien mondomaine.fr/posts/index.rss, ici je vais vous expliquer comment y accéder avec mondomaine.fr/rss.
J'utilise RssHelper qui est déprécié à partir de CakePHP 3.5.0 et sera supprimé dans 4.0.0 faites attention à votre version. Une mise à jour sera nécessaire lors du passage à Cake 4.

Créer une Route

Dans config/routes.php ajoutez la route que vous souhaitez.

Router::scope('/', function (RouteBuilder $routes) {
  $routes->connect('/', ['controller' => 'Articles', 'action' => 'list']);
  $routes->connect('/rss', ['controller' => 'Articles', 'action' => 'rss']);
});

Code du Controller

Dans src/Controller/ArticlesController.php j'ajoute mon action (fonction) rss.

public function rss() {
    $articles = $this->Articles->find()
      ->where(['published' => true])
      ->limit(20)
      ->order(['created'=>'DESC']);
    $this->set(compact('articles'));
    $this->render('/Articles/rss/index');
}

Dans cette fonction je récupère les 20 derniers articles qui sont publiés. N'oubliez pas de spécifier avec render() la vue rss que nous allons créer ensuite.

Code de la View

Dans src/Templete/Articles/rss/index.ctp

<?php
$this->layout = 'rss/default';

$this->set('channelData', [
    'title' => "Frenchcode, site d'information pour développeurs",
    'link' => $this->Url->build('/', true),
    'description' => "Derniers articles.",
    'language' => 'fr-fr'
]);

foreach ($articles as $article) {
    $created = strtotime($article->created);
    $link = "/article/".$article->slug;
    // Retire & échappe tout HTML pour être sûr que le contenu va être validé.
    $body = h(strip_tags($article->body));
    $body = $this->Text->truncate($body, 400, [
        'ending' => '...',
        'exact'  => true,
        'html'   => true,
    ]);

    echo  $this->Rss->item([], [
        'title' => $article->title,
        'link' => $link,
        'guid' => ['url' => $link, 'isPermaLink' => 'true'],
        'description' => $body,
        'pubDate' => $article->created
    ]);
}

N'oubliez pas de bien sélectionner la layout que nous allons créer ensuite. La suite du code crée le contenu de la page rss, elle se comprend facilement.
Vous devrez modifier la variable $link pour que le lien vers votre article corresponde à votre application.

Code de la Layout

Dans src/Template/Layout/rss/default.ctp

<?php
if (!isset($documentData)) {
    $documentData = [];
}
if (!isset($channelData)) {
    $channelData = [];
}
if (!isset($channelData['title'])) {
    $channelData['title'] = $this->fetch('title');
}
$channel = $this->Rss->channel([], $channelData, $this->fetch('content'));
echo $this->Rss->document($documentData, $channel);

Pour finir, comme c'est expliqué sur le site de CakePHP, pensez à faire vérifier la conformité de votre flux sur le validateur w3c.

Attention ! CakePHP précise : Vous aurez besoin de définir la valeur de “debug” dans votre configuration du cœur à false 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. (pour moi je n'ai pas eu de problème avec debug à true)

Vous pouvez maintenant partager votre nouveau lien mondomaine.fr/rss !

Merci d'avoir suivi cet article jusqu'au bout ! ❤️

Commentaires