02-ce-que-je-construis/specs/telaria-cms.md

Telaria CMS

Telaria CMS est un module éditorial complémentaire, destiné à publier des pages de contexte (mentions légales, accessibilité, à propos, articles) sans concurrencer l'éditeur de documentation. Il s'intègre au back office existant, utilise le rendu Markdown Codexia et respecte les contraintes d'accès et d'accessibilité. Sources : Architecture, Markdown Codexia, Accessibilité UI.

Positionnement

  • FonctionnalitĂ© secondaire, au service du site et du contexte documentaire.
  • Aucune remise en cause de la vocation principale : Ă©diteur de documentation. Source : Architecture.

Objectifs

  • Ajouter des pages Ă©ditoriales rapides Ă  publier.
  • Garder un flux Symfony natif, sans bundle externe.
  • Centraliser l'administration dans le back office.
  • Appliquer les règles d'accessibilitĂ© et de qualitĂ© Codexia. Sources : QualitĂ©, AccessibilitĂ© UI.

Périmètre fonctionnel

  • Contenus au format Markdown, avec prĂ©visualisation.
  • Tags pour classement simple.
  • Publication contrĂ´lĂ©e (draft, published, archived).
  • Rendu via les contrĂ´leurs existants.
  • Images intĂ©grĂ©es, stockĂ©es hors public/.

Modèle de données (BDD)

Entités principales :

  • CmsContent : title, slug, excerpt, markdown, status, publishedAt, updatedAt, visibility, type, author.
  • CmsTag : name, slug.
  • CmsImage : filename, mime, size, width, height, checksum, owner, createdAt. Relations :
  • CmsContent ↔ CmsTag (ManyToMany).
  • CmsContent → CmsImage (OneToMany) si besoin de lier des images au contenu.

Stockage des images (dossier privé)

Chemin cible :

  • /<racine-projet>/media/cms (au mĂŞme niveau que /public).

Contraintes :

  • Dossier hors webroot, non exposĂ© par Apache.
  • Accès uniquement via un contrĂ´leur Symfony qui vĂ©rifie les droits. Source : HttpFoundation BinaryFileResponse.

Configuration recommandée :

CMS_MEDIA_DIR=%kernel.project_dir%/media/cms

Rendu Markdown

Le rendu suit le pipeline Codexia :

  1. Pré-traitement des directives internes.
  2. Parsing CommonMark + GFM.
  3. Post-traitement accessibilité.
  4. Sanitization finale. Source : Markdown Codexia, CommonMark Spec.

Prévisualisation Markdown

Endpoint back office :

  • POST /admin/cms/preview

Retour :

  • HTML sanitizĂ©, prĂŞt Ă  afficher dans le back office.

Rendu public

Route dédiée :

  • /page/{slug}.html

Rendu :

  • Le contrĂ´leur appelle un utilitaire CmsRenderer pour transformer le Markdown en HTML.
  • Le slug reste stable pour les pages lĂ©gales.

Intégration aux contrôleurs existants

Utilitaires :

  • CmsResolver : rĂ©cupĂ©ration du contenu par slug + vĂ©rification des droits.
  • CmsRenderer : rendu Markdown → HTML.

Usage :

  • Les contrĂ´leurs existants appellent CmsRenderer sans connaĂ®tre la persistance.

Administration back office

Onglet CMS :

  • CmsContentController : CRUD + publication.
  • CmsImageController : upload + gestion.
  • CmsTagController : administration des tags.

Formulaires :

  • Labels visibles, erreurs liĂ©es aux champs, navigation clavier. Source : AccessibilitĂ© UI.

Sécurité et rôles

Rôles ajoutés :

  • ROLE_CMS_ADMIN
  • ROLE_CMS_EDITOR
  • ROLE_CMS_REVIEWER

Contrôle d'accès :

  • Voter dĂ©diĂ© CmsContentVoter pour VIEW, EDIT, PUBLISH, DELETE.
  • Accès aux pages CMS soumis au système d'authentification existant. Source : Symfony Voters.

Images intégrées

Insertion dans le Markdown :

  • Syntaxe Markdown standard avec URL contrĂ´lĂ©e (/cms/media/{id}).
  • Le contrĂ´leur mĂ©dia vĂ©rifie les droits avant diffusion. Source : FileType Symfony.

Arborescence cible (exemple)

projet/
├── media/
│   └── cms/
├── public/
├── src/
│   ├── Controller/
│   │   ├── Admin/
│   │   │   ├── CmsContentController.php
│   │   │   ├── CmsImageController.php
│   │   │   └── CmsTagController.php
│   │   └── CmsPublicController.php
│   ├── Entity/
│   │   ├── CmsContent.php
│   │   ├── CmsImage.php
│   │   └── CmsTag.php
│   ├── Repository/
│   │   ├── CmsContentRepository.php
│   │   ├── CmsImageRepository.php
│   │   └── CmsTagRepository.php
│   └── Service/
│       ├── CmsRenderer.php
│       └── CmsResolver.php
└── templates/
    └── cms/

Liens internes


Implémentation

Aspect Localisation
Bundle principal tlr-symfony — entités cms_content, cms_tag, cms_image, cms_content_tag
Entités CmsContent, CmsTag, CmsImage dans tlr-symfony ; CmsContentSeo dans telaria-app (companion entity)
Controllers src/Controller/Admin/CmsContentController.php, CmsImageController.php, CmsTagController.php, CmsPublicController.php dans telaria-app
Services CmsRenderer.php, CmsResolver.php dans telaria-app
Stockage médias <racine>/media/cms/ (hors webroot) — accès via contrôleur Symfony
Route publique /page/{slug}.html
Config CMS_MEDIA_DIR=%kernel.project_dir%/media/cms

Historique des décisions

Version Date Décision
1.0 2026-06-14 Version initiale — première formalisation du versioning des specs.
— 2026-04-06 Architecture multi-site tlr-symfony retenue : entités CMS dans le bundle (cms_content, cms_tag, cms_image), companion entity CmsContentSeo dans l'app pour le SEO.

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #