Terug naar hoofdinhoud
Modules in Joomla
Op deze pagina
# Topics

Modules in Joomla

03 juni 2026

Modules zijn de kleine blokken rondom de hoofdinhoud van een Joomla-pagina: het menu, het inlogformulier, de broodkruimelnavigatie, de lijst met recente artikelen en de footer.

In de backend lijken ze eenvoudig, maar achter de schermen hebben ze te maken met posities, paginatoewijzingen, toegangsrechten, caching en een overzichtelijke structuur die je zelfs zelf kunt bouwen.

Hoe Joomla de kleine blokken rondom elke pagina opbouwt, plaatst en toewijst.

In dit artikel lees je hoe Joomla-modules echt werken. We beginnen bij de basis voor website-eigenaren en redacteuren, gaan daarna verder met de praktische configuratie voor beheerders en eindigen met de technische details voor ontwikkelaars. Je leert wat een module is, hoe deze op een pagina terechtkomt, hoe je bepaalt waar deze wordt weergegeven en hoe je de meest voorkomende fouten voorkomt.

De belangrijkste gedachte om mee te nemen is deze: een pagina bevat precies 1 component in het midden, maar zoveel modules als je wilt eromheen. Zodra je begrijpt hoe een module wordt opgebouwd, gepositioneerd en toegewezen, kun je elke module plaatsen, overriden en zelf ontwikkelen.

1. De basis

1.1 Wat is een module?

Een module is een klein, herbruikbaar presentatieblok. Een module heeft geen eigen URL en "draait" de pagina niet. Hij vult de pagina aan die door het component wordt gegenereerd.

Als een pagina een krant zou zijn, dan is het component het hoofdartikel en zijn de modules de zijbalken, het weerbericht, de advertenties en de footer.

1.2 De plaats van modules binnen de extensiefamilie

Een module is een van de vijf extensietypen van Joomla. Om goed te begrijpen wat een module is, helpt het om de andere typen ernaast te zien:

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 (definieert de posities) 1 site + 1 admin tpl_
Taal Vertalingen 1 actief -

Een component beantwoordt de vraag "waar gaat deze pagina over?". Een module beantwoordt de vraag "wat moet er nog meer rondom deze pagina worden weergegeven?".

1.3 De naamgevingsconventie mod_

Elke modulenaam begint met mod_. Anders dan een component heeft een module geen option-parameter in de URL, omdat een module nooit rechtstreeks wordt opgevraagd. Het template bepaalt waar de module verschijnt en Joomla bepaalt of deze verschijnt.

mod_menu            ← het hoofdmenu van de website
mod_login           ← inlogformulier
mod_articles_latest ← lijst met recente artikelen
mod_breadcrumbs     ← broodkruimelnavigatie
mod_custom          ← eigen HTML- of tekstinhoud

Je linkt nooit rechtstreeks naar een module. Je publiceert hem op een positie en wijst hem toe aan pagina's.

1.4 Modules die je elke dag gebruikt

Op een nieuwe Joomla 6-installatie zijn deze sitemodules standaard aanwezig:

ModuleDoel
mod_menu Toont een menu (de hoofdnavigatie)
mod_login Inlog- en uitlogformulier voor de voorkant van de site
mod_breadcrumbs Broodkruimelnavigatie ("je bent hier")
mod_custom Vrije HTML- of tekstinhoud (de alleskunner)
mod_articles_latest Meest recente artikelen
mod_articles_popular Meest bekeken artikelen
mod_articles_category Artikelen uit gekozen rubrieken
mod_banners Toont banners uit com_banners
mod_finder Zoekveld van Slim Zoeken
mod_related_items Gerelateerde artikelen op basis van tags of trefwoorden
mod_footer Copyrightregel in de footer
mod_languages Taalschakelaar
mod_wrapper Toont een andere pagina in een <iframe>

Ook het administrator-gedeelte heeft zijn eigen modules, zoals mod_menu, mod_toolbar, mod_title, mod_quickicon, mod_submenu en mod_latestactions. Ook de backend-interface van Joomla is grotendeels opgebouwd uit modules.

Naar boven

2. Site- versus administrator-modules

2.1 Twee clients, een concept

Modules bestaan in twee afzonderlijke omgevingen, die van elkaar worden onderscheiden door een waarde genaamd client_id:

public_html/
├── modules/                     ← SITE-modules       (client_id = 0)
│   ├── mod_menu/
│   ├── mod_login/
│   └── mod_articles_latest/
└── administrator/
    └── modules/                 ← ADMIN-modules      (client_id = 1)
        ├── mod_toolbar/
        ├── mod_quickicon/
        └── mod_submenu/
  • Site-modules worden weergegeven in de posities van het front-end template.
  • Administrator-modules worden weergegeven in het back-end template, bijvoorbeeld op dashboards van het Controlepaneel, in de werkbalk en bij de paginatitel.

De twee clients hebben ook verschillende positienamen, omdat elk template zijn eigen posities definieert. Het standaard back-end template (Atum) biedt deze administrator-posities:

Admin-positieWaar deze wordt weergegeven
cpanel De dashboardkaarten van het Controlepaneel (snelkoppelingen, statuswidgets)
menu Het hoofdnavigatiemenu van de backend
toolbar De werkbalk bovenaan een pagina (Opslaan, Nieuw, ...)
title Het gebied met de paginatitel
status De statusbalk (ingelogde gebruikers, berichten, versie)
icon, top, bottom, sidebar Overige posities die het admin-template biedt

Het gaat om dezelfde architectuur en dezelfde bestandsstructuur. Alleen de client en het template waarin de modules worden gebruikt verschillen van elkaar.

2.2 Hoe een module op de pagina terechtkomt

Een module ontvangt nooit zelf de aanvraag. Joomla verzamelt en rendert modules terwijl het template wordt opgebouwd:

Browserverzoek
   │  index.php?option=com_content&view=article&id=42
   ↓
CMS-applicatie → Router → Component wordt uitgevoerd en genereert de hoofdinhoud
   ↓
Template rendert:  <jdoc:include type="component" />   ← uitvoer van het component
                   <jdoc:include type="modules" name="sidebar-right" />
   ↓
Voor elke modulepositie die het template opvraagt:
   ModuleHelper::getModules('sidebar-right')
      → laad gepubliceerde modules voor deze positie
      → filter op toegangsniveau, taal en menu-toewijzing
      → render elke module via zijn Dispatcher + layout
   ↓
Template voegt alles samen → pagina wordt naar de browser gestuurd

De tags <jdoc:include type="modules" name="..."> in het template zijn de aansluitpunten. Modules zijn de onderdelen die je daarop aansluit.

Naar boven

3. Posities en toewijzingen

Dit is de kern van het werken met modules. Twee instellingen bepalen waar een module op het scherm verschijnt en op welke pagina's deze wordt weergegeven.

3.1 Moduleposities

Een positie is een benoemde plek die wordt gedefinieerd door het template, niet door Joomla Core. Het template beschrijft zijn beschikbare posities in het bestand templateDetails.xml:

<positions>
    <position>sidebar-left</position>
    <position>sidebar-right</position>
    <position>banner</position>
    <position>footer</position>
</positions>
  • Een module wordt gepubliceerd op 1 positie, bijvoorbeeld sidebar-right.
  • Meerdere modules op dezelfde positie worden weergegeven volgens hun volgorde (ordering).
  • Wanneer je van template wisselt, kan dezelfde module een andere positienaam nodig hebben.

Tip: Voeg ?tp=1 toe aan een URL van de website (met Preview Module Positions ingeschakeld in de template-instellingen) om alle moduleposities op de pagina zichtbaar te maken.

3.2 Menu-toewijzing, bepalen waar een module verschijnt

Dit is de instelling die het vaakst wordt vergeten. Elke module heeft een instelling voor Menu Assignment:

InstellingBetekenis
On all pages Overal weergeven
No pages Feitelijk uitgeschakeld (maar nog steeds gepubliceerd)
Only on the pages selected Alleen weergeven op de geselecteerde menu-items
On all pages except those selected Overal weergeven behalve op de geselecteerde menu-items

Joomla slaat deze gegevens op in de tabel #__modules_menu:

#__modules_menu
moduleid │ menuid
─────────┼────────
   16    │   0      ← menuid 0  = "alle pagina's"
   42    │   8      ← alleen tonen op menu-item 8
   42    │   12     ← ...en menu-item 12
   55    │  -8      ← negatief = "alle pagina's BEHALVE menu-item 8"

Een modulerecord kan meerdere toewijzingsregels hebben. Het teken van menuid bepaalt of het om een inclusie- of exclusieregel gaat.

3.3 De overige voorwaarden voor tonen of verbergen

Naast de menu-toewijzing bepalen nog drie andere voorwaarden of een module daadwerkelijk wordt weergegeven:

FilterKolomBepaalt
Gepubliceerd published Aan of uit
Toegangsniveau access Welke gebruikersgroep de module mag zien (Public, Registered, enz.)
Taal language * = alle talen, of een specifieke taal op meertalige websites
Status en datums publish_up, publish_down Een tijdsvenster waarin de module zichtbaar is

Een module wordt alleen weergegeven wanneer alle voorwaarden zijn vervuld en de positie aanwezig is in het template.

3.4 Titel tonen en de "Module Style" (chrome)

Twee presentatie-instellingen bepalen hoe een module wordt weergegeven:

  • Show Title (showtitle): bepaalt of de moduletitel boven de inhoud wordt weergegeven.
  • Module Style (chrome): de HTML-wrapper rond de module, geleverd door het template, bijvoorbeeld card, well, none of html5. Je stelt dit per module in via Advanced → Module Style.
Chrome "card":           Chrome "none":
┌─────────────────┐
│  Titel          │     (alleen de ruwe module-uitvoer,
│ ─────────────── │      zonder wrapper en zonder titel)
│  module-inhoud  │
└─────────────────┘

Chrome is de reden waarom dezelfde module er in het ene template uitziet als een kaart met kader en in een ander template als een eenvoudige lijst zonder opmaak.

Naar boven

4. Binnenin een module (voor ontwikkelaars)

4.1 De moderne mapstructuur van Joomla 4/5/6

Modules zijn "MVC-light". Er is geen Controller en geen aparte Model-klasse. In plaats daarvan bestaat een module uit een Dispatcher, een Helper en een layout:

modules/mod_articles_latest/
├── mod_articles_latest.xml      ← manifest (naam, versie, bestanden, parameters)
├── services/
│   └── provider.php             ← registratie van DI-services (entry point)
├── src/
│   ├── Dispatcher/
│   │   └── Dispatcher.php        ← bereidt de gegevens voor de layout voor
│   └── Helper/
│       └── ArticlesLatestHelper.php  ← de daadwerkelijke logica en data-opvraging
├── tmpl/
│   └── default.php               ← de HTML-layout
└── language/                     ← vertaalbestanden (.ini)
    └── en-GB/
        ├── mod_articles_latest.ini
        └── mod_articles_latest.sys.ini

Sinds Joomla 4 bestaat er geen mod_xxx.php-bestand meer in de hoofdmap. Het entry point is nu services/provider.php, net zoals bij componenten.

4.2 Het manifest (mod_articles_latest.xml)

<extension type="module" client="site" method="upgrade">
    <name>mod_articles_latest</name>
    <version>3.0.0</version>
    <description>MOD_LATEST_NEWS_XML_DESCRIPTION</description>
    <namespace path="src">Joomla\Module\ArticlesLatest</namespace>

    <files>
        <folder module="mod_articles_latest">services</folder>
        <folder>src</folder>
        <folder>tmpl</folder>
    </files>

    <config>
        <fields name="params"> ... het Opties-formulier van de module ... </fields>
    </config>
</extension>

De belangrijkste attributen zijn:

  • type="module" en client="site" (of client="administrator").
  • <namespace> registreert PSR-4-autoloading voor de map src/.
  • <config><fields name="params"> definieert het formulier dat je ziet in de module-editor. Joomla slaat de resultaten op als JSON in #__modules.params.

4.3 Het entry point (services/provider.php)

Net als componenten registreren modules zichzelf in de Dependency Injection-container (DI-container):

return new class () implements ServiceProviderInterface {
    public function register(Container $container)
    {
        $container->registerServiceProvider(
            new ModuleDispatcherFactory('\\Joomla\\Module\\ArticlesLatest')
        );
        $container->registerServiceProvider(
            new HelperFactory('\\Joomla\\Module\\ArticlesLatest\\Site\\Helper')
        );
        $container->registerServiceProvider(new Module());
    }
};
  • ModuleDispatcherFactory maakt de Dispatcher van de module aan.
  • HelperFactory maakt Helper-objecten aan, waarbij de database automatisch wordt meegegeven.
  • Module() is de generieke moduleservice die alles met elkaar verbindt.

Er zijn geen handmatige require-statements en geen globale variabelen nodig. Het gebruikt dezelfde moderne architectuur als componenten, maar dan lichter.

4.4 De Dispatcher, gegevens voorbereiden

De Dispatcher heeft een taak: de gegevens verzamelen die de layout nodig heeft en deze doorgeven.

class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
    use HelperFactoryAwareTrait;

    protected function getLayoutData()
    {
        $data = parent::getLayoutData();   // $data['params'], $data['module'], $data['app']

        $data['list'] = $this->getHelperFactory()
            ->getHelper('ArticlesLatestHelper')
            ->getArticles($data['params'], $this->getApplication());

        return $data;                      // wordt beschikbaar als variabelen in tmpl/default.php
    }
}

Alle sleutels die je toevoegt aan $data worden beschikbaar als variabelen zoals $list, $params, $module enzovoort binnen de layout.

4.5 De Helper, de logica

De Helper doet het echte werk. In dit voorbeeld haalt deze artikelen op. De databaseverbinding wordt via dependency injection aangeleverd:

class ArticlesLatestHelper implements DatabaseAwareInterface
{
    use DatabaseAwareTrait;

    public function getArticles(Registry $params, SiteApplication $app)
    {
        // Hergebruik het model van het component zelf, bouw de query niet opnieuw:
        $model = $app->bootComponent('com_content')
                     ->getMVCFactory()
                     ->createModel('Articles', 'Site', ['ignore_request' => true]);

        $model->setState('list.start', 0);
        $model->setState('list.limit', (int) $params->get('count', 5));
        // ... pas categorie-, sorteer- en auteursfilters toe op basis van $params ...

        return $model->getItems();
    }
}

Een goede module is lichtgewicht: ze gebruikt het model van het component voor de gegevens en richt zich uitsluitend op de presentatie.

4.6 De layout (tmpl/default.php)

Dit is pure presentatie. De variabelen komen rechtstreeks uit de $data-array van de Dispatcher:

<?php defined('_JEXEC') or die;

if (!$list) {
    return;                       // niets te tonen → niets renderen
}
?>
<ul class="mod-articleslatest mod-list">
<?php foreach ($list as $item) : ?>
    <li>
        <a href="/<?php echo $item->link; ?>">
            <?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>
        </a>
    </li>
<?php endforeach; ?>
</ul>

Een module kan meerdere layouts bevatten in de map tmpl/, bijvoorbeeld default.php en _item.php. Joomla slaat de gekozen layout op in de parameter layout van de module.

Naar boven

5. De database

5.1 #__modules, een record per geplaatste module

Elke module-instantie die je in de backend aanmaakt, wordt opgeslagen als een record in deze tabel:

KolomBetekenis
id Unieke instantie-ID
title Naam van de instantie ("Hoofdmenu", "Inlogformulier")
note Optionele interne notitie in het moduleoverzicht (wordt niet weergegeven)
module Het moduletype: mod_menu, mod_login, enzovoort
content De HTML-inhoud van een Aangepaste module (mod_custom), opgeslagen in het record zelf
position Templatepositie waarin de module wordt weergegeven (sidebar-right)
ordering Volgorde binnen dezelfde positie
published -2 = prullenbak / 0 = ongepubliceerd / 1 = gepubliceerd
access Toegangsniveau voor weergave
showtitle Titel wel of niet weergeven
params JSON: de opties van de module (aantal, categorie, layout, cache, enz.)
client_id 0 = site, 1 = administrator
language * of een specifieke taal
publish_up / publish_down Gepland zichtbaarheidsvenster

Let op het verschil: de kolom module bevat het type (een per toegevoegde extensie), terwijl id verwijst naar een afzonderlijke instantie. Je kunt bijvoorbeeld meerdere "Aangepaste HTML"-modules hebben: meerdere records met telkens module = mod_custom.

De meeste moduletypen bewaren al hun instellingen in params, maar de Aangepaste module (mod_custom) is bijzonder: de tekst uit de editor staat in de aparte kolom content en niet in params. Daarom reist de HTML van een Aangepaste module mee met het modulerecord zelf.

5.2 Type versus instantie

#__extensions                       #__modules
(1 rij per type in de installatie)  (1 rij per geplaatste instantie)
─────────────────────────       ───────────────────────────────
type=module, element=mod_custom  ←  id=20  module=mod_custom  position=footer
                                    id=33  module=mod_custom  position=sidebar
                                    id=41  module=mod_custom  position=banner
  • #__extensions bevat de module-code die is toegevoegd (ingeschakelde status, standaardinstellingen).
  • #__modules bevat elke afzonderlijke plaatsing van die code op de website.

5.3 #__modules_menu, de toewijzingstabel

Zoals uitgelegd in paragraaf 3.2 bevat deze tabel een record per combinatie van module en menu-item, waarbij positieve en negatieve waarden bepalen of pagina's worden opgenomen of uitgesloten:

-- Op welke pagina's verschijnt module 42?
SELECT menuid FROM #__modules_menu WHERE moduleid = 42;
--  0      → alle pagina's
--  8, 12  → alleen deze menu-items
-- -8      → alle pagina's behalve menu-item 8

Samen beantwoorden #__modules en #__modules_menu de vragen "wat, waar en op welke pagina's" voor elk blok op de website.

5.4 ACL, modules en de assetboom

Modules maken net als andere onderdelen gebruik van Joomla's centrale Access Control List (ACL). Elke module heeft een asset_id die verwijst naar een record in #__assets. De belangrijkste rechten zijn:

ActieBetekenis
core.edit Elke module bewerken
core.edit.state Publiceren, depubliceren of sorteren
core.edit.own Modules bewerken die je zelf hebt aangemaakt
core.delete Modules verwijderen
core.create Nieuwe modules aanmaken

Deze rechten stel je in via Modules → Opties → Rechten (voor alle modules) en je kunt ze vervolgens per module overschrijven. Daarnaast bepaalt de kolom access wie een module daadwerkelijk kan zien aan de voorkant van de website.

Naar boven

6. Werken met modules

6.1 Een module aanmaken en plaatsen

De standaardwerkwijze is als volgt:

  1. Ga naar Content → Site Modules (of Content → Administrator Modules voor backend-modules). Beide schermen zijn hetzelfde component com_modules, gescheiden door client_id.
  2. Klik op Nieuw en kies een module-type (mod_custom, mod_menu, enzovoort).
  3. Geef de module een titel en bepaal of Titel tonen is ingeschakeld.
  4. Stel de Positie in door een templatepositie te kiezen of in te typen.
  5. Configureer de Menu-toewijzing: alle pagina's, geen pagina's, geselecteerde pagina's of alle behalve geselecteerde pagina's.
  6. Stel Status, Toegang, Taal en eventueel publicatiedatums in.
  7. Configureer de type-specifieke Opties (het params-formulier uit het manifest).
  8. Klik op Opslaan. Joomla voegt een nieuw record toe aan #__modules.

6.2 De uitvoer van een module op de juiste manier aanpassen

Pas nooit bestanden van core-modules rechtstreeks aan. Joomla overschrijft deze bij een update. Gebruik in plaats daarvan een template override:

Kopieer: modules/mod_articles_latest/tmpl/default.php
Naar:    templates/<jouw-template>/html/mod_articles_latest/default.php
Wat wil je aanpassen?Juiste techniek
De HTML-uitvoer wijzigen Template override in html/mod_xxx/
De wrapper rond de titel wijzigen Module chrome / stijl (override in html/layouts/)
Het gedrag wijzigen Vaak beter via een plugin of een eigen module
Teksten aanpassen Taaloverride (System → Languages → Overrides)

Overrides blijven behouden na updates en maken het mogelijk om een module volledig anders vorm te geven zonder de originele code aan te passen.

6.3 mod_custom, het Zwitserse zakmes onder de modules

Dit is waarschijnlijk de meest veelzijdige standaardmodule van Joomla: vrije HTML- of tekstinhoud met ondersteuning voor de editor.

  • Voeg een promotiebanner, scriptfragment, ingesloten kaart of contactgegevens toe.
  • Combineer de module met menu-toewijzingen voor inhoud die alleen op specifieke pagina's zichtbaar moet zijn.
  • Schakel Prepare Content in de opties in zodat contentplugins worden uitgevoerd binnen de module, bijvoorbeeld voor shortcodes zoals {loadposition} of de uitvoer van aangepaste velden.

In veel gevallen lost een mod_custom in combinatie met een template override vrijwel elke wens op van het type: "ik wil hier een blok met deze inhoud tonen".

6.4 Een module binnen content laden

Soms wil je een module in een artikel weergeven in plaats van op een vaste positie in de zijbalk of footer:

TechniekLocatieFunctie
loadposition in een artikel Toont alle modules op positie mypos
loadmodule Toont een specifieke module
<jdoc:include> In een template Toont een modulepositie
ModuleHelper::renderModule() In PHP-code Toont een module programmatisch

De shortcodes {load...} worden geleverd door de plugin Content - Load Modules. Deze plugin moet ingeschakeld zijn om ze te kunnen gebruiken.

Naar boven

7. Prestaties en geavanceerde onderwerpen

7.1 Modulecaching

De meeste standaardmodules van Joomla bieden cache-instellingen onder de tab Geavanceerd. Deze worden gedefinieerd in het manifest:

<field name="cache" type="list" default="1">
    <option value="1">JGLOBAL_USE_GLOBAL</option>     <!-- globale cache gebruiken -->
    <option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
</field>
<field name="cache_time" type="number" default="900" />   <!-- seconden -->
<field name="cachemode" type="hidden" default="static" />
CachemodusCache per...Gebruik wanneer
static Module-ID (een cache voor iedereen) De uitvoer voor alle bezoekers hetzelfde is
itemid Menu-item De uitvoer per pagina verschilt
safeuri Geselecteerde URL-parameters De uitvoer afhankelijk is van queryparameters
(geen) Nooit cachen De uitvoer per gebruiker verschilt (inloggen, wie is online)

Waarschuwing: Een inlogmodule of een module zoals "Wie is online" mag niet statisch worden gecachet. Anders zou de status van een gebruiker zichtbaar kunnen worden voor alle bezoekers.

7.2 Volgorde van modules en meerdere instanties

  • Binnen een positie worden modules weergegeven volgens de waarde van ordering. Je kunt de volgorde aanpassen door modules in de lijstweergave te verslepen.
  • Je kunt meerdere instanties van hetzelfde moduletype plaatsen met verschillende instellingen, bijvoorbeeld drie mod_custom-blokken of twee verschillende menu's.
  • Met Batchverwerking in het moduleoverzicht kun je in een handeling de positie, toegangsrechten of taal van meerdere modules aanpassen.

7.3 Je eigen module bouwen, het minimale uitgangspunt

Een eenvoudige werkende sitemodule ziet er ongeveer zo uit:

mod_hello/
├── mod_hello.xml                       ← manifest (type="module" client="site")
├── services/provider.php               ← registreert Dispatcher + Helper + Module
├── src/
│   └── Dispatcher/Dispatcher.php        ← (Helper is optioneel voor eenvoudige modules)
├── tmpl/default.php                    ← <h3>Hallo, JUG!</h3>
└── language/en-GB/
    ├── mod_hello.ini
    └── mod_hello.sys.ini
  1. Maak er een zipbestand van en installeer het via System → Install → Extensions.
  2. Joomla leest het manifest, kopieert de bestanden en registreert de namespace.
  3. Maak een module-instantie aan, kies een positie, wijs pagina's toe en de module wordt weergegeven.

Tip: Begin met een kopie van mod_custom (de eenvoudigste standaardmodule) en hernoem daarna alles consequent.

7.4 Module versus component, wanneer gebruik je welke?

Maak een module wanneer...Maak een component wanneer...
Je een klein, herbruikbaar blok nodig hebt Je een volledige pagina of applicatie nodig hebt
Het pagina's aanvult die door een component zijn gemaakt Het eigenaar is van de URL en de hoofdinhoud
Geen eigen URL of detailweergaven nodig zijn Er lijst- en detailweergaven nodig zijn met eigen routing
Het vooral om presentatie en een query draait Het gegevens beheert, ACL per item gebruikt en een beheerinterface nodig heeft

Veel echte extensies leveren beide in een package (pkg_): een component voor beheer en een of meer modules om de gegevens zichtbaar te maken op de website.

7.5 Beveiliging, een module toont mogelijk onbetrouwbare gegevens

Een module staat op een openbare pagina en toont vaak gegevens die afkomstig zijn van gebruikers of uit de database. Daardoor vormt een module een klassiek doelwit voor injectieaanvallen. Houd je aan deze vier regels:

RegelWaaromHoe
Escapen bij uitvoer Voorkomt XSS in titels, parameters en queryresultaten htmlspecialchars($v, ENT_QUOTES, 'UTF-8') gebruiken in de layout
Invoer valideren en filteren Vertrouw nooit op request- of parametervelden Gebruik filter-attributen in het manifest (intarray, integer, CssIdentifier, enz.)
Geen SQL opbouwen met stringconcatenatie Voorkomt SQL-injecties in Helpers Gebruik de query builder met gebonden of gequote parameters
Respecteer ACL en toegangsrechten Voorkomt dat vertrouwelijke gegevens uitlekken Respecteer het access-niveau van de module en controleer authorise() voor gevoelige uitvoer
// Layout - altijd escapen:
echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8');

// Helper - parameters binden, nooit concatenatie gebruiken:
$query->where($db->quoteName('catid') . ' = :cat')
      ->bind(':cat', $catid, ParameterType::INTEGER);

Het attribuut filter="..." in het manifest vormt je eerste verdedigingslinie. Waarden worden opgeschoond voordat ze ooit in params terechtkomen.

Naar boven

8. Modules debuggen

8.1 De gereedschapskist voor het debuggen van modules

Wanneer een module zich niet gedraagt zoals verwacht (verkeerde positie, geen uitvoer of verouderde inhoud), werk dan deze controles stap voor stap af:

TechniekLaat zien
Posities weergeven (?tp=1) Of de positie bestaat in het actieve template en hoe deze heet
System → Global Configuration → Debug Joomla Debug plus het profiel- en querypaneel, inclusief queries en uitvoeringstijden van modules
Gegenereerde HTML inspecteren De chrome-wrapper, CSS-klassen en of er wel uitvoer is gegenereerd
Databasegegevens controleren De werkelijke waarden van position, published, access, language en menu-toewijzingen
Template overrides controleren Of een oude override in html/mod_xxx/ ongemerkt de standaardlayout overschrijft

8.2 De drie tabellen die je moet controleren

-- Is de module gepubliceerd, waar staat hij en voor wie?
SELECT id, title, position, published, access, language
FROM #__modules WHERE module = 'mod_articles_latest';

-- Aan welke pagina's is hij toegewezen? (0=alle, negatief=behalve)
SELECT moduleid, menuid FROM #__modules_menu WHERE moduleid = 42;

-- Is het moduletype zelf ingeschakeld?
SELECT element, enabled FROM #__extensions
WHERE type = 'module' AND element = 'mod_articles_latest';

De klassieke checklist voor een module die niet verschijnt is: gepubliceerd?juiste positie voor dit template?toegewezen aan deze pagina?komt het toegangsniveau overeen met de bezoeker?komt de taal overeen? In negen van de tien gevallen ligt het probleem bij een van deze vijf punten.

Naar boven

9. De Web Services API

Joomla kan modules ook beheren via de REST API en niet alleen via de backend. Dat is handig voor deploymentscripts, headless-opstellingen en bulkwijzigingen op meerdere websites. De plugin Web Services - Modules (plg_webservices_modules) registreert de routes, dus schakel deze eerst in via System → Plugins.

9.1 De endpoints

Site- en administrator-modules hebben elk hun eigen set routes, gescheiden door client_id, precies zoals overal elders in dit artikel:

MethodeEndpointFunctie
GET /v1/modules/site Toon alle site-module-instanties
GET /v1/modules/site/{id} Lees een module-instantie
POST /v1/modules/site Maak een nieuwe module-instantie aan
PATCH /v1/modules/site/{id} Werk een module-instantie bij
DELETE /v1/modules/site/{id} Verwijder een module-instantie
GET /v1/modules/types/site Toon de beschikbare site-moduletypen

Vervang site door administrator voor de backend-varianten, bijvoorbeeld /v1/modules/administrator en /v1/modules/types/administrator. De twee clients hebben aparte endpoints omdat een site-module en een administrator-module nooit uitwisselbaar zijn.

9.2 De API aanroepen

Elk verzoek heeft een API-token nodig (maak er een aan via Users → Manage, open een gebruiker en gebruik de tab API Tokens). Deze routes zijn niet openbaar, dus het token moet toebehoren aan een gebruiker die modules mag beheren:

# Toon alle site-module-instanties
curl -H "X-Joomla-Token: <token>" \
     https://example.test/api/index.php/v1/modules/site

# Lees een module-instantie
curl -H "X-Joomla-Token: <token>" \
     https://example.test/api/index.php/v1/modules/site/42

Het antwoord heeft de JSON:API-indeling. Het object attributes bevat dezelfde velden die je in de backend bewerkt: title, position, module, published, access, params enzovoort. Een POST of PATCH stuurt diezelfde velden terug om een instantie aan te maken of te wijzigen.

Naar boven

10. SEO en metadata

Een module heeft geen eigen URL en dus geen eigen metatitel, metabeschrijving of canonical tag. Een module verschijnt nooit als aparte pagina in Google. Toch hebben modules op drie concrete manieren invloed op je SEO.

10.1 Modules bepalen mede de gegenereerde HTML

Zoekmachines lezen de volledige HTML van een pagina, inclusief elke module erop. Dat heeft directe gevolgen:

  • Volgorde van koppen: een module die een <h2> of <h3> als titel toont, staat in dezelfde koppenstructuur als het artikel. Te veel modulekoppen kunnen de echte <h1> en de inhoudsstructuur van de pagina overschaduwen.
  • Herhaalde blokken: dezelfde module met "recente artikelen" of "populaire tags" op elke pagina herhaalt site-breed dezelfde links. Voor navigatie is dat prima, maar plaats geen grote lappen tekst in een module die overal verschijnt.
  • Volgorde in de broncode: een zware zijbalkmodule die voor het component in de HTML-broncode staat, kan de hoofdinhoud naar beneden duwen. Houd de uitvoer van <jdoc:include type="component"> hoog in de broncode waar het template dat toelaat.

10.2 Prestaties zijn onderdeel van SEO

Core Web Vitals zijn een rankingsignaal en modules zijn een veelvoorkomende oorzaak van trage pagina's:

  • Een module die een extern script laadt (sociale feed, chatwidget, kaart) kan het renderen blokkeren. Gebruik menu-toewijzing zodat de module alleen laadt op de pagina's die hem nodig hebben.
  • Cache stabiele modules (zie hoofdstuk 7) zodat Joomla ze niet bij elk verzoek opnieuw opbouwt.
  • Verwijder modules die je niet meer gebruikt in plaats van ze op "Geen pagina's" te laten staan. Een ongebruikte maar gepubliceerde module kost nog steeds werk bij het renderen.

10.3 Gestructureerde data en titels

Als je gestructureerde data (JSON-LD) of een kop toevoegt via een mod_custom-module, houd die dan geldig en uniek op de pagina. Zet Titel tonen uit wanneer een module puur decoratief is, zodat je geen lege of dubbele kop in de koppenstructuur van de pagina injecteert.

Naar boven

11. Veelgemaakte fouten en valkuilen

11.1 De module wordt niet weergegeven

  • Verkeerde positienaam voor het actieve template. De module is gepubliceerd, maar wordt niet weergegeven.
  • Vergeten menu-toewijzingen in te stellen, waardoor de module per ongeluk overal of nergens verschijnt.
  • Verkeerd toegangsniveau, waardoor bezoekers niet tot de juiste gebruikersgroep behoren.
  • Verkeerde taalinstelling op een meertalige website, waardoor de module alleen aan een enkele taal is gekoppeld.

11.2 Fouten met caching

  • Statische caching voor gebruikersafhankelijke modules (zoals inloggen of wie-is-online), waardoor de status van een bezoeker zichtbaar wordt voor anderen.
  • Verouderde inhoud doordat de cachetijd te lang is ingesteld voor informatie die regelmatig verandert.

11.3 Veelvoorkomende fouten van ontwikkelaars en beheerders

  • Core-modulebestanden aanpassen, wijzigingen gaan verloren bij een update. Gebruik altijd template overrides.
  • Het moduletype verwarren (de kolom module) met de instantie (de kolom id).
  • Zware logica in de layout plaatsen in plaats van in de Helper.
  • Titels of parameters zonder escaping tonen, waardoor XSS-aanvallen mogelijk worden.
Naar boven

12. Best practices

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

  • Een module is een klein presentatieblok. Er kunnen er meerdere op een pagina staan en de naam begint altijd met mod_.
  • Een module heeft geen eigen URL. De <jdoc:include type="modules">-plaatsen in het template en de gekozen positie bepalen waar de module verschijnt.
  • Menu-toewijzingen, toegangsniveau, taal, status en datums bepalen of de module wordt weergegeven.
  • Houd modules lichtgewicht: de Dispatcher bereidt gegevens voor, de Helper bevat de logica en de layout genereert de HTML.
  • Pas uitvoer veilig aan met template overrides, nooit door corebestanden te wijzigen.
  • Escape uitvoer, filter invoer en gebruik gebonden SQL-parameters, omdat modules vaak onbetrouwbare gegevens op openbare pagina's tonen.
Naar boven

13. In het kort

AANMAKEN     Content → Site Modules (of Administrator Modules) → Nieuw
POSITIE      Kies een templatepositie (sidebar-right, ...)
TOEWIJZEN    Menu Assignment: alle / geen / geselecteerd / behalve
TONEN        Status = Gepubliceerd + toegangsniveau komt overeen
VOORBEELD    Voeg ?tp=1 toe aan een front-end URL om posities te zien
OVERRIDE     templates/{tpl}/html/mod_xxx/default.php
IN CONTENT    of 
CACHE        static (alle bezoekers) versus none (gebruikersafhankelijk)
DEBUG        #__modules + #__modules_menu + #__extensions
BOUWEN       Kopieer mod_custom, hernoem alles en registreer in provider.php
Naar boven

14. Samenvatting

In Joomla zijn modules de stille bouwstenen rondom je inhoud. Ze raken bijna elk zichtbaar onderdeel van een pagina:

  • Navigatie: menu's en broodkruimelpaden die bezoekers gebruiken.
  • Lay-out: zijbalken, banners en de footer die de inhoud omringen.
  • Gerichte weergave: bepalen welke pagina's en gebruikersgroepen een blok te zien krijgen.
  • Prestaties: caching die pagina's snel houdt zonder gebruikersgegevens bloot te stellen.
  • Hergebruik: een duidelijke structuur met Dispatcher, Helper en layout die je eenvoudig kunt hergebruiken en uitbreiden.

Zodra je begrijpt hoe 1 module wordt opgebouwd, gepositioneerd en toegewezen, kun je elke module op de website plaatsen, overriden en ontwikkelen. Wanneer een module niet verschijnt, ligt de oorzaak bijna altijd bij de bekende checklist van vijf punten: gepubliceerd, positie, toewijzing, toegangsniveau en taal.

Of je nu een nieuwe Joomla-site bouwt, een eigen module ontwikkelt of worstelt met een module die niet verschijnt waar je hem verwacht, het loont om deze architectuur vroeg te begrijpen. Modules zijn eenvoudig in gebruik, maar de details eronder maken het verschil tussen een gewone website en een goed gebouwde Joomla-site.

Naar boven
Modules in Joomla
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.