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 éé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:

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

Naar boven

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.

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 éé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:

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"

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:

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 é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, none of html5. 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 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 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.

Naar boven

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:

KolomBetekenis
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
  • #__extensions bevat de geïnstalleerde module-code (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 éé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:

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 System → Manage → Modules (of Site Modules / Administrator Modules).
  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 éé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.

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 (éé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
  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 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:

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

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

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

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 boven

12. 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
Modules in Joomla
Peter Martin

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