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, avec votre propre namespace (ex. : MySite\Generator, le namespace Cecil\ étant réservé). 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/MySite/Generator/Posts.php
<?php
namespace MySite\Generator;
use Cecil\Collection\Page\Page;
use Cecil\Collection\Page\Type;
use Cecil\Generator\AbstractGenerator;
use Cecil\Generator\GeneratorInterface;
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, indexée par un nom, avec sa priorité :
pages:
generators:
Posts: { class: MySite\Generator\Posts, priority: 35 }
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.