Logo de Cecil Cecil
Sur cette page

Créer un générateur de pages personnalisé

Un générateur de pages crée des pages sans fichier Markdown (par exemple à partir d’une API ou d’une base de données), ou modifie des pages existantes. Cecil utilise ses propres générateurs pour construire les sections, les taxonomies, la pagination, etc., et vous pouvez ajouter les vôtres.

Créer la classe du générateur

Ajoutez une classe PHP dans le répertoire extensions de votre site, dans le namespace Cecil\Generator. Elle étend AbstractGenerator, implémente GeneratorInterface et ajoute des pages à $this->generatedPages dans la méthode generate().

L’exemple suivant crée une page pour chaque élément renvoyé par une API JSON :

extensions/Cecil/Generator/Posts.php

<?php
namespace Cecil\Generator;

use Cecil\Collection\Page\Page;
use Cecil\Collection\Page\Type;

class Posts extends AbstractGenerator implements GeneratorInterface
{
    public function generate(): void
    {
        $posts = json_decode(file_get_contents('https://jsonplaceholder.typicode.com/posts'), true) ?? [];

        foreach ($posts as $post) {
            $page = (new Page("posts/{$post['id']}"))
                ->setType(Type::PAGE)
                ->setPath("posts/{$post['id']}")
                ->setSection('posts')
                ->setBodyHtml('<p>' . htmlspecialchars($post['body']) . '</p>')
                ->setVariable('title', $post['title']);
            $this->generatedPages->add($page);
        }
    }
}

Déclarer le générateur

Ajoutez le nom de la classe à la liste pages.generators dans cecil.yml, avec une priorité comme clé :

pages:
  generators:
    35: Cecil\Generator\Posts

Les générateurs sont exécutés par ordre de priorité croissant. Ceux fournis par Cecil utilisent les priorités 10 (DefaultPages) à 90 (Redirect) : avec 35, les pages sont créées avant les sections (40) et, grâce à setSection(), sont donc regroupées dans la section posts, comme les pages issues de fichiers Markdown.

Générer le site

php cecil.phar build

Les pages sont désormais disponibles aux adresses /posts/1/, /posts/2/, etc., rendues avec les templates page par défaut.