Plugins in Joomla
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:
| Type | Rol | Per pagina | Prefix |
|---|---|---|---|
| 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>/, bijvoorbeeldplugins/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:
| Groep | Doel | Voorbeeld |
|---|---|---|
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 boven2. 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 / suffix | Betekenis |
|---|---|
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 |
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:
| Event | Wordt uitgevoerd wanneer | Typisch 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.
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.
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 mapservices, 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:
| Kolom | Voor 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 boven6. 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)
| Groep | Belangrijkste events | Gebruikt 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
| Groep | Wat 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 boven7. Werken met plugins
7.1 Hoe je een plugin analyseert
Wanneer je een onbekende plugin onderzoekt, lees dan de bestanden in deze volgorde:
*.xml-manifest, groep, element, parameters en bestanden.services/provider.php, het entry point.src/Extension/*.php, de klasse en de methodegetSubscribedEvents().- De eventmethoden, wat er gebeurt wanneer elk event wordt geactiveerd.
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:
| Actie | Effect |
|---|---|
| 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:
- Maak er een zipbestand van en installeer het via
System → Install → Extensions. - Schakel de plugin in via de pluginlijst.
- 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.
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:
| Aandachtspunt | Wat 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
onContentPrepareenonContentBeforeSave, met de contextcom_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 boven9. 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 boven10. 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.
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 boven12. 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.phpen opgebouwd rondSubscriberInterfaceen 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

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


