Modules in Joomla
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 één 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 één van de vijf extensietypen van Joomla. Om goed te begrijpen wat een module is, helpt het om de andere typen ernaast te zien:
| Type | Rol | Per pagina | Prefix |
|---|---|---|---|
| Component | Hoofdinhoud / applicatie van de pagina | precies 1 | com_ |
| Module | Kleine blokken rondom de inhoud | meerdere | mod_ |
| Plugin | Eventgestuurd gedrag op de achtergrond | meerdere | plg_ |
| Template | Uiterlijk, stijl en pagina-indeling (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:
| Module | Doel |
|---|---|
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 geselecteerde categorieën |
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.
2. Site- versus administrator-modules
2.1 Twee clients, één 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.
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.
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 één 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:
| Instelling | Betekenis |
|---|---|
| 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"
Eén 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:
| Filter | Kolom | Bepaalt |
|---|---|---|
| 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 én 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,noneofhtml5. Je stelt dit per module in via Advanced → Module Style.
Chrome "card": Chrome "none":
┌─────────────────┐
│ Titel │
│ ─────────────── │ (alleen de ruwe module-uitvoer,
│ module-inhoud │ zonder wrapper en zonder titel)
└─────────────────┘
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 boven4. 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"enclient="site"(ofclient="administrator").<namespace>registreert PSR-4-autoloading voor de mapsrc/.<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());
}
};
ModuleDispatcherFactorymaakt de Dispatcher van de module aan.HelperFactorymaakt Helper-objecten aan, waarbij de database automatisch wordt geïnjecteerd.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 één 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.
5. De database
5.1 #__modules, één record per geplaatste module
Elke module-instantie die je in de backend aanmaakt, wordt opgeslagen als één record in deze tabel:
| Kolom | Betekenis |
|---|---|
id |
Unieke instantie-ID |
title |
Naam van de instantie ("Hoofdmenu", "Inlogformulier") |
module |
Het moduletype: mod_menu, mod_login, enzovoort |
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 (één per geïnstalleerde extensie), terwijl id verwijst naar een afzonderlijke instantie. Je kunt bijvoorbeeld meerdere "Aangepaste HTML"-modules hebben: meerdere records met telkens module = mod_custom.
5.2 Type versus instantie
#__extensions #__modules
(één record per geïnstalleerd type) (één record 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
#__extensionsbevat de geïnstalleerde module-code (ingeschakelde status, standaardinstellingen).#__modulesbevat elke afzonderlijke plaatsing van die code op de website.
5.3 #__modules_menu, de toewijzingstabel
Zoals uitgelegd in paragraaf 3.2 bevat deze tabel één 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:
| Actie | Betekenis |
|---|---|
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.
6. Werken met modules
6.1 Een module aanmaken en plaatsen
De standaardwerkwijze is als volgt:
- Ga naar System → Manage → Modules (of Site Modules / Administrator Modules).
- Klik op Nieuw en kies een module-type (
mod_custom,mod_menu, enzovoort). - Geef de module een titel en bepaal of Titel tonen is ingeschakeld.
- Stel de Positie in door een templatepositie te kiezen of in te typen.
- Configureer de Menu-toewijzing: alle pagina's, geen pagina's, geselecteerde pagina's of alle behalve geselecteerde pagina's.
- Stel Status, Toegang, Taal en eventueel publicatiedatums in.
- Configureer de type-specifieke Opties (het
params-formulier uit het manifest). - 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:
| Techniek | Locatie | Functie |
|---|---|---|
loadposition |
in een artikel |
Toont alle modules op positie mypos |
loadmodule |
|
Toont één 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.
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" />
| Cachemodus | Cache per... | Gebruik wanneer |
|---|---|---|
static |
Module-ID (één 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 één gebruiker zichtbaar kunnen worden voor alle bezoekers.
7.2 Volgorde van modules en meerdere instanties
- Binnen één 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 één keer 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
- Maak er een zipbestand van en installeer het via System → Install → Extensions.
- Joomla leest het manifest, kopieert de bestanden en registreert de namespace.
- Maak een module-instantie aan, kies een positie, wijs pagina's toe en de module wordt weergegeven.
Tip: Begin door mod_custom te kopiëren (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 één package (pkg_): een component voor beheer en één 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:
| Regel | Waarom | Hoe |
|---|---|---|
| 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.
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:
| Techniek | Laat 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 überhaupt 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 één van deze vijf punten.
Naar boven9. Veelgemaakte fouten en valkuilen
9.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 één taal is gekoppeld.
9.2 Fouten met caching
- Statische caching voor gebruikersafhankelijke modules (zoals inloggen of wie-is-online), waardoor de status van één bezoeker zichtbaar wordt voor anderen.
- Verouderde inhoud doordat de cachetijd te lang is ingesteld voor informatie die regelmatig verandert.
9.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 kolomid). - Zware logica in de layout plaatsen in plaats van in de Helper.
- Titels of parameters zonder escaping tonen, waardoor XSS-aanvallen mogelijk worden.
10. Best practices en snelle referentie
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 één 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.
11. In het kort
AANMAKEN System → Manage → 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 boven12. Samenvatting
In Joomla zijn modules de stille bouwstenen rondom je inhoud. Ze beïnvloeden 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 kopiëren en uitbreiden.
Zodra je begrijpt hoe één 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

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


