
Extensies in Joomla
Een Joomla-site is niet één groot programma. Het is de Joomla-core plus een verzameling extensies. Een extensie is de overkoepelende term voor alles wat je aan Joomla kunt toevoegen: componenten, modules, plugins, templates, talen en de verpakkingen die deze samen bundelen.
Dit is het idee dat de vijf extensietypen die je waarschijnlijk al kent met elkaar verbindt. Het zijn geen vijf losse onderdelen. Het zijn allemaal soorten extensies en ze volgen dezelfde regels: een manifestbestand dat ze beschrijft, een record in één databasetabel waarin ze worden opgeslagen en één installer die ze installeert en up-to-date houdt.
Componenten, modules, plugins, templates, talen en de techniek daaronder: het manifest, de installer en die ene tabel waarin ze allemaal worden geregistreerd.
In dit artikel lees je hoe extensies echt werken. Het behandelt de basis voor website-eigenaren, de praktische beheerschermen voor beheerders en de technische details voor ontwikkelaars. Je leert wat een extensie is, hoe Joomla deze opslaat, wat het manifest doet, hoe installeren en updaten werken en hoe je je extensies veilig houdt.
Het doel is simpel: je Joomla-extensies goed genoeg leren begrijpen zodat je ze met vertrouwen kunt installeren, updaten en problemen kunt oplossen.
1. De basis
1.1 Wat "extensie" eigenlijk betekent
Bijna alles in de Joomla-backend is een extensie, en dat geldt ook voor de meeste dingen die je van buitenaf installeert. Een simpele test werkt meestal prima:
Als je het kunt installeren, inschakelen of verwijderen, dan is het een extensie.
Joomla is het platform. Extensies zijn alles wat je eraan toevoegt. De core CMS levert het framework, de applicatie en de gedeelde bibliotheken. Elke functionele functie op een pagina wordt geleverd door een extensie die door de installer wordt beheerd.
+--------------------------------------+
| JOOMLA CORE (CMS) |
| framework . applicatie . bibliotheken|
+--------------------------------------+
^
geïnstalleerd & beheerd | via één proces
|
+----------+----------+----+-----+-----------+-----------+
| Component| Module | Plugin | Template | Taal | ...packages
| com_ | mod_ | plg_ | tpl_ | xx-XX | pkg_, lib_, file
+----------+----------+----------+-----------+-----------+
1.2 De vijf functionele typen
Deze vijf zijn de extensietypen die daadwerkelijk iets zichtbaar maken op een pagina. Waarschijnlijk ben je ze allemaal al eens tegengekomen:
| Type | Rol | Per pagina | Prefix |
|---|---|---|---|
| Component | Hoofdinhoud of 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 admin | tpl_ |
| Taal | Vertalingen | 1 actief | xx-XX |
Maar de extensiefamilie is groter dan deze vijf. De rest draait om verpakking en ondersteuning.
1.3 De volledige taxonomie
De Joomla-installer herkent meer type-waarden dan alleen de zichtbare vijf. De extra typen zijn de "lijm" waarmee je code kunt verspreiden en hergebruiken:
| Type | Prefix | Wat het is |
|---|---|---|
component |
com_ |
Een mini-applicatie, de motor van de pagina |
module |
mod_ |
Een herbruikbaar blok op een pagina |
plugin |
plg_ |
Een event listener |
template |
tpl_ |
Pagina-uiterlijk en lay-out |
language |
xx-XX |
Een taalpakket |
package |
pkg_ |
Een bundel van meerdere extensies die samen worden geïnstalleerd |
library |
lib_ |
Gedeelde PHP-code die door andere extensies wordt gebruikt |
file |
- | Losse bestanden die in specifieke mappen worden geplaatst (bijvoorbeeld de core "Joomla! Files") |
Een praktijkvoorbeeld zoals een forum of webshop wordt meestal geleverd als één pkg_-pakket dat een component, meerdere plugins en enkele modules bevat.
1.4 Je gebruikt al tientallen extensies
Een splinternieuwe Joomla 6-installatie bevat standaard ongeveer 150 extensies. Open System → Manage → Extensions en je ziet ze allemaal: componenten zoals com_content, alle core plugins, beide standaardtemplates, het Engelse taalpakket en de onderliggende bibliotheken.
Er bestaat geen harde scheiding tussen "core" en "extensies". Joomla Core wordt juist geleverd als extensies. Ze zijn simpelweg gemarkeerd als protected, zodat je ze niet per ongeluk kunt verwijderen.
Boven op deze standaardset biedt de Joomla Extensions Directory (JED) duizenden extensies van derden die je kunt installeren. Bekende voorbeelden zijn Akeeba Backup voor back-ups, de contenttools van Regular Labs en JCE voor een uitgebreidere editor.
Naar boven2. De tabel #__extensions
2.1 Eén tabel registreert elke extensie
Ongeacht het type wordt elke geïnstalleerde extensie opgeslagen als precies één record in de tabel #__extensions. Deze ene tabel vormt het register van je volledige website. De #__ is Joomla's tijdelijke aanduiding voor het tabelprefix. Op een echte site kan dit bijvoorbeeld jos_extensions zijn.
| Kolom | Betekenis |
|---|---|
extension_id |
Primaire sleutel |
name |
Interne naam (com_content, plg_content_joomla) |
type |
component / module / plugin / template / language / package / library / file |
element |
De elementnaam (com_content, joomla, protostar) |
folder |
Alleen voor plugins, de plugingroep (content, system...) |
client_id |
0 = site, 1 = administrator |
enabled |
1 / 0 |
access |
Toegangsniveau voor weergave |
protected |
1 = kan niet worden verwijderd (core) |
locked |
1 = kan niet worden uitgeschakeld of aangepast |
manifest_cache |
JSON-snapshot van het manifest (versie, auteur...) |
params |
JSON met de opgeslagen opties van de extensie |
2.2 Wat een extensie uniek maakt
Geen enkele kolom identificeert een extensie op zichzelf. Het is een combinatie van vier kolommen:
type + element + folder + client_id = één unieke extensie
Een paar praktijkvoorbeelden laten zien waarom alle vier nodig zijn:
component | com_content | (geen) | 1 → de beheerapplicatie voor artikelen
module | mod_menu | (geen) | 0 → de sitemenu-module
module | mod_menu | (geen) | 1 → de beheermenu-module (zelfde element, andere client)
plugin | joomla | content | 0 → plg_content_joomla
plugin | joomla | user | 0 → plg_user_joomla (zelfde element, andere folder)
Daarom hebben plugins een folder (hun groep) en kan hetzelfde module-element twee keer bestaan: één keer voor de website en één keer voor het beheergedeelte.
2.3 manifest_cache en params
Twee JSON-kolommen doen een groot deel van het werk:
manifest_cachebevat een gecachte kopie van de metadata uit het manifest: versie, auteur, aanmaakdatum en beschrijving. De lijst in Beheren leest deze gegevens uit de cache, zodat Joomla niet telkens opnieuw de XML hoeft te verwerken bij elke paginaweergave.paramsbevat de Opties van de extensie. De knop "Opties" van een component, de instellingen van een plugin en de parameters van een module worden hier allemaal als JSON opgeslagen.
Wanneer je bij een extensie op Opties klikt, bewerk je in feite de JSON in het veld params van deze rij. Er bestaat geen aparte configuratietabel.
3. Het manifest: het hart van elke extensie
3.1 Het zelfbeschrijvende XML-bestand
Elke extensie bevat één manifest: een XML-bestand dat Joomla alles over die extensie vertelt. De installer leest eerst dit bestand en niets anders. Geef Joomla een zipbestand met een manifest en het weet hoe de extensie moet worden geïnstalleerd, waar de bestanden moeten komen, welke databasetabellen moeten worden aangemaakt en hoe latere updates moeten worden uitgevoerd.
<extension type="component" method="upgrade">
<name>com_example</name>
<version>1.0.0</version>
<creationDate>2026-06-01</creationDate>
<author>Peter Martin</author>
<namespace path="src">Joomla\Component\Example</namespace>
<files folder="site">...</files> <!-- welke bestanden gekopieerd worden -->
<media destination="com_example">...</media> <!-- afbeeldingen, css, js -->
<languages>...</languages> <!-- vertaalbestanden -->
<install><sql>...</sql></install> <!-- uitvoeren bij installatie -->
<update><schemas>...</schemas></update> <!-- uitvoeren bij update -->
<uninstall><sql>...</sql></uninstall> <!-- uitvoeren bij verwijdering -->
<scriptfile>script.php</scriptfile> <!-- aangepaste installatielogica -->
<updateservers>...</updateservers> <!-- locatie van updates -->
<config>...</config> <!-- het Opties-formulier -->
</extension>
Eén bestand stuurt installatie, updates, verwijdering, configuratie en updatebeheer aan. Verander het attribuut type en dezelfde structuur beschrijft een module, plugin, template of package.
3.2 De attributen die alles bepalen
Een aantal attributen op het hoofdelement <extension> bepaalt hoe de installer zich gedraagt:
| Attribuut | Waarden | Effect |
|---|---|---|
type |
component, module, plugin, template, language, package, library, file |
Het type extensie, bepaalt waar bestanden worden geplaatst |
method |
install / upgrade |
upgrade overschrijft bestaande bestanden als de extensie al aanwezig is (de moderne standaard) |
group |
bijvoorbeeld content, system |
Alleen voor plugins, bepaalt in welke groep of map de plugin wordt geïnstalleerd |
client |
site / administrator |
Voor modules en templates, bepaalt bij welke applicatie ze horen |
method="upgrade" is de reden waarom het opnieuw installeren van hetzelfde zipbestand een update uitvoert in plaats van een foutmelding "already installed" te geven.
3.3 Het installatiescript: aangepaste logica
Voor alles wat niet kan worden uitgedrukt met de declaratieve tags van het manifest, kan een extensie een scriptbestand meeleveren met maximaal vijf methoden:
class com_exampleInstallerScript
{
public function preflight($type, $parent) { /* vóór het kopiëren van bestanden */ }
public function install($parent) { /* alleen bij nieuwe installatie */ }
public function update($parent) { /* alleen bij update */ }
public function uninstall($parent) { /* bij verwijdering */ }
public function postflight($type, $parent) { /* na het kopiëren van bestanden */ }
}
| Methode | Wordt uitgevoerd |
|---|---|
preflight |
Voor het kopiëren van bestanden, versiecontroles uitvoeren en installatie afbreken als niet aan de vereisten wordt voldaan |
install / update / uninstall |
Alleen tijdens de overeenkomstige actie |
postflight |
Na het kopiëren van bestanden, bijvoorbeeld voorbeelddata toevoegen, een welkomstbericht tonen of opschonen |
Gebruik preflight om een installatie te blokkeren op een niet-ondersteunde PHP- of Joomla-versie door false terug te geven.
3.4 Installer-events: plugins die reageren op installaties en updates
Het scriptbestand beïnvloedt alleen de eigen extensie. Maar de installer activeert ook events waarop elke ingeschakelde plugin kan reageren. Daardoor kan een plugin iets doen wanneer een andere extensie wordt geïnstalleerd, bijgewerkt of verwijderd.
| Event | Wordt geactiveerd wanneer |
|---|---|
onExtensionBeforeInstall / onExtensionAfterInstall |
Rondom de installatie van elke extensie |
onExtensionBeforeUpdate / onExtensionAfterUpdate |
Rondom het updaten van elke extensie |
onExtensionBeforeUninstall / onExtensionAfterUninstall |
Rondom het verwijderen van elke extensie |
onInstallerBeforePackageDownload |
Vlak voordat een pakket wordt gedownload, bijvoorbeeld om een downloadsleutel toe te voegen |
// Een plugin van een commerciële leverancier voegt een abonnementsleutel toe aan de download-URL:
public function onInstallerBeforePackageDownload(&$url, &$headers)
{
if (str_contains($url, 'example.org')) {
$url .= '&key=' . $this->params->get('download_key');
}
}
Dit is precies hoe betaalde extensies tijdens een update een download- of abonnementsleutel toevoegen: via een gewone installer-plugin die naar deze events luistert, zonder dat er iets hoeft te worden aangepast aan com_installer.
4. Extensies installeren
4.1 com_installer: het component voor installatie en updates
Alles wat in dit artikel wordt besproken, wordt beheerd door één core component: com_installer. Je vindt dit terug onder het menu System:
System
+-- Install → Extensions (nieuwe extensies toevoegen)
+-- Manage → Extensions (in- of uitschakelen, verwijderen, alle records bekijken)
+-- Update → Extensions (beschikbare updates)
+-- Manage → Database (databaseschema controleren en herstellen)
+-- Manage → Discover (bestanden vinden die al op de server staan)
+-- Manage → Warnings (problemen met de omgeving)
4.2 De vier manieren om te installeren
| Methode | Hoe | Wanneer |
|---|---|---|
| Upload Package File | Sleep een .zip-bestand naar het venster of selecteer het |
De standaardmethode, wanneer je het bestand hebt |
| Install from Folder | Geef een serverpad op naar een uitgepakte map | Voor grote extensies of bestanden die via FTP zijn geüpload |
| Install from URL | Plak een directe link naar een .zip-bestand |
Wanneer de leverancier een download-URL verstrekt |
| Install from Web | Blader door de JED binnen Joomla en installeer met één klik | Voor het ontdekken van extensies vanuit de directory zelf |
"Install from Web" communiceert met de Joomla Extensions Directory via de plugin Install from Web. Dit is de appstore-ervaring die rechtstreeks in de backend is ingebouwd.
4.3 Wat "installeren" daadwerkelijk doet
Wanneer je Joomla een zipbestand geeft, wordt altijd dezelfde reeks stappen uitgevoerd:
1. Uitpakken naar een tijdelijke map
2. Manifest zoeken en verwerken → type, bestanden, SQL en scriptfile uitlezen
3. preflight() uitvoeren → kan de installatie afbreken
4. Bestanden kopiëren → naar components/, modules/, plugins/, media/
5. Installatie-SQL uitvoeren → CREATE TABLE #__example...
6. De PSR-4 namespace registreren
7. Een record toevoegen aan #__extensions + manifest_cache
8. Updateservers registreren
9. postflight() uitvoeren → voorbeelddata, meldingen
10. Tijdelijke map opruimen
Als een van deze stappen mislukt, voert Joomla een rollback uit. Er blijft dus geen half geïnstalleerde extensie achter.
4.4 Discover: installeren wat al op de server staat
Soms komen bestanden op de server terecht zonder via de installer te gaan, bijvoorbeeld via FTP, een Git-checkout of een gekopieerde map. De bestanden bestaan dan wel op schijf, maar hebben geen record in #__extensions, waardoor Joomla ze negeert.
Manage → Discover → scant de standaardmappen op niet-geregistreerde manifesten
→ toont de resultaten → je klikt op Install → records worden aangemaakt
Discover vormt de brug tussen "bestanden op de server" en "een extensie die Joomla daadwerkelijk kent". Er worden geen bestanden gekopieerd, alleen de ontbrekende databaserecords worden aangemaakt.
4.5 Database: het schema synchroon houden
Het scherm Manage → Database vergelijkt de SQL-updatebestanden van elke extensie met de daadwerkelijke structuur van je database.
- Het detecteert tabellen of kolommen die na een update aanwezig zouden moeten zijn, maar ontbreken.
- Met de knop Fix worden ontbrekende schemawijzigingen alsnog uitgevoerd.
- Dit gebeurt vaak na een handmatige bestandsupdate waarbij de SQL niet is uitgevoerd, of na een onderbroken update.
Een rode melding "Database schema is out of date" betekent bijna altijd: ga naar dit scherm en klik op Fix.
4.6 #__schemas: het logboek van databaseversies
Hoe weet het Database-scherm eigenlijk dat een schema verouderd is? Het vergelijkt de SQL-updatebestanden van elke extensie met de geregistreerde versie in #__schemas.
#__schemas
+-- extension_id | version_id
+-- 27 (com_content) | 6.0.0
+-- 10000 (com_example) | 1.1.0
- De updatemap van een extensie bevat SQL-bestanden die zijn genoemd naar versienummers, bijvoorbeeld
sql/updates/mysql/1.1.0.sql. - Nadat deze zijn uitgevoerd, schrijft Joomla de hoogste toegepaste versie weg in
#__schemas. - Bij een volgende update worden alleen SQL-bestanden uitgevoerd die nieuwer zijn dan de opgeslagen versie. Dit wordt ook wel de migratie-"high-water mark" genoemd.
#__extensions.manifest_cache bevat dus de bestandsversie, terwijl #__schemas de databaseversie bevat. Wanneer die twee niet overeenkomen, verschijnt de waarschuwing "schema out of date" en zorgt de knop Fix ervoor dat de ontbrekende SQL alsnog wordt uitgevoerd.
5. Het updatesysteem
5.1 Updatesites: hoe Joomla weet dat er een update beschikbaar is
Elke extensie kan één of meer updatesites registreren: URL's die Joomla controleert met de vraag "is er een nieuwere versie beschikbaar?". Deze worden opgeslagen in #__update_sites en gekoppeld aan extensies via #__update_sites_extensions.
#__extensions --< #__update_sites_extensions >-- #__update_sites
(com_example) (https://.../update.xml)
De updatesite wordt opgegeven in het manifest:
<updateservers>
<server type="extension" name="Example Updates">
https://example.org/updates/com_example.xml
</server>
</updateservers>
Zonder updatesite kan Joomla nooit een update aanbieden voor die extensie. Daarom verschijnen sommige handmatig geïnstalleerde extensies nooit in het updateoverzicht.
5.2 De XML van de updateserver
De URL verwijst naar een XML-bestand dat door de leverancier wordt gehost. Er bestaan twee varianten:
| Type | Beschrijft | Gebruik |
|---|---|---|
extension |
Beschikbare versies van één extensie | Eén product |
collection |
Een lijst met update-manifesten van extensies | Een leverancier met meerdere producten |
Voorbeeld van een extensie-update-manifest
<updates>
<update>
<name>com_example</name>
<version>1.1.0</version>
<infourl>https://example.org/changelog</infourl>
<downloads>
<downloadurl type="full" format="zip">
https://example.org/dl/com_example-1.1.0.zip
</downloadurl>
</downloads>
<targetplatform name="joomla" version="6.[01]" />
<php_minimum>8.1</php_minimum>
</update>
</updates>
Voorbeeld van een collection update manifest
Een collection-manifest bevat verwijzingen naar één of meer extensie-update-manifesten. Elke extensie in de collectie heeft zijn eigen update-manifest.
<?xml version="1.0" encoding="utf-8"?>
<extensionset name="Example Extensions">
<extension>
<name>com_example</name>
<updateservers>
<server type="extension" priority="1" name="com_example">
https://example.org/updates/com_example.xml
</server>
</updateservers>
</extension>
<extension>
<name>com_another_example</name>
<updateservers>
<server type="extension" priority="1" name="com_another_example">
https://example.org/updates/com_another_example.xml
</server>
</updateservers>
</extension>
</extensionset>
Met de elementen targetplatform en php_minimum kan een leverancier vanuit dezelfde updatesite verschillende updatepakketten aanbieden voor specifieke Joomla- of PHP-versies.
5.3 Het updateproces
Cron / paginaweergave / "Controleren op updates"
|
v
Joomla haalt de XML van elke updatesite op
|
v
Vergelijkt de aangeboden <version> met de geïnstalleerde versie
|
v
Nieuwere versie? → record in #__updates → zichtbaar onder Update → Extensions
|
v
Je klikt op Update → Joomla downloadt het zipbestand uit <downloadurl>
|
v
...en voert exact hetzelfde installatieproces uit (method="upgrade")
Een update is in feite niets meer dan het installeren van een nieuwere zipversie over de bestaande installatie heen: hetzelfde manifest, dezelfde SQL-updatefase en dezelfde rollback-beveiliging.
5.4 Joomla! Update versus extensie-updates
Dit zijn twee verschillende systemen die vaak met elkaar worden verward:
| Joomla-update | Extensie-updates | |
|---|---|---|
| Component | com_joomlaupdate |
com_installer |
| Werkt bij | De Joomla-core zelf | Je geïnstalleerde extensies |
| Bron | De officiële updateserver van Joomla | De eigen updatesite van elke extensie |
| Locatie | System → Update → Joomla | System → Update → Extensions |
Houd beide up-to-date. Een moderne en volledig gepatchte Joomla-installatie met een verouderde, kwetsbare extensie blijft nog steeds een kwetsbare website.
Naar boven6. Packages: meerdere extensies bundelen
6.1 Waarom packages bestaan
De meeste echte producten bestaan uit meer dan één extensie. Een webshop heeft bijvoorbeeld een component (de winkel), plugins (betalingen, zoekfunctionaliteit) en modules (winkelwagen, uitgelichte producten) nodig. Acht losse zipbestanden verspreiden is onhandig, daarom worden ze samengevoegd in één pkg_-package.
pkg_shop.zip
+-- pkg_shop.xml <- het package-manifest
+-- com_shop.zip <- onderdeel: component
+-- plg_system_shop.zip <- onderdeel: plugin
+-- plg_search_shop.zip <- onderdeel: plugin
+-- mod_shop_cart.zip <- onderdeel: module
+-- mod_shop_featured.zip <- onderdeel: module
6.2 Het package-manifest
Een package-manifest bevat voornamelijk een lijst van de onderliggende extensies en de volgorde waarin deze moeten worden geïnstalleerd:
<extension type="package" method="upgrade">
<name>Shop Package</name>
<packagename>shop</packagename>
<version>2.0.0</version>
<files>
<file type="component" id="com_shop">com_shop.zip</file>
<file type="plugin" group="system" id="shop">plg_system_shop.zip</file>
<file type="module" client="site" id="mod_shop_cart">mod_shop_cart.zip</file>
</files>
</extension>
| Functie | Effect |
|---|---|
| Eén installatie | Installeert alle onderdelen in de opgegeven volgorde |
| Eén verwijdering | Verwijdert alle onderdelen in één keer |
| Eén updatesite | Werkt het volledige pakket tegelijk bij |
| Eigen record in #__extensions | type=package, het bovenliggende record |
Wanneer je het package verwijdert, worden de onderliggende extensies ook verwijderd. Een onderdeel dat in het manifest is gemarkeerd met <block> kan worden beschermd tegen afzonderlijke verwijdering.
7. Extensies beheren en beveiligen
7.1 Het scherm Beheren: je controlepaneel
System → Manage → Extensions toont alle records uit #__extensions:
| Actie | Effect |
|---|---|
| Inschakelen / uitschakelen | Past de waarde van enabled aan, uitgeschakelde extensies worden niet uitgevoerd |
| Verwijderen | Verwijdert bestanden, voert uninstall-SQL uit en verwijdert het record |
| Filteren | Op type, locatie (site of administrator) of status |
| Protected-badge | Core-extensie, kan niet worden verwijderd |
| Locked-badge | Kan niet worden uitgeschakeld of aangepast |
De velden protected en locked zorgen ervoor dat je je website niet per ongeluk onbruikbaar maakt, bijvoorbeeld door com_content uit te schakelen of de standaardtaal te verwijderen.
7.2 Het tabblad Waarschuwingen
Manage → Warnings toont omgevingsproblemen die door de installer zijn gedetecteerd, zoals ontbrekende PHP-extensies, mappen zonder schrijfrechten of achtergebleven bestanden van een mislukte installatie. Controleer dit scherm wanneer een installatie "geslaagd" lijkt, maar de extensie niet correct werkt.
7.3 Beveiliging: het onderdeel waar het vaak misgaat
Extensies draaien met volledige toegang tot je website. Een kwaadaardige of verlaten extensie is de meest voorkomende oorzaak van een gehackte Joomla-site.
| Aanpak | Waarom |
|---|---|
| Installeer alleen uit betrouwbare bronnen | Gebruik bij voorkeur de JED en vermijd "nulled" of illegale versies, omdat deze vaak malware bevatten |
| Houd alles up-to-date | De meeste hacks misbruiken bekende kwetsbaarheden waarvoor al een patch beschikbaar is |
| Controleer de JED VEL | De Vulnerable Extensions List publiceert bekende onveilige extensies |
| Verwijder wat je niet gebruikt | Uitschakelen is niet genoeg, verwijder ongebruikte extensies volledig. Minder code betekent minder risico |
| Controleer of de extensie wordt onderhouden | Een extensie die jarenlang geen update heeft gehad, vormt een risico |
| Werk volgens het principe van minimale rechten | Geef extensies en gebruikers niet meer ACL-rechten dan noodzakelijk |
De Joomla-core heeft een sterke reputatie op het gebied van beveiliging. De zwakke schakel is bijna altijd een extensie van een derde partij die niet is bijgewerkt.
7.4 Het juiste extensietype kiezen om te ontwikkelen
Wanneer je zelf Joomla wilt uitbreiden, kies je het extensietype op basis van wat je wilt bereiken:
| Je wilt... | Maak een... |
|---|---|
| De hoofdinhoud van een pagina of een nieuwe applicatie maken | Component (com_) |
| Een herbruikbaar blok rond de inhoud tonen | Module (mod_) |
| Reageren op een event of gedrag aanpassen | Plugin (plg_) |
| Het uiterlijk en de pagina-indeling wijzigen | Template (tpl_) of een template override |
| Teksten vertalen | Een taalpakket |
| Meerdere van bovenstaande samen distribueren | Package (pkg_) |
| Code delen tussen je eigen extensies | Library (lib_) |
De eerste vraag die je jezelf moet stellen is vaak: "heb ik eigenlijk wel een nieuwe extensie nodig?". Een template override, een aangepast veld of een taaloverride lost veel wensen op zonder extra code die je moet onderhouden.
Naar boven8. Extensies en gedeelde services
8.1 Extensies vinden het wiel niet opnieuw uit, ze sluiten aan
De belangrijkste les uit deze hele serie is dat extensies krachtig zijn omdat ze Joomla's centrale services delen in plaats van ze opnieuw te bouwen.
| Gedeelde service | Geleverd door | Elke extensie kan... |
|---|---|---|
| Categorieën | com_categories |
Items organiseren binnen één gedeelde hiërarchie |
| Aangepaste velden | com_fields |
Extra velden toevoegen zonder code te schrijven |
| Tags | com_tags |
Items taggen over meerdere componenten heen |
| ACL | #__assets |
Dezelfde rechtenstructuur van de website gebruiken |
| Talen | Taalpakketten | Volledig vertaalbaar worden |
// Een component sluit zich aan op de gedeelde categorieënservice in services/provider.php
$container->registerServiceProvider(new CategoryFactory('\\Joomla\\Component\\Example'));
Een extensie die gebruikmaakt van de gedeelde service Categorieën krijgt direct een geneste hiërarchie, ACL-overerving en meertalige ondersteuning, allemaal zonder extra ontwikkelwerk. Deze gedeelde service verdient eigenlijk een eigen artikel.
Naar boven9. Veelgemaakte fouten en valkuilen
9.1 Uitschakelen in plaats van verwijderen
Het uitschakelen van een extensie voorkomt dat deze wordt uitgevoerd, maar de code blijft op de server staan en de gegevens blijven in de database aanwezig. Voor de beveiliging is dat niet voldoende. Gebruik je een extensie niet meer, verwijder deze dan volledig zodat ook de bestanden en tabellen worden verwijderd.
9.2 De updatesite vergeten
Als je een extensie handmatig installeert en nooit een updatebericht ziet verschijnen, is er waarschijnlijk geen updatesite geregistreerd. Controleer System → Update → Update Sites. Een extensie zonder updatesite blijft stilletjes op een oude versie staan.
9.3 De schemawaarschuwing negeren
Een waarschuwing zoals "Database schema is out of date" is niet cosmetisch. Het betekent dat een SQL-migratie niet is uitgevoerd, vaak na een handmatige bestandsupdate of een onderbroken update. Ga naar Manage → Database en klik op Fix voordat er vreemde fouten ontstaan.
9.4 Installeren vanuit onbetrouwbare bronnen
"Nulled" of illegale kopieën van commerciële extensies behoren tot de grootste bronnen van malware. Het bedrag dat je bespaart weegt niet op tegen de kosten van een gehackte website. Download daarom altijd rechtstreeks van de ontwikkelaar of via de JED.
9.5 De core updaten maar de extensies niet
Veel website-eigenaren voeren trouw Joomla-updates uit, maar vergeten dat extensies een eigen updatesysteem hebben. Een bijgewerkte core beschermt je niet tegen een kwetsbare extensie. Controleer daarom ook regelmatig System → Update → Extensions.
9.6 Bestanden kopiëren zonder Discover te gebruiken
Het uploaden van een extensiemap via FTP installeert de extensie niet. Joomla "kent" een extensie pas wanneer er een record bestaat in #__extensions. Nadat je bestanden hebt geüpload, gebruik je Manage → Discover om ze te registreren, of installeer je gewoon het zipbestand op de normale manier.
10. Best practices en snelle referentie
Als je maar een paar dingen uit dit artikel onthoudt, laat het dan deze zijn:
- Beschouw componenten, modules, plugins, templates en talen allemaal als hetzelfde soort object: een extensie.
- Installeer alleen extensies vanuit de JED of rechtstreeks van de ontwikkelaar.
- Houd zowel de Joomla-core als alle extensies up-to-date.
- Verwijder extensies die je niet meer gebruikt, uitschakelen is niet voldoende.
- Los schemawaarschuwingen direct op zodra ze verschijnen.
- Vraag jezelf bij ontwikkeling eerst af of een override of een aangepast veld voldoende is voordat je een nieuwe extensie bouwt.
- Maak gebruik van Joomla's gedeelde services (Categorieën, Velden, Tags en ACL) in plaats van ze opnieuw te ontwikkelen.
11. In het kort
INSTALLEREN System → Install → Extensions (Upload / Folder / URL / Web)
BEHEREN System → Manage → Extensions (inschakelen / uitschakelen / verwijderen)
UPDATEN System → Update → Extensions
CORE UPDATE System → Update → Joomla (los van extensie-updates)
DISCOVER Manage → Discover (registreert bestanden die al op de server staan)
SCHEMA FIX Manage → Database (voert ontbrekende SQL alsnog uit)
WAARSCHUWINGEN Manage → Warnings (problemen met de serveromgeving)
REGISTER Elke extensie = één record in #__extensions
UNIEK OP type + element + folder + client_id
OPTIES Opgeslagen als JSON in #__extensions.params
Naar boven12. Samenvatting
In Joomla is "extensie" de overkoepelende term voor alles wat je toevoegt aan het CMS, en zelfs Joomla Core zelf wordt geleverd als een verzameling extensies. De bekende vijf (component, module, plugin, template en taal) worden aangevuld met de verpakkingstypen: package, library en file.
Zodra je de gedeelde infrastructuur begrijpt, vallen alle typen op hun plek:
- Eén tabel: elke extensie is één record in
#__extensions, geïdentificeerd doortype + element + folder + client_id. - Eén manifest: een zelfbeschrijvend XML-bestand regelt installatie, updates, verwijdering, configuratie en de bron van updates.
- Eén installer:
com_installergebruikt hetzelfde proces voor zowel Joomla Core als extensies van derden, met Discover, Database Fix en Warnings als hulpmiddelen. - Eén updatemodel: een update is simpelweg een upgrade-installatie van een nieuwere zipversie, los van Joomla Update voor de core.
- Eén veiligheidsregel: installeer alleen vanuit betrouwbare bronnen, houd alles up-to-date en verwijder wat je niet gebruikt.
Goede extensies maken gebruik van Joomla's gedeelde services, zoals Categorieën, Velden, Tags, ACL en Talen, in plaats van deze opnieuw uit te vinden. Dat is een van de redenen waarom het Joomla-ecosysteem zo goed op elkaar aansluit.
Of je nu een nieuwe Joomla-site plant, een probleem met een extensie onderzoekt of je zorgen maakt over een verouderde extensie die een beveiligingsrisico vormt, het loont om te begrijpen hoe extensies werken. Ze vormen immers de bouwstenen van elke Joomla-website.
Naar boven

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


