Terug naar hoofdinhoud

Plugins in Joomla

04 juni 2026

Plugins zijn de onzichtbare werkers van Joomla. Het zijn stukjes code die reageren op gebeurtenissen en op de achtergrond worden uitgevoerd om gedrag te veranderen in plaats van een pagina op te bouwen. Een plugin heeft geen URL, geen modulepositie en vaak zelfs helemaal geen zichtbare uitvoer.

Toch zijn plugins de manier waarop vrijwel alles in Joomla kan worden uitgebreid zonder ook maar één regel core-code aan te passen.

Hoe Joomla reageert op gebeurtenissen en zichzelf uitbreidt zonder de core aan te raken.

In dit artikel lees je hoe Joomla-plugins echt werken. We beginnen bij de basis voor website-eigenaren en beheerders en gaan daarna verder met de technische details voor ontwikkelaars. Je leert wat een plugin is, hoe Joomla deze activeert, hoe een moderne plugin is opgebouwd en hoe je de meest voorkomende fouten voorkomt.

De belangrijkste gedachte om mee te nemen is deze: een plugin is een luisteraar. Hij wacht tot er iets gebeurt en reageert vervolgens. Begrijp je hoe één plugin zich abonneert op één event, dan begrijp je hoe vrijwel alle uitbreidbaarheid van Joomla werkt.

1. De basis

1.1 Wat is een plugin?

Een plugin is één van de vijf extensietypen van Joomla. Waar een component de pagina opbouwt en modules deze aanvullen, reageert een plugin op gebeurtenissen die plaatsvinden.

Je kunt het zo zien:

  • Een component beantwoordt de vraag: "Waar gaat deze pagina over?"
  • Een module beantwoordt: "Wat wordt er daarnaast nog weergegeven?"
  • Een plugin beantwoordt: "Wat moet er gebeuren wanneer X plaatsvindt?"

Een plugin heeft geen eigen URL en wordt niet op een pagina geplaatst. Hij wacht tot een event wordt geactiveerd en voert dan zijn code uit. De code die het event activeert, weet niet welke plugins er eventueel luisteren.

1.2 De plaats van plugins binnen de extensiefamilie

Om te begrijpen wat een plugin is, helpt het om hem naast de andere extensietypen te zetten. Joomla kent vijf extensietypen:

TypeRolPer paginaPrefix
Component Hoofdinhoud / applicatie van de pagina precies 1 com_
Module Kleine blokken rondom de inhoud meerdere mod_
Plugin Eventgestuurd gedrag op de achtergrond meerdere plg_
Template Uiterlijk, stijl en pagina-indeling 1 site + 1 administrator tpl_
Taal Vertalingen 1 actief -

Als het component de motor is en modules het dashboard vormen, dan zijn plugins de sensoren en relais die overal in de machine zijn ingebouwd: onzichtbaar totdat hun trigger wordt geactiveerd.

1.3 Wat een plugin daadwerkelijk doet

Een plugin heeft geen vaste plaats op een pagina. In plaats daarvan haakt hij in op de levenscyclus van een verzoek. Hieronder zie je een vereenvoudigd overzicht van de momenten waarop plugins kunnen ingrijpen tijdens een normale paginaverzoek:

Browserverzoek
   |
   v
System-plugins worden uitgevoerd      ← onAfterInitialise, onAfterRoute ...
   v
Component wordt uitgevoerd (com_content bouwt een artikel)
   v
Content-plugins worden uitgevoerd     ← onContentPrepare verwerkt de inhoud
   v
System-plugins worden uitgevoerd      ← onBeforeRender, onAfterRender
   v
Pagina wordt naar de browser gestuurd

Bij elke stap "kondigt" Joomla aan wat het gaat doen. Elke plugin die naar dat event luistert, kan daarop reageren.

1.4 De naamgevingsconventie plg_

Elke plugin behoort tot een groep (een map) en heeft een element (zijn eigen naam):

plg_content_joomla
    |       |
    |       └── element  (de plugin zelf)
    └── group    (de groep waarop de plugin betrekking heeft)
  • De groep bepaalt waar de plugin zich bevindt en naar welke events deze doorgaans luistert.
  • Op de server staat een plugin in plugins/<group>/<element>/, bijvoorbeeld plugins/content/joomla/.

1.5 Plugingroepen die je waarschijnlijk al gebruikt

Open de map plugins/ en je ziet één map per groep. Elke groep bevat plugins met een vergelijkbaar doel:

GroepDoelVoorbeeld
system Wordt uitgevoerd bij (bijna) elk verzoek plg_system_cache, plg_system_sef
content Verwerkt of wijzigt artikelinhoud plg_content_joomla, plg_content_pagebreak
authentication Controleert gebruikersgegevens bij het inloggen plg_authentication_joomla
user Reageert op aanmaken, opslaan, inloggen en uitloggen van gebruikers plg_user_joomla
editors Levert de WYSIWYG-editor plg_editors_tinymce
editors-xtd Extra editor-knoppen (Artikel, Afbeelding) plg_editorsxtd_article
finder Indexering en zoeken voor Slim Zoeken plg_finder_content
fields Aangepaste veldtypen plg_fields_calendar
webservices Maakt de REST API van een component beschikbaar plg_webservices_content
task Geplande taken (vergelijkbaar met cronjobs) plg_task_checkfiles
multifactorauth Methoden voor tweefactorauthenticatie plg_multifactorauth_totp
quickicon Iconen en controles in het administrator-dashboard plg_quickicon_joomlaupdate

De groep is vooral bedoeld voor organisatie en overzicht. Technisch gezien kan een plugin naar vrijwel elk event luisteren, ongeacht in welke map hij zich bevindt.

Naar boven

2. Hoe plugins worden geactiveerd

2.1 Het publish/subscribe-model

Plugins werken via Joomla's event dispatcher. Er zijn twee partijen betrokken, die elkaar nooit rechtstreeks kennen:

  PUBLISHER                            SUBSCRIBER
  (core of een component)              (jouw plugin)

  dispatch('onContentPrepare')  ---->  onContentPrepare()
        |                                    |
        |  "er is iets gebeurd"              |  "ik handel dit af"
        └----------- los gekoppeld ----------┘
  • De publisher activeert een event op naam en gaat vervolgens verder.
  • Elke ingeschakelde plugin die zich op dat event heeft geabonneerd, wordt daarna uitgevoerd.
  • Geen van beide partijen weet welke andere partij erbij betrokken is. Dit heet losse koppeling (loose coupling).

Dit is misschien wel het belangrijkste ontwerpprincipe binnen Joomla. Zodra dit kwartje valt, wordt het hele extensiesysteem veel logischer.

2.2 Een event heeft een naam, gegevens en soms een resultaat

Wanneer een component een event activeert, geeft het gegevens mee. Een plugin kan deze gegevens lezen, aanpassen of zelfs de actie stoppen:

// Een component activeert een event en geeft gegevens mee:
$event = new BeforeSaveEvent('onContentBeforeSave', [
    'context' => 'com_content.article',
    'subject' => $article,        // gegevens die plugins mogen lezen of wijzigen
    'isNew'   => $isNew,
]);
$this->getDispatcher()->dispatch($event->getName(), $event);

// Een plugin kan de actie stoppen:
if ($somethingWrong) {
    $event->addError('Opslaan is niet toegestaan.');
    $event->stopPropagation();     // volgende plugins worden niet meer uitgevoerd
}

Een event bevat meestal de volgende onderdelen:

Een event bevat...Voorbeeld
Een naam onContentBeforeSave
Een context com_content.article, oftewel waarop het event betrekking heeft
Een subject / argumenten Het artikelobject of de formuliergegevens
Een manier om een resultaat terug te geven Gewijzigde tekst of false om de actie af te breken

2.3 De naam van een event verraadt het moment waarop het wordt uitgevoerd

Eventnamen zijn bewust leesbaar gemaakt. Het werkwoord in de naam vertelt je wanneer het event wordt geactiveerd:

onContentBeforeSave   ← vlak vóór de actie (je kunt deze nog annuleren)
onContentAfterSave    ← direct na de actie (de actie is al uitgevoerd)
onUserLogin           ← op het moment van inloggen
onAfterRoute          ← een controlepunt in de requestcyclus
Prefix / suffixBetekenis
on... Elke eventnaam begint met on
...Before... Wordt uitgevoerd vóór een actie, je kunt valideren of afbreken
...After... Wordt uitgevoerd ná een actie, bijvoorbeeld om te loggen of meldingen te versturen
onAfter... (system) Een vast punt in de levenscyclus van een verzoek
Naar boven

3. Systeemevents tijdens de levenscyclus

3.1 Events die bij vrijwel elk verzoek worden uitgevoerd

system-plugins zijn de krachtigste plugins, omdat ze op elke pagina worden uitgevoerd. Ze haken in op de levenscyclus van de applicatie:

onAfterInitialise   → applicatie gestart, sessie beschikbaar (cache, redirects en debug starten hier)
onAfterRoute        → URL vertaald naar option/view/id (goed moment om het verzoek aan te passen)
onAfterDispatch     → component heeft uitvoer gegenereerd, nog niet in het template geplaatst
onBeforeRender      → template staat op het punt te renderen (modules toevoegen, laatste wijzigingen)
onAfterRender       → volledige HTML opgebouwd (zoek/vervang-acties op HTML-niveau, bijvoorbeeld SEF)
onBeforeRespond     → response-object is klaar en wordt bijna verzonden

Opvallend veel Joomla-functionaliteit, zoals caching, SEF-URL's, de debugbalk, redirects en tweefactorauthenticatie, wordt geïmplementeerd via gewone system-plugins die naar deze events luisteren.

3.2 De klassieke content-events

content-plugins, en alle componenten die deze events ondersteunen, krijgen de volgende gebeurtenissen rond contentverwerking:

EventWordt uitgevoerd wanneerTypisch gebruik
onContentPrepare Vlak voordat tekst wordt weergegeven {shortcodes} vervangen, media insluiten
onContentBeforeSave / onContentAfterSave Rond het opslaan van een item Valideren, synchroniseren, meldingen versturen
onContentBeforeDelete / onContentAfterDelete Rond het verwijderen van een item Gerelateerde gegevens opruimen
onContentChangeState Publiceren, depubliceren of archiveren Caches bijwerken, notificaties versturen
onContentPrepareForm Tijdens het opbouwen van een formulier Extra velden toevoegen aan bestaande formulieren
onContentPrepareData Wanneer gegevens in een formulier worden geladen Aangepaste gegevens vooraf invullen

Omdat onContentPrepare wordt uitgevoerd op alle tekst met een context, kan één content-plugin invloed hebben op artikelen, contacten, categorieën en zelfs aangepaste HTML-modules.

Naar boven

4. Binnenin een plugin (de moderne structuur)

4.1 De mapstructuur van Joomla 4, 5 en 6

Sinds Joomla 4 zijn plugins opgebouwd met namespaces, PSR-4-autoloading en dependency injection, net als componenten:

plugins/content/example/
├── example.xml                 ← manifest (groep, element, bestanden, parameters)
├── services/
│   └── provider.php            ← DI-registratie (het entry point)
├── src/
│   └── Extension/
│       └── Example.php         ← de pluginklasse (de listener)
├── language/                   ← vertaalbestanden (.ini)
└── tmpl/ (optioneel)           ← layouts als de plugin HTML genereert

Net als bij componenten is services/provider.php tegenwoordig het entry point. Er wordt niet langer gewerkt met "magische" bestandsnamen die automatisch worden geladen.

4.2 services/provider.php, de plugin registreren

De provider registreert de plugin in de DI-container en geeft alle benodigde services door, zoals de databaseverbinding of de applicatie:

return new class () implements ServiceProviderInterface {
    public function register(Container $container): void
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $dispatcher = $container->get(DispatcherInterface::class);
                $plugin = new Example(
                    $dispatcher,
                    (array) PluginHelper::getPlugin('content', 'example')
                );
                $plugin->setApplication(Factory::getApplication());
                return $plugin;
            }
        );
    }
};

De container injecteert alle afhankelijkheden automatisch, waardoor de plugin eenvoudiger te testen is en niet afhankelijk wordt van globale variabelen.

4.3 De pluginklasse, twee stijlen

Klassieke stijl (nog steeds ondersteund): één publieke methode per event, met dezelfde naam als het event.

class Example extends CMSPlugin
{
    public function onContentPrepare($context, &$article, &$params, $page = 0)
    {
        $article->text = str_replace('{hello}', 'Hallo JUG!', $article->text);
    }
}

Moderne stijl (de voorkeursmethode in Joomla 5 en 6): implementeer SubscriberInterface en geef expliciet aan welke events worden afgehandeld.

class Example extends CMSPlugin implements SubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return ['onContentPrepare' => 'transformText'];
    }

    public function transformText(ContentPrepareEvent $event): void
    {
        $article = $event->getItem();
        $article->text = str_replace('{hello}', 'Hallo JUG!', $article->text);
    }
}

De methode getSubscribedEvents() maakt direct duidelijk welke events de plugin afhandelt. Joomla hoeft daardoor niet meer te raden op basis van methodenamen.

4.4 Eventgegevens lezen en aanpassen

In de moderne API werk je niet langer met &$reference-argumenten. In plaats daarvan gebruik je getypeerde eventobjecten met getters en setters:

public function transformText(ContentPrepareEvent $event): void
{
    $context = $event->getContext();   // 'com_content.article'
    $item    = $event->getItem();      // het artikelobject
    $params  = $event->getParams();    // Registry met parameters

    if ($context !== 'com_content.article') {
        return;                        // niet voor mij bedoeld
    }

    $item->text .= '<p>Toegevoegd door mijn plugin.</p>';
}

Joomla 6 verschuift steeds meer richting immutabele events. Lees gegevens via getters, wijzig ze via de methoden die het event aanbiedt en gebruik stopPropagation() om verdere verwerking te stoppen. Pas argumenten niet rechtstreeks aan.

Naar boven

5. Het manifest en de database

5.1 example.xml, het installatiemanifest

Het manifest beschrijft de plugin voor de installer: de groep, de bestanden en de beschikbare opties.

<extension type="plugin" group="content" method="upgrade">
    <name>plg_content_example</name>
    <version>1.0.0</version>
    <namespace path="src">Joomla\Plugin\Content\Example</namespace>

    <files>
        <folder plugin="example">services</folder>
        <folder>src</folder>
    </files>

    <config>
        <fields name="params">
            <fieldset name="basic">
                <field name="greeting" type="text" default="Hello"
                       label="PLG_CONTENT_EXAMPLE_GREETING_LABEL" />
            </fieldset>
        </fields>
    </config>
</extension>

Twee attributen zijn specifiek voor plugins:

  • group="content", bepaalt in welke plugingroep de plugin wordt geïnstalleerd.
  • plugin="example" op de map services, dit markeert de naam van het plugin-element.

5.2 Waar plugins worden geregistreerd

Net als elke andere extensie wordt een plugin opgeslagen als één record in de tabel #__extensions:

KolomVoor een plugin
type plugin
folder content (de groep, alleen voor plugins)
element example
enabled 1 / 0
ordering Uitvoervolgorde binnen de groep
params JSON met de opgeslagen pluginopties

De kolom folder onderscheidt plugins van andere extensietypen, omdat hier de plugingroep wordt opgeslagen.

5.3 Volgorde is belangrijk

Meerdere plugins kunnen luisteren naar hetzelfde event. Ze worden uitgevoerd volgens de waarde van ordering, die je kunt aanpassen door plugins in de lijst te verslepen:

onContentPrepare wordt uitgevoerd:

   1. plg_content_loadmodule     → verwerkt 
   2. plg_content_pagebreak      → verwerkt pagina-einden
   3. plg_content_emailcloak     → verbergt e-mailadressen
   4. plg_content_vote           → voegt de steminterface toe
  • Een eerdere plugin kan gegevens aanpassen die door de volgende plugin worden gebruikt.
  • Een eerdere plugin kan stopPropagation() aanroepen en daarmee alle volgende plugins blokkeren.

Problemen door een verkeerde uitvoervolgorde komen echt voor. Wanneer twee plugins dezelfde tekst proberen te wijzigen, bepaalt de volgorde welke plugin uiteindelijk wint.

Naar boven

6. Gespecialiseerde plugingroepen

6.1 Authentication en User, de inlogketen

Inloggen bestaat niet uit één stap, maar uit een kleine keten van events. Verschillende plugingroepen verzorgen verschillende onderdelen van dit proces:

Inlogformulier verzonden
   v
onUserAuthenticate     ← authenticatieplugins proberen de gebruiker te verifiëren
   |   (Joomla-database? LDAP? OAuth? eerste succesvolle verificatie wint)
   v
onUserAuthorisation    ← mag deze geverifieerde gebruiker daadwerkelijk naar binnen?
   v
onUserLogin / onUserAfterLogin   ← user-plugins reageren (sessie instellen, loggen)
GroepBelangrijkste eventsGebruikt voor
authentication onUserAuthenticate Wie ben je? (gebruikersgegevens controleren)
user onUserLogin, onUserAfterSave, onUserAfterDelete Reageren op gebeurtenissen rond gebruikersaccounts
multifactorauth onUserMultifactorAuthenticate TOTP, WebAuthn en vergelijkbare methoden

Zo kunnen single sign-on, sociale login en tweefactorauthenticatie worden toegevoegd zonder dat com_users hoeft te worden aangepast.

6.2 Editors, Fields en Web Services

GroepWat levert het?Wordt gebruikt door
editors De WYSIWYG-editor zelf Het formulier- of editorveld
editors-xtd Knoppen onder de editor (Artikel, Afbeelding, Module) De werkbalk van de editor
fields Een nieuw type aangepast veld com_fields
webservices Registreert de REST API-routes van een component De API-applicatie
// Een webservices-plugin koppelt API-routes aan de API-controllers van een component:
public function onBeforeApiRoute(&$router)
{
    $router->createCRUDRoutes('v1/content/articles', 'articles', ['component' => 'com_content']);
}

Het inschakelen van Web Services - Content betekent letterlijk dat je een plugin inschakelt. Daarmee wordt het endpoint /api/index.php/v1/content/articles beschikbaar gemaakt.

6.3 Task-plugins, Joomla's cron-systeem

Het component Scheduled Tasks (com_scheduler) wordt volledig aangedreven door plugins uit de groep task:

Een trigger (webcron / CLI / lazy)
   v
onExecuteScheduledTask
   v
De bijbehorende task-plugin voert zijn taak uit
   (oude logs verwijderen, sessies opschonen,
    een feed ophalen, een samenvatting versturen ...)
  • Elke task-plugin definieert zijn beschikbare taken via getSubscribedEvents().
  • Dit is de moderne, via de interface beheerde vervanger van handmatig geschreven cronjobs.

Een task-plugin is in feite "gewoon een plugin" die wordt gestart door de scheduler in plaats van door een paginaverzoek.

Naar boven

7. Werken met plugins

7.1 Hoe je een plugin analyseert

Wanneer je een onbekende plugin onderzoekt, lees dan de bestanden in deze volgorde:

  1. *.xml-manifest, groep, element, parameters en bestanden.
  2. services/provider.php, het entry point.
  3. src/Extension/*.php, de klasse en de methode getSubscribedEvents().
  4. De eventmethoden, wat er gebeurt wanneer elk event wordt geactiveerd.
  5. tmpl/ (indien aanwezig), eventuele HTML-uitvoer.

Begin altijd bij getSubscribedEvents(). Dat is de inhoudsopgave van alles wat de plugin daadwerkelijk doet.

7.2 Inschakelen, volgorde bepalen en configureren

Je beheert dit allemaal via System → Manage → Plugins:

ActieEffect
Inschakelen / uitschakelen Past de waarde van enabled aan. Uitgeschakelde plugins worden nooit uitgevoerd
Verslepen voor volgorde Past de waarde van ordering binnen de groep aan
Openen → Opties Bewerkt de JSON-inhoud van params voor die plugin
Filteren op groep Toont bijvoorbeeld alle content-, system- of user-plugins

Een uitgeschakelde plugin is volledig onzichtbaar voor de event dispatcher. Events bereiken de plugin simpelweg niet.

7.3 Zelf een plugin bouwen, het minimale uitgangspunt

Een eenvoudige werkende content-plugin heeft verrassend weinig bestanden nodig:

plg_content_hello/
├── hello.xml                                 ← manifest (group="content")
├── services/provider.php                     ← registreren in de DI-container
├── src/Extension/Hello.php                   ← implementeert SubscriberInterface
└── language/en-GB/plg_content_hello.ini
final class Hello extends CMSPlugin implements SubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return ['onContentPrepare' => 'onContentPrepare'];
    }

    public function onContentPrepare(ContentPrepareEvent $event): void
    {
        $item = $event->getItem();
        $item->text = str_replace('{hello}', 'Hallo, JUG!', $item->text);
    }
}

Vervolgens:

  1. Maak er een zipbestand van en installeer het via System → Install → Extensions.
  2. Schakel de plugin in via de pluginlijst.
  3. Plaats {hello} in een artikel en zie hoe dit wordt vervangen door Hallo, JUG!.

Tip: Kopieer een kleine standaardplugin zoals plg_content_emailcloak en hernoem daarna alles consequent. Dat is vaak de snelste manier om een correcte basisstructuur te krijgen.

Naar boven

8. Meer dan de basis

8.1 Plugins versus de alternatieven, kies het juiste gereedschap

Plugins zijn krachtig, maar niet altijd de juiste oplossing. Gebruik onderstaande tabel om te bepalen wat je nodig hebt:

Je wilt...Gebruik een...
De hoofdinhoud van een pagina genereren Component
Een herbruikbaar blok op een pagina tonen Module
Reageren op een gebeurtenis of gedrag op de hele site aanpassen Plugin
Extra gegevensvelden toevoegen aan items Aangepast veld (zelf een fields-plugin)
HTML-uitvoer aanpassen Template override

Als je antwoord is: "wanneer X gebeurt, moet Y gebeuren", dan is een plugin vrijwel altijd de juiste keuze.

8.2 Prestatie-overwegingen

Omdat system-plugins bij elk verzoek worden uitgevoerd, vormen ze een belangrijk aandachtspunt voor prestatie-optimalisatie:

AandachtspuntWat je moet doen
Vroegtijdig stoppen Controleer eerst de context en voorwaarden, gebruik daarna zo snel mogelijk return
Efficiënt abonneren Gebruik bij voorkeur getSubscribedEvents(), zodat ongebruikte events geen overhead veroorzaken
Vermijd zware initialisatie Voer geen databasequeries uit in onAfterInitialise tenzij dat echt nodig is
Cache resultaten Gebruik Joomla's cache voor dure berekeningen of opzoekacties
Let op het aantal plugins Tientallen actieve system-plugins tellen op, schakel uit wat je niet gebruikt

Eén slecht geschreven system-plugin kan de volledige website vertragen, omdat deze op elke pagina voor iedere bezoeker wordt uitgevoerd.

8.3 Plugins en gedeelde services

Plugins zorgen ervoor dat Joomla's gedeelde services uitbreidbaar blijven zonder onderlinge afhankelijkheden:

  • Aangepaste velden worden geleverd als fields-plugins. Elk veldtype is een afzonderlijke plugin.
  • Slim Zoeken indexeert inhoud via finder-plugins, één per inhoudsbron.
  • Categorieën activeren eveneens content-events zoals onContentPrepare en onContentBeforeSave, met de context com_content.categories. Daardoor kan dezelfde plugin zowel artikelen als categorieën uitbreiden.
if ($event->getContext() === 'com_content.categories') {
    // Dezezelfde plugin wordt ook uitgevoerd voor categoriebeschrijvingen.
}

De gedeelde categorieënservice is geen gesloten systeem. Ze activeert dezelfde events als artikelen, waardoor plugins categorieën automatisch kunnen uitbreiden.

Naar boven

9. Veelgemaakte fouten en valkuilen

De meeste pluginproblemen ontstaan door een klein aantal terugkerende fouten. Let vooral op de volgende punten:

  • Vergeten de plugin in te schakelen. Er gebeurt niets en meestal verschijnt er geen foutmelding. Controleer daarom altijd eerst de pluginlijst.
  • Niet stoppen bij een verkeerde context. Hierdoor wordt je code overal uitgevoerd, ook op plaatsen waarvoor deze nooit bedoeld was.
  • Zware verwerking binnen een system-event. Omdat deze events op elke pagina worden uitgevoerd, kan de hele website trager worden.
  • Verkeerde uitvoervolgorde. Een andere plugin overschrijft jouw wijzigingen omdat deze later wordt uitgevoerd.
  • Eventargumenten rechtstreeks aanpassen in Joomla 6. Gebruik in plaats daarvan getters, setters en stopPropagation().
  • HTML-uitvoer rechtstreeks in de klasse plaatsen in plaats van in een layoutbestand onder tmpl/.

Een eenvoudige gewoonte voorkomt de meeste problemen: luister naar één specifiek event, controleer eerst de context en stop direct wanneer het event niet voor jouw plugin bedoeld is.

Naar boven

10. Best practices

Als je maar een paar dingen uit dit artikel onthoudt, laat het dan deze zijn:

  • Een plugin is een eventlistener. Hij verandert gedrag, niet de pagina zelf.
  • Abonneer je op één specifiek event en controleer altijd eerst de context voordat je iets doet.
  • Stop zo vroeg mogelijk om system-plugins snel te houden.
  • Gebruik getSubscribedEvents() en getypeerde eventobjecten in moderne plugins.
  • Let op de uitvoervolgorde wanneer meerdere plugins dezelfde gegevens aanpassen.
  • Kies het juiste gereedschap: component voor inhoud, module voor blokken, plugin voor gedrag.
Naar boven

11. In het kort

WAT IS HET    Een eventlistener (verandert gedrag, niet de pagina)
NAAM          plg_<groep>_<element>  (bijv. plg_content_joomla)
OP SCHIJF     plugins/<groep>/<element>/
ENTRY POINT   services/provider.php
DE KLASSE     src/Extension/*.php  implementeert SubscriberInterface
ABONNEREN     getSubscribedEvents() retourneert ['onEvent' => 'methode']
OPGESLAGEN IN #__extensions  (type=plugin, folder=groep, ordering)
BEHEREN       System → Manage → Plugins
VOLGORDE      Verslepen in de lijst, bepaalt de uitvoervolgorde binnen de groep
AFBREKEN      $event->stopPropagation()
SNEL STOPPEN  if verkeerde context: return;
Naar boven

12. Samenvatting

Plugins vormen in Joomla de stille laag die alles met elkaar verbindt. Ze bouwen geen pagina's op en verschijnen niet op een vaste positie op het scherm. In plaats daarvan luisteren ze naar gebeurtenissen en reageren ze daarop, waardoor vrijwel elk onderdeel van Joomla kan worden uitgebreid zonder de core aan te passen.

Zodra je het publish/subscribe-model begrijpt, volgt de rest vanzelf:

  • System-plugins haken in op de levenscyclus van een verzoek en worden op elke pagina uitgevoerd.
  • Content-plugins verwerken en transformeren inhoud.
  • Gespecialiseerde groepen verzorgen authenticatie, gebruikersbeheer, editors, velden, webservices, geplande taken en tweefactorauthenticatie.
  • Moderne plugins zijn PSR-4-klassen met namespaces, geregistreerd via services/provider.php en opgebouwd rond SubscriberInterface en getypeerde events.

Wanneer je een nieuwe functionaliteit ontwikkelt, onverwacht gedrag onderzoekt of probeert te achterhalen waarom een website traag is, zijn plugins vaak de eerste plek om te kijken. Ze zijn klein, maar bepalen in hoge mate hoe het hele systeem zich gedraagt.

Heb je hulp nodig bij het bouwen van een eigen plugin, het opsporen van een problematische plugin of het optimaliseren van eventgestuurde code voor prestaties en veiligheid, dan begint het begrip van deze architectuur altijd bij dezelfde basis: events, listeners en een goede scheiding van verantwoordelijkheden.

Naar boven
Plugins in Joomla
Peter Martin

Joomla en Linux specialist voor snelle, veilige en schaalbare websites.