Sur cette page
Générer des pages à partir de fichiers de données
Les fichiers de données sont un moyen pratique de gérer du contenu structuré (membres d’une équipe, produits, événements, etc.) en dehors des pages, puis de l’afficher avec les templates.
Ajouter un fichier de données
Stockez vos fichiers dans le dossier data. Les formats pris en charge sont YAML, JSON, XML et CSV.
# data/team.yml
- name: Ada
role: Developer
- name: Grace
role: Designer
Afficher les données dans un template
Le fichier est disponible dans les templates via site.data.<nom du fichier>, par exemple layouts/team.html.twig :
{% extends 'page.html.twig' %}
{% block content %}
<h1>{{ page.title }}</h1>
<ul>
{% for member in site.data.team %}
<li>{{ member.name }}, {{ member.role }}</li>
{% endfor %}
</ul>
{% endblock %}
Les fichiers des sous-dossiers sont imbriqués : data/galleries/gallery-1.json est disponible via site.data.galleries['gallery-1'].
Créer la page
La page qui utilise ce template n’a besoin d’aucun contenu : déclarez-la comme page virtuelle dans cecil.yml :
pages:
virtual:
- path: team
title: Our team
layout: team
Vous pouvez aussi créer un fichier pages/team.md avec layout: team dans son front matter.
Générer une page par élément
Pour générer une page par entrée, créez un générateur de pages. Les données chargées depuis les fichiers de données sont disponibles via $this->builder->getData() :
<?php
// extensions/Cecil/Generator/Team.php
namespace Cecil\Generator;
use Cecil\Collection\Page\Page;
use Cecil\Collection\Page\Type;
use Cecil\Util\Slugifier;
class Team extends AbstractGenerator implements GeneratorInterface
{
public function generate(): void
{
$data = $this->builder->getData($this->config->getLanguageDefault());
foreach ($data['team'] ?? [] as $member) {
$slug = Slugifier::slugify($member['name']);
$page = (new Page("team/$slug"))
->setType(Type::PAGE->value)
->setPath("team/$slug")
->setSection('team')
->setBodyHtml('<p>' . htmlspecialchars($member['role']) . '</p>')
->setVariable('title', $member['name']);
$this->generatedPages->add($page);
}
}
}
Puis déclarez-le :
pages:
generators:
25: Cecil\Generator\Team