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 articlefatplant.article.postPublish— après la publication d’un articlefatplant.media.postUpload— après l’upload d’un fichierfatplant.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 builderbuilder.module.render— surcharger le rendu d’un module existantadmin.sidebar.extend— ajouter des entrées dans le menu de navigationfrontend.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).