Plugins

Présentation

Le système de plugins de Fatplant permet d’étendre les fonctionnalités du CMS sans modifier son code source. Un plugin peut ajouter de nouveaux modules au page builder, enregistrer de nouveaux types de contenu, injecter du CSS, ou réagir aux événements du cycle de vie éditorial.

Les plugins sont distribués sous forme de paquets autonomes et s’activent depuis l’administration.

Moteur de plugins

Le moteur de plugins repose sur un système de hooks — des points d’extension prédéfinis où le core de Fatplant appelle les plugins enregistrés. Un plugin s’abonne aux hooks qui l’intéressent et fournit une fonction de rappel.

Côté backend (Symfony)

Le backend expose des hooks via des événements Symfony. Un plugin peut écouter :

  • fatplant.article.preSave — avant la sauvegarde d’un article
  • fatplant.article.postPublish — après la publication d’un article
  • fatplant.media.postUpload — après l’upload d’un fichier
  • fatplant.api.response — pour modifier une réponse API

Côté frontend/admin (JavaScript)

L’administration et le frontend exposent des hooks JavaScript pour personnaliser le comportement :

  • builder.module.register — enregistrer un nouveau module de page builder
  • builder.module.render — surcharger le rendu d’un module existant
  • admin.sidebar.extend — ajouter des entrées dans le menu de navigation
  • frontend.head.extend — injecter des balises dans le <head> du frontend

Structure d’un plugin

mon-plugin/
├── plugin.json           # Manifeste du plugin
├── backend/
│   └── MonPlugin.php     # Point d'entrée PHP (Symfony Bundle)
├── admin/
│   └── index.js          # Scripts injectés dans l'admin
└── frontend/
    └── index.js          # Scripts injectés dans le frontend

plugin.json

{
  "name": "mon-plugin",
  "version": "1.0.0",
  "description": "Description de mon plugin",
  "author": "Votre nom",
  "hooks": [
    "fatplant.article.postPublish",
    "builder.module.register"
  ]
}

Écrire un plugin (conceptuel)

Exemple : notifier Slack à la publication d’un article

Ce plugin écoute l’événement fatplant.article.postPublish et envoie une notification à un webhook Slack.

// backend/MonPlugin.php (Symfony Event Subscriber)
<?php

namespace AppPluginSlackNotifier;

use FatplantEventArticlePublishedEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyContractsHttpClientHttpClientInterface;

class SlackNotifierPlugin implements EventSubscriberInterface
{
    public function __construct(
        private HttpClientInterface $http,
        private string $webhookUrl
    ) {}

    public static function getSubscribedEvents(): array
    {
        return [
            ArticlePublishedEvent::class => 'onArticlePublished',
        ];
    }

    public function onArticlePublished(ArticlePublishedEvent $event): void
    {
        $article = $event->getArticle();

        $this->http->request('POST', $this->webhookUrl, [
            'json' => [
                'text' => "Nouvel article publié : *{$article->getTitle()}*",
            ],
        ]);
    }
}

Exemple : enregistrer un module de page builder

// admin/index.js
import { registerModule } from '@fatplant/builder';

registerModule({
  type: 'countdown',
  label: 'Compte à rebours',
  icon: 'clock',
  defaultProps: {
    targetDate: '',
    label: 'Temps restant'
  },
  component: () => import('./CountdownModule.svelte')
});

Installer un plugin

# Copier le plugin dans le répertoire des plugins
cp -r mon-plugin/ /opt/fatplant/plugins/

# Activer depuis l'administration
# Paramètres > Plugins > Activer "mon-plugin"

Après activation, les hooks PHP sont enregistrés automatiquement via l’autoconfiguration Symfony. Les assets JavaScript sont compilés et injectés dans l’admin et le frontend.

Points d’attention

  • Un plugin mal écrit peut bloquer des événements critiques (sauvegarde, publication). Testez toujours vos plugins en environnement de développement avant de les activer en production.
  • Les plugins côté backend s’exécutent dans le même processus PHP que le backend — ils ont accès à tous les services Symfony (Entity Manager, Mailer, etc.).
  • Les plugins ne peuvent pas accéder directement à la base de données en dehors du contexte Symfony (pas de SQL brut).

Restez a la pointe de l'edition

Recevez les dernieres nouveautes, tutoriels et bonnes pratiques dans votre boite mail.

F
Fatplant

Le CMS open-source des redactions de presse en ligne. Du chemin de fer a la publication et au paywall : journaux, magazines et plateformes editoriales, self-hosted et sans vendor lock-in.

Open Source RGPD MIT License
Pourquoi « Fatplant » ?

« Fatplant », c'est « Flat Plan » qui a un peu bougé. Le flat plan — le chemin de fer en jargon de presse — c'est le plan page à page d'un journal avant impression : le squelette de l'édition, la pré-maquette en fil de fer. C'est exactement ce que dessine notre page builder. Un CMS qui part du chemin de fer ne pouvait pas s'appeler autrement. 🌱

© 2026 Fatplant SAS. Tous droits reserves.