Aller au contenu

Liste des événements de pipelines

SPIP 5.0 propose des classes d'événements dédiées pour les pipelines les plus courants. Une partie des classes du core se trouvent dans le répertoire ecrire/src/Framework/Pipeline/Event/.

Cette page est une référence : elle liste les events disponibles et leurs méthodes utiles. Pour migrer du code existant, consultez Migrer les pipelines. Pour les règles de déclaration des listeners, consultez Référence AsPipelineListener.

Table de correspondance

Pipeline historique Classe d'événement Description
affichage_final AffichageFinalEvent HTML final des pages publiques
affichage_final_prive AffichageFinalPriveEvent HTML final de l'espace privé
insert_head InsertHeadEvent Contenu <head> public (JS, meta)
insert_head_css InsertHeadCssEvent CSS dans <head> public
header_prive HeaderPriveEvent Contenu <head> privé (JS, meta)
header_prive_css HeaderPriveCssEvent CSS dans <head> privé
formulaire_charger FormulaireChargerEvent Chargement des formulaires CVT
formulaire_verifier FormulaireVerifierEvent Vérification des formulaires CVT
formulaire_traiter FormulaireTraiterEvent Traitement des formulaires CVT
styliser StyliserEvent Sélection du squelette
pre_liens PreLiensEvent Texte avant expansion des raccourcis de liens
recuperer_fond RecupererFondEvent Interception des inclusions
boite_infos BoiteInfosEvent Boîte d'infos objets (privé)
affiche_milieu AfficheMilieuEvent Zone centrale des pages objets
taches_generales_cron TachesGeneralesCronEvent Déclaration des tâches cron
post_insertion PostInsertionEvent Après insertion en base
pre_edition PreEditionEvent Avant modification d'un objet
post_edition PostEditionEvent Après modification d'un objet

Utilisation générique

Pour les pipelines ne disposant pas encore d'une classe dédiée, vous pouvez utiliser la classe générique SpipLeague\Bridge\Pipeline\PipelineEvent.

Dans ce cas, déclarez le listener avec un pipeline explicite :

use SpipLeague\Bridge\Pipeline\PipelineEvent;
use SpipLeague\Component\Kernel\Attribute\AsPipelineListener;

final class LegacyPipelineListener
{
    #[AsPipelineListener('mon_pipeline_legacy')]
    public function onMonPipelineLegacy(PipelineEvent $event): void
    {
        $data = $event->getSubject();
        $args = $event->getArguments();
        // ...
        $event->setSubject($data);
    }
}

PipelineEvent ne permet pas la déduction automatique du pipeline avec #[AsPipelineListener] sans argument.

Elle propose les méthodes suivantes :

  • getSubject() / setSubject() : pour manipuler les données principales (anciennement $flux['data'] ou $flux).
  • getArguments() / getArgument($key) : pour accéder au contexte (anciennement $flux['args']).

Détails de certains événements

Interface de base

interface PipelineEventInterface extends StoppableEventInterface
{
    public function getPipelineName(): string;
    public function getEventName(): string;
    public function getSubject(): mixed;
    public function setSubject(mixed $subject): void;
    public function getArguments(): array;
    public function getArgument(string $key, mixed $default = null): mixed;
    public function hasArgument(string $key): bool;
    public function isStructured(): bool;
    public function toPayload(): mixed;
}

Events disponibles

Affichage

AffichageFinalEvent

Pipeline affichage_final - Modification du HTML final avant envoi.

final class MyListener
{
    #[AsPipelineListener]
    public function onAffichageFinal(AffichageFinalEvent $event): void
    {
        // Méthodes typées et documentées
        $html = $event->getHtml();

        // Helpers pratiques
        $event->appendToBody('<script>...</script>');
        $event->appendToHead('<meta ...>');
        $event->replace('foo', 'bar');

        // Vérification du type de page
        if ($event->isHtmlPage()) {
            // ...
        }
    }
}

Header / CSS

InsertHeadEvent

Pipeline insert_head - Injection dans le <head> public.

final class AnalyticsListener
{
    #[AsPipelineListener]
    public function onInsertHead(InsertHeadEvent $event): void
    {
        $event->addScript('/plugins/analytics/tracker.js');
        $event->addModuleScript('/js/module.js');
        $event->addMeta('robots', 'index, follow');
        $event->addMetaProperty('og:title', 'Mon titre');
        $event->addLink('canonical', 'https://...');
        $event->addPreload('/fonts/main.woff2', 'font');
    }
}

InsertHeadCssEvent

Pipeline insert_head_css - Injection de CSS.

final class ThemeListener
{
    #[AsPipelineListener]
    public function onInsertHeadCss(InsertHeadCssEvent $event): void
    {
        $event->addStylesheet('/plugins/theme/dark-mode.css', 'screen');
        $event->addInlineStyle(':root { --primary: #007bff; }');
        $event->addPrintStylesheet('/print.css');
    }
}

HeaderPriveEvent

Pipeline header_prive - Injection dans le <head> de l'espace privé.

Formulaires CVT

FormulaireChargerEvent

Pipeline formulaire_charger - Valeurs par défaut.

final class DefaultsListener
{
    #[AsPipelineListener]
    public function onFormulaireCharger(FormulaireChargerEvent $event): void
    {
        if ($event->getFormName() !== 'inscription') {
            return;
        }

        $event->setValue('newsletter', true);
        $event->setValue('pays', 'FR');
        $event->mergeValues(['source' => 'web']);
    }
}

FormulaireVerifierEvent

Pipeline formulaire_verifier - Validation.

final class ValidationListener
{
    #[AsPipelineListener]
    public function onFormulaireVerifier(FormulaireVerifierEvent $event): void
    {
        if ($event->getFormName() !== 'inscription') {
            return;
        }

        $email = _request('email');
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $event->addError('email', _T('erreur_email_invalide'));
        }

        if ($event->hasErrors()) {
            $event->addGlobalError('Veuillez corriger les erreurs.');
        }
    }
}

FormulaireTraiterEvent

Pipeline formulaire_traiter - Post-traitement.

final class NotificationListener
{
    #[AsPipelineListener]
    public function onFormulaireTraiter(FormulaireTraiterEvent $event): void
    {
        if ($event->getFormName() !== 'contact') {
            return;
        }

        $this->sendNotification(_request('email'));

        $event->setSuccessMessage('Message envoyé !');
        $event->setRedirect(generer_url_ecrire('confirmation'));
    }
}

Édition d'objets

PreInsertionEvent

Pipeline pre_insertion - Avant insertion en base.

final class ArticleDefaultsListener
{
    #[AsPipelineListener]
    public function onPreInsertion(PreInsertionEvent $event): void
    {
        if ($event->getTable() !== 'spip_articles') {
            return;
        }

        if (!$event->hasField('lang')) {
            $event->setField('lang', $GLOBALS['meta']['langue_site']);
        }
    }
}

PostInsertionEvent

Pipeline post_insertion - Après insertion.

final class ArticleCreatedListener
{
    #[AsPipelineListener]
    public function onPostInsertion(PostInsertionEvent $event): void
    {
        if ($event->getTable() !== 'spip_articles') {
            return;
        }

        $id = $event->getInsertedId();
        $titre = $event->getField('titre');

        $this->notifyEditors($id, $titre);
    }
}

Squelettes

StyliserEvent

Pipeline styliser - Résolution des squelettes.

final class MobileTemplateListener
{
    #[AsPipelineListener]
    public function onStyliser(StyliserEvent $event): void
    {
        if (!$this->isMobile()) {
            return;
        }

        if ($event->getFond() === 'article' && !$event->hasSquelette()) {
            $event->setSquelette('squelettes/mobile/article.html');
        }
    }
}

Tables SQL

Ces événements sont définis dans ecrire/src/Framework/Pipeline/Event/ :

  • DeclarerTablesInterfacesEvent (declarer_tables_interfaces) — getInterfaces() / setInterfaces()
  • DeclarerTablesPrincipalesEvent (declarer_tables_principales) — getTables() / setTables() (préfixes sans préfixe spip_)
  • DeclarerTablesAuxiliairesEvent (declarer_tables_auxiliaires) — getTables() / setTables()

DeclarerTablesObjetsSqlEvent

Pipeline declarer_tables_objets_sql - Déclaration de tables.

final class ProductTableListener
{
    #[AsPipelineListener]
    public function onDeclarerTablesObjetsSql(DeclarerTablesObjetsSqlEvent $event): void
    {
        $event->declareTable('spip_products', [
            'type' => 'product',
            'principale' => 'oui',
            'field' => [
                'id_product' => 'bigint(21) NOT NULL',
                'titre' => 'text NOT NULL DEFAULT ""',
                'prix' => 'decimal(10,2) NOT NULL DEFAULT 0',
            ],
            'key' => ['PRIMARY KEY' => 'id_product'],
        ]);

        // Ou modifier une table existante
        $event->addField('spip_articles', 'featured', 'tinyint(1) DEFAULT 0');
        // Fusion de clés complémentaires (jointures editables, etc.)
        $event->modifyTable('spip_articles', ['tables_jointures' => ['documents']]);
        // Jointure héritée par toutes les tables d’objets (cf. compilateur `$infos_tables`)
        $event->addJoinForAllObjects('versions');
    }
}

Layout espace privé

AfficheGaucheEvent, AfficheMilieuEvent, AfficheDroiteEvent

final class StatsWidgetListener
{
    #[AsPipelineListener]
    public function onAfficheGauche(AfficheGaucheEvent $event): void
    {
        if ($event->getExec() !== 'accueil') {
            return;
        }

        $event->addBox('Statistiques', $this->renderStats(), 'stats-box');
        $event->appendHtml('<div>Custom content</div>');
    }
}