Terug naar hoofdinhoud
Extensies in Joomla
Op deze pagina

Extensies in Joomla

01 juni 2026

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:

TypeRolPer paginaPrefix
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:

TypePrefixWat 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 boven

2. 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.

KolomBetekenis
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_cache bevat 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.
  • params bevat 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.

Naar boven

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:

AttribuutWaardenEffect
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   */ }
}
MethodeWordt 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.

EventWordt 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.

Naar boven

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

MethodeHoeWanneer
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.

Naar boven

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:

TypeBeschrijftGebruik
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-updateExtensie-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 boven

6. 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>
FunctieEffect
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.

Naar boven

7. Extensies beheren en beveiligen

7.1 Het scherm Beheren: je controlepaneel

System → Manage → Extensions toont alle records uit #__extensions:

ActieEffect
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.

AanpakWaarom
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 boven

8. 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 serviceGeleverd doorElke 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 boven

9. 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.

Naar boven

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.
Naar boven

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 boven

12. 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 door type + 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_installer gebruikt 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
Extensies in Joomla
Peter Martin

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