
AJAX in Joomla
Het grootste deel van Joomla is gebouwd om een complete webpagina terug te geven. Maar soms wil je alleen een klein stukje data: een live zoekresultaat, een klik op "herinner me later", een opgeslagen instelling, een prijs die ververst zonder herladen. Daarvoor levert Joomla een klein maar krachtig component genaamd com_ajax.
Dit artikel legt uit hoe het Ajax-component van Joomla echt werkt. Het begint met de basis voor website-eigenaren, gaat verder met de inrichting voor beheerders en duikt daarna in de technische details voor ontwikkelaars die hun eigen Ajax-endpoints willen bouwen.
Een klein component waarmee elke extensie een verzoek kan beantwoorden zonder dat je een controller hoeft te bouwen.
Het doel is simpel: je com_ajax goed genoeg laten begrijpen om het aan te roepen, te beveiligen en er met vertrouwen op verder te bouwen.
1. De Basis
1.1 Wat is com_ajax?
De naam "Ajax" staat voor een oud idee: een pagina vraagt op de achtergrond een klein stukje data aan de server en werkt zichzelf vervolgens bij zonder een volledige herlaadbeurt. com_ajax is het kerncomponent dat dit eenvoudig maakt in Joomla.
Het is ongebruikelijk onder de Joomla-componenten, want het heeft bijna geen eigen code. Het bouwt geen pagina, het heeft geen menu-items en het heeft geen views. Zijn enige taak is een binnenkomend verzoek aannemen, dat doorgeven aan de juiste extensie, en teruggeven wat die extensie produceert.
Zie com_ajax als een telefoniste: het beantwoordt je vraag niet zelf, het verbindt je oproep alleen door met de juiste extensie en geeft het antwoord terug.
1.2 Welk Probleem Het Oplost
Voor com_ajax moest elke ontwikkelaar die een klein JSON-antwoord wilde, een volledig component bouwen met een controller, een model en een router, alleen om een enkele waarde terug te geven. Dat is veel werk voor een getal.
com_ajax neemt dat werk weg. Een plugin, een module of een template kan een enkele methode aanbieden, en com_ajax roept die aan. Jij schrijft de logica, Joomla regelt het verzoek, de routing en het antwoordformaat.
Als je dit eenmaal hebt, worden veel veelvoorkomende functies eenvoudig:
- Live zoeken en zoeksuggesties terwijl de gebruiker typt.
- Afhankelijke velden - kies een land, en de lijst met provincies wordt bijgewerkt.
- Lazy loading - laad zware inhoud pas wanneer die in beeld scrolt.
- Opslaan zonder herladen - een instelling, een stem, een klik op "herinner me later".
- Dashboard-widgets die elk hun eigen data ophalen.
1.3 De Anatomie van de URL
Elke aanroep van com_ajax is gewoon een URL met een paar query-parameters. Dit is de vorm van een typisch verzoek:
index.php?option=com_ajax&plugin=hello&group=ajax&format=json
| | | |
| | | └─ antwoordformaat (verplicht)
| | └─ welke plugin-groep laden
| └─ welk doel aanroepen
└─ altijd com_ajax
| Parameter | Betekenis |
|---|---|
option=com_ajax |
Altijd aanwezig. Stuurt het verzoek naar het Ajax-component. |
plugin / module / template |
Welk soort extensie de aanroep beantwoordt (kies er een). |
format |
Het antwoordformaat: json, raw of debug. Verplicht. |
method |
Voor modules en templates: welke helper-methode aangeroepen wordt (standaard get). |
group |
Voor plugins: de te laden plugin-groep (standaard ajax). |
Hetzelfde component is bereikbaar vanaf de voorkant (index.php) en vanaf de achterkant (administrator/index.php). De achterkant-versie laadt simpelweg het bestand van de voorkant in.
2. De Drie Doelen
com_ajax kan een verzoek naar een van de drie extensietypes sturen. Het controleert ze in een vaste volgorde en gebruikt de eerste die het in de URL vindt.
2.1 Plugin, Module of Template
| URL-parameter | Wat wordt aangeroepen | Het beste voor |
|---|---|---|
plugin=hello |
Het event onAjaxHello in de gekozen plugin-groep |
Herbruikbare logica voor de hele site. De meest gekozen optie. |
module=foo |
ModFooHelper::getAjax() in mod_foo |
Logica die bij een module hoort (live zoeken, meer laden). |
template=bar |
TplBarHelper::getAjax() in de template bar |
Logica die bij een template hoort (thema wisselen, lay-out-optie). |
Je stelt er maar een van deze drie in. Als je er meer dan een instelt, behandelt com_ajax eerst de plugin, dan de module, dan de template, in die volgorde.
2.2 De Parameter format Is Verplicht
com_ajax weigert te raden hoe het antwoord opgemaakt moet worden. Als je format weglaat, krijg je een 404-fout met de melding "Please specify a valid response format". Dat is met opzet: een Ajax-endpoint mag nooit per ongeluk een volledige HTML-pagina teruggeven.
format=jsonverpakt het resultaat in een standaard JSON-envelop.format=rawgeeft het resultaat as-is terug, als platte tekst of HTML, zonder verpakking.format=debugis handig tijdens het ontwikkelen, omdat het fouten opener toont.
Hoofdstuk 6 behandelt de formaten in detail.
Naar boven3. Plugins: Het Meest Gekozen Doel
Voor de meeste projecten is een Ajax-plugin het juiste gereedschap. Een plugin is niet gebonden aan een enkele module of template, dus je kunt hem overal op de site aanroepen.
3.1 Het Event onAjax<Naam>
Wanneer je index.php?option=com_ajax&plugin=hello&format=json aanroept, doet com_ajax twee dingen:
- Het laadt elke plugin in de gevraagde groep (standaard
ajax; overschrijf dit met&group=systemen dergelijke). - Het vuurt het event
onAjaxHelloaf - het woord naplugin=, met een hoofdletter, metonAjaxervoor.
plugin=hello ──→ event onAjaxHello
plugin=stats ──→ event onAjaxStats
plugin=cart ──→ event onAjaxCart
Elke ingeschakelde plugin die zich op dat event abonneert, wordt uitgevoerd. Dit is hetzelfde publiceer-en-abonneer-model dat alle Joomla-plugins aandrijft.
3.2 Het AjaxEvent-Object
Sinds Joomla 5 geeft com_ajax een getypeerd event-object, AjaxEvent, door aan je methode. Het event draagt altijd de applicatie als subject mee, en het verzamelt wat je teruggeeft in een result-argument.
// In com_ajax, vereenvoudigd:
$eventName = 'onAjax' . ucfirst($input->get('plugin', ''));
$results = $dispatcher
->dispatch($eventName, new AjaxEvent($eventName, ['subject' => $app]))
->getArgument('result', []);
Je plugin leest het verzoek, doet zijn werk en voegt zijn antwoord toe aan het resultaat van het event. com_ajax maakt dat resultaat vervolgens op en stuurt het terug.
3.3 Een Volledig Voorbeeld van een Plugin
Hier is een minimale, moderne Ajax-plugin. Hij staat in plugins/ajax/hello/ en antwoordt met een begroeting:
use Joomla\CMS\Event\Plugin\AjaxEvent;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
final class Hello extends CMSPlugin implements SubscriberInterface
{
public static function getSubscribedEvents(): array
{
return ['onAjaxHello' => 'onAjaxHello'];
}
public function onAjaxHello(AjaxEvent $event): void
{
$app = $event->getApplication();
$name = $app->getInput()->getString('name', 'world');
// Voeg het antwoord toe aan het resultaat van het event:
$event->addResult(['greeting' => 'Hello, ' . $name . '!']);
}
}
Schakel de plugin in en bezoek dan:
index.php?option=com_ajax&plugin=hello&format=json&name=JUG
Je krijgt een JSON-envelop terug waarvan de data je begroeting bevat.
3.4 Het Resultaat Teruggeven
Het AjaxEvent-object geeft je drie heldere manieren om het antwoord in te stellen:
| Methode | Wat het doet |
|---|---|
$event->addResult($data) |
Voegt toe aan het resultaat (meerdere plugins kunnen elk een stukje toevoegen). |
$event->updateEventResult($data) |
Vervangt het hele resultaat door jouw waarde. |
$event->setArgument('result', $data) |
De laag-niveau manier; beide methodes hierboven bouwen hierop voort. |
Gebruik addResult() wanneer meerdere plugins hetzelfde event kunnen beantwoorden, en updateEventResult() wanneer jouw plugin het hele antwoord bezit.
4. Modules en Templates als Doel
Plugins zijn flexibel, maar soms hoort de logica duidelijk bij een module of een template. com_ajax ondersteunt beide, met een eenvoudige helper-methode-conventie.
4.1 Module-Helpers
Wanneer je index.php?option=com_ajax&module=foo&format=json aanroept, zoekt com_ajax de helper van mod_foo en roept een methode aan die is opgebouwd uit de method-parameter plus het woord Ajax:
method=get (standaard) ──→ getAjax()
method=save ──→ saveAjax()
method=search ──→ searchAjax()
// modules/mod_foo/src/Helper/FooHelper.php (moderne helper-factory-stijl)
namespace Joomla\Module\Foo\Site\Helper;
class FooHelper
{
public function getAjax(): array
{
// ... doe het werk, geef data terug ...
return ['time' => date('H:i:s')];
}
}
Aan twee voorwaarden moet voldaan zijn, anders krijg je een 404:
- De module moet ingeschakeld zijn. com_ajax controleert eerst de tabel
#__extensions. - De helper-methode moet bestaan en eindigen op
Ajax.
Oudere modules bieden de methode aan als een statische aanroep (ModFooHelper::getAjax() in modules/mod_foo/helper.php). com_ajax ondersteunt zowel de moderne helper-factory als de klassieke statische helper.
4.2 Template-Helpers
Templates werken op dezelfde manier, met template=bar en een TplBarHelper-klasse in templates/bar/helper.php:
index.php?option=com_ajax&template=bar&method=get&format=json
──→ TplBarHelper::getAjax()
De template moet geinstalleerd en ingeschakeld zijn. Dit is handig voor thema-instellingen, zoals een schakelaar voor donkere modus die een keuze moet opslaan zonder de pagina te herladen.
Naar boven5. com_ajax Aanroepen vanuit de Browser
Tot nu toe hebben we naar de serverkant gekeken. Laten we nu het endpoint aanroepen vanuit JavaScript, want daar wordt com_ajax normaal gesproken voor gebruikt.
5.1 Een Eenvoudige Fetch-Aanroep
De moderne manier is de ingebouwde fetch van de browser. Kern-plugins van Joomla gebruiken precies dit patroon:
const url = 'index.php?option=com_ajax&plugin=hello&format=json&name=JUG';
fetch(url, { method: 'GET' })
.then((response) => response.json())
.then((data) => {
console.log(data.data); // je resultaat zit in .data
});
Joomla levert ook een kleine helper, Joomla.request(), die het beveiligingstoken automatisch toevoegt. Je kunt de opties uitlezen met Joomla.getOptions('system.paths') om een correcte root-URL op te bouwen.
5.2 Het CSRF-Token en POST-Verzoeken
Een alleen-lezen GET-verzoek is prima om data op te halen. Maar elke aanroep die iets verandert - opslaan, verwijderen, versturen - moet beschermd worden tegen cross-site request forgery (CSRF). Joomla verwacht een eenmalig token.
const token = Joomla.getOptions('csrf.token', '');
fetch('index.php?option=com_ajax&plugin=cart&format=json', {
method: 'POST',
headers: { 'X-CSRF-Token': token },
body: new URLSearchParams({ productId: 42 }),
});
Controleer aan de serverkant het token met Session::checkToken() voordat je op een schrijfverzoek reageert. Vertrouw nooit op een GET-verzoek om data te wijzigen.
5.3 Parameters Doorgeven
Alles wat je aan de URL of de POST-body toevoegt, is beschikbaar via de applicatie-input, precies zoals in alle andere Joomla-code:
$input = $event->getApplication()->getInput();
$id = $input->getInt('id'); // veilig geheel getal
$name = $input->getString('name'); // gefilterde string
$html = $input->get('body', '', 'raw'); // raw, voorzichtig gebruiken
Gebruik altijd de getypeerde getters (getInt, getString, getWord). Ze filteren de invoer voor je en voorkomen veel injectieproblemen.
5.4 Controleer Rechten op de Server
Invoer filteren is niet hetzelfde als controleren wie iets mag doen. Een endpoint aan de voorkant kan door iedereen aangeroepen worden, dus jouw methode moet de rechten van de gebruiker zelf verifieren, met de ACL van Joomla:
$user = $event->getApplication()->getIdentity();
if (!$user->authorise('core.edit', 'com_inventory')) {
throw new \RuntimeException('Not allowed', 403);
}
Vertrouw nooit op de URL of een verborgen formulierveld om toegang te bepalen. De regel is simpel: filter elke invoer, en autoriseer elke actie.
Naar boven6. Antwoordformaten
De format-parameter bepaalt hoe com_ajax je resultaat verpakt voordat het wordt verstuurd. Het juiste formaat kiezen is belangrijk voor zowel de browser als je foutafhandeling.
6.1 Raw-Formaat
Met format=raw geeft com_ajax je resultaat as-is door: een string, een getal of HTML, zonder verpakking. Dit is de juiste keuze wanneer je een fragment HTML teruggeeft dat direct in de pagina geplaatst wordt.
index.php?option=com_ajax&module=foo&format=raw
──→ <ul><li>Resultaat 1</li><li>Resultaat 2</li></ul>
6.2 JSON-Formaat en de Antwoord-Envelop
Met format=json verpakt com_ajax je resultaat in een JsonResponse. Deze envelop heeft een vaste, voorspelbare vorm:
{
"success": true,
"message": null,
"messages": null,
"data": { "greeting": "Hello, JUG!" }
}
| Veld | Betekenis |
|---|---|
success |
true normaal gesproken, false als het resultaat een uitzondering was. |
message |
Een optioneel hoofdbericht. |
messages |
De wachtende systeemberichten van Joomla (waarschuwingen, mededelingen). |
data |
Je eigenlijke resultaat. Dit is wat je in JavaScript uitleest. |
Standaard stelt com_ajax ignoreMessages=true in, zodat wachtende systeemberichten buiten het antwoord blijven. Voeg &ignoreMessages=0 aan de URL toe als je de berichten van Joomla wel in het veld messages wilt opnemen.
6.3 Hoe Fouten Worden Teruggegeven
Als je code een uitzondering gooit, vangt com_ajax die op. In JSON-formaat wordt success dan false. In raw-formaat logt het de fout, stelt het de HTTP-statuscode in op basis van de uitzondering, en print het de klasse en de melding. Daarom is format=debug nuttig tijdens het ontwikkelen: fouten zijn makkelijker te zien.
Daarom moet je een uitzondering gooien om een probleem te melden, en nooit die() of exit() aanroepen in een handler:
// Goed: com_ajax maakt hier een net foutantwoord van.
throw new \RuntimeException('Inventory item not found', 404);
// Fout: stopt het verzoek en breekt de JSON die de browser verwacht.
die('error');
Een gegooide uitzondering geeft de browser een gestructureerd antwoord met de juiste statuscode. Een kale die() levert kapotte uitvoer op die JavaScript niet kan verwerken.
7. Beveiliging en de Achterkant
Een open endpoint dat data teruggeeft, is een beveiligingsoppervlak. com_ajax heeft meerdere ingebouwde beschermingen, en Joomla 6 voegt een belangrijke nieuwe toe voor de achterkant.
7.1 Voorkant versus Achterkant
Er zijn twee toegangspunten:
index.php?option=com_ajax&...- de publieke voorkant.administrator/index.php?option=com_ajax&...- de achterkant. Het admin-bestand laadt simpelweg het site-bestand in, dus de logica wordt gedeeld.
Aan de voorkant kan iedereen een endpoint aanroepen, dus jouw plugin moet de rechten zelf controleren. Aan de achterkant vereist com_ajax normaal gesproken een ingelogde beheerder.
7.2 Het Attribuut AllowUnauthorizedAdministratorAccess
Soms moet een Ajax-aanroep aan de achterkant draaien voordat de beheerder is ingelogd - bijvoorbeeld een wachtwoordloze login-uitdaging of een captcha-controle op het inlogscherm. Joomla 6 (geintroduceerd in 5.4.4) regelt dit met een PHP-attribuut.
Als een gast com_ajax aan de achterkant aanroept, inspecteert com_ajax de doelmethode. Tenzij die methode met het attribuut is gemarkeerd, weigert het de aanroep met een "niet geautoriseerd"-fout.
use Joomla\CMS\Plugin\Attribute\AllowUnauthorizedAdministratorAccess;
#[AllowUnauthorizedAdministratorAccess]
public function onAjaxMyLoginStep(AjaxEvent $event): void
{
// Dit mag draaien voor een gast in het beheergedeelte,
// omdat het attribuut dit expliciet toestaat.
}
Dit is een bewust "standaard weigeren"-ontwerp: een endpoint aan de achterkant is gesloten voor gasten, tenzij je het openstelt, een methode tegelijk.
7.3 Caching en Indexering
com_ajax beschermt zichzelf op elk verzoek op twee extra manieren:
- Het roept
allowCache(false)aan, zodat antwoorden nooit uit de paginacache geserveerd worden. Elke aanroep draait vers. - Het stelt de header
X-Robots-Tag: noindex, nofollowin, zodat zoekmachines de endpoint-URL's niet indexeren.
8. Onder de Motorkap
Voor ontwikkelaars helpt het om te weten hoe weinig er in com_ajax zit. Zodra je de flow hebt gezien, is er niets mysterieus aan.
8.1 Er Is Geen MVC
De meeste componenten hebben controllers, modellen en views. com_ajax heeft die niet. Het hele component bestaat uit een enkel bestand, components/com_ajax/ajax.php, plus een admin-wrapper van een regel. Er zijn geen databasetabellen die bij com_ajax horen.
8.2 De Dispatch-Flow
Dit is wat er gebeurt, van boven naar beneden, voor een verzoek:
Verzoek: option=com_ajax
│
v
allowCache(false) + X-Robots-Tag: noindex
│
v
Is 'format' ingesteld? ── nee ──→ 404 "specify a format"
│ ja
v
plugin? ──→ laad groep, dispatch onAjax<Naam>, lees 'result'
module? ──→ controleer ingeschakeld, roep Mod<Foo>Helper::<method>Ajax() aan
template? ──→ controleer ingeschakeld, roep Tpl<Foo>Helper::<method>Ajax() aan
│
v
Maak het resultaat op (json / raw) en print het
8.3 De Extensie-Opzoekingen
Voor modules en templates raadpleegt com_ajax de tabel #__extensions om te bevestigen dat het doel geinstalleerd en ingeschakeld is, voordat het iets aanroept. Daarom geeft een uitgeschakelde module "niet toegankelijk" terug in plaats van te draaien.
| Tabel | Waarom com_ajax die leest |
|---|---|
#__extensions |
Bevestigen dat de module of template geinstalleerd en enabled = 1 is. |
Plugins worden afgehandeld via PluginHelper::importPlugin(), die alleen ingeschakelde plugins laadt, dus een uitgeschakelde Ajax-plugin vuurt nooit.
9. Prestaties en Caching
com_ajax is handig, maar het is niet gratis. Weten wat elke aanroep echt kost, helpt je een interactieve pagina snel te houden.
9.1 Elke Aanroep Is een Volledige Joomla-Boot
Een Ajax-verzoek is geen lichtgewicht microservice-aanroep. Elke aanroep start de hele Joomla-stack op voordat jouw methode draait:
Verzoek
│
v
Framework + autoloader
│
v
Applicatie + DI-container
│
v
Sessie + gebruiker
│
v
Taalbestanden
│
v
Plugins geladen
│
v
Jouw Ajax-handler
│
v
JsonResponse
Het werk om "wat is de voorraad van item 42?" te beantwoorden omvat al die opstart. Behandel Ajax-aanroepen dus als echte verzoeken: doe er minder, en geef meer per aanroep terug in plaats van veel kleine af te vuren.
9.2 Houd de Handler Dun
Een Ajax-methode moet drie dingen doen: de invoer lezen en controleren, je logica aanroepen, en het resultaat teruggeven. Houd het echte werk in een aparte service- of helper-klasse, niet in de handler zelf.
public function onAjaxInventory(AjaxEvent $event): void
{
$app = $event->getApplication();
$id = $app->getInput()->getInt('id');
// De handler blijft dun; de service doet het werk.
$event->addResult($this->inventory->getStock($id));
}
Een dunne handler is makkelijker te testen, makkelijker te lezen, en later makkelijker te hergebruiken vanuit een gewone controller.
9.3 Cache Dure Resultaten
com_ajax schakelt de paginacache uit voor zijn eigen antwoorden, maar niets weerhoudt je ervan de data die je handler produceert te cachen. Waarden die zelden veranderen zijn ideaal:
- Categorieboomstructuren en menu's.
- Lijsten met landen, regio's en valuta's.
- Productcatalogi en zoeksuggesties.
Gebruik de cache van Joomla voor deze opzoekingen, zodat een populair endpoint niet bij elke toetsaanslag de database raakt. Aan de browserkant: debounce snelle gebeurtenissen zoals typen, zodat je een verzoek na een korte pauze stuurt in plaats van een per teken.
Naar boven10. com_ajax versus de Web Services API
Joomla heeft een tweede manier om data terug te geven zonder pagina: de Web Services API op /api/index.php. Ze overlappen, dus het helpt om te weten wanneer je welke kiest.
| Vraag | com_ajax | Web Services API |
|---|---|---|
| Wie roept het aan? | Vooral de JavaScript van je eigen site | Externe apps, mobiel, integraties |
| Hoeveel moet je bouwen? | Een methode op een plugin of module | Een volledige controller, view en routes |
| Authenticatie | Joomla-sessie en CSRF-token | API-token in een header |
| Het beste voor | Kleine, paginagebonden interacties | Gestructureerde, herbruikbare REST-endpoints |
Een REST-aanroep naar de Web Services API ziet er zo uit, met het token in een header:
curl -H "X-Joomla-Token: <token>" \
https://example.test/api/index.php/v1/content/articles
Vuistregel: gebruik com_ajax voor snelle interacties op je eigen site binnen de pagina, en de Web Services API wanneer een extern systeem een stabiel, gedocumenteerd endpoint nodig heeft.
Naar boven11. SEO en Metadata
com_ajax is geen inhouds-URL, en je moet het zich nooit als zodanig laten gedragen.
- com_ajax stuurt al
X-Robots-Tag: noindex, nofollow, dus de URL's blijven uit de zoekresultaten. Maak dit niet ongedaan. - Maak geen menu-items die naar com_ajax wijzen. Het heeft geen leesbare view, dus het zou een kapotte pagina opleveren.
- Houd Ajax-antwoorden klein en alleen-data. Ze zijn voor scripts, niet voor zoekrobots.
- Als een Ajax-antwoord een deel van een pagina opbouwt, zorg er dan voor dat de pagina ook zonder JavaScript werkt, zodat zoekmachines de kerninhoud nog steeds zien.
Kort gezegd: com_ajax serveert data aan de browser, terwijl je normale pagina's inhoud serveren aan mensen en zoekmachines. Houd die twee taken gescheiden.
Naar boven12. Veelgemaakte Fouten en Valkuilen
12.1 Ontbrekend Format
Symptoom: elke aanroep geeft een 404 terug met de melding "Please specify a valid response format".
Oplossing: voeg altijd &format=json of &format=raw aan de URL toe. com_ajax neemt nooit een formaat aan.
12.2 Verkeerde Event-Naam
Symptoom: je plugin is ingeschakeld maar er gebeurt niets, en het resultaat is leeg.
Oplossing: het event is onAjax plus de plugin-waarde met een hoofdletter. Voor plugin=hello moet de methode zich abonneren op onAjaxHello. Controleer de spelling en de hoofdletter.
12.3 De Module of Template Is Uitgeschakeld
Symptoom: "Module mod_foo is not published, you do not have access to it, or it's not assigned to the current menu item."
Oplossing: schakel de module of template in. com_ajax controleert #__extensions en weigert uitgeschakelde doelen.
12.4 Het CSRF-Token Vergeten bij Schrijfacties
Symptoom: een opslag- of verwijderactie werkt tijdens het testen, maar is onveilig, of faalt zodra tokencontroles worden toegevoegd.
Oplossing: stuur het token (X-CSRF-Token-header of een tokenveld) voor elk verzoek dat data wijzigt, en verifieer het met Session::checkToken() op de server.
12.5 Een Endpoint aan de Achterkant Aanroepen als Gast
Symptoom: een Ajax-aanroep aan de achterkant faalt met een "niet geautoriseerd"-fout voor gebruikers die niet zijn ingelogd.
Oplossing: dat is correct gedrag in Joomla 6. Als de methode echt voor een gast in het beheergedeelte moet draaien, markeer hem dan met het attribuut AllowUnauthorizedAdministratorAccess - en alleen dan.
12.6 Ruwe Invoer Vertrouwen
Symptoom: onverwachte data, of een beveiligingsmelding, omdat invoer zonder filtering werd gebruikt.
Oplossing: lees parameters met de getypeerde getters (getInt, getString), en controleer de rechten van de gebruiker binnen je methode, niet alleen in de URL.
13. Best Practices
Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:
- Stuur altijd een
format. com_ajax raadt er geen voor je. - Geef de voorkeur aan een Ajax-plugin voor herbruikbare logica; gebruik een module- of template-helper alleen wanneer de logica daar duidelijk thuishoort.
- Gebruik
format=jsonvoor data en lees die uit het velddata; gebruikformat=rawvoor HTML-fragmenten. - Stuur en verifieer een CSRF-token voor alles wat data wijzigt; houd GET-verzoeken alleen-lezen.
- Filter alle invoer met de getypeerde getters, en autoriseer elke actie met de ACL van Joomla.
- Houd de handler dun: lees invoer, roep een service aan, geef het resultaat terug. Zet de echte logica in een eigen klasse.
- Onthoud dat elke aanroep een volledige Joomla-boot is. Doe minder, grotere aanroepen, en cache resultaten die zelden veranderen.
- Gooi uitzonderingen om fouten te melden; gebruik nooit
die()ofexit()in een handler. - Houd endpoints aan de achterkant gesloten voor gasten; stel een methode alleen open voor gasten met het attribuut, wanneer dat echt nodig is.
- Gebruik com_ajax voor interacties binnen de pagina, en de Web Services API voor externe integraties.
14. In het kort
WAT HET IS Een kerncomponent dat een klein verzoek naar een extensiemethode stuurt
TOEGANGSPUNT index.php?option=com_ajax (en administrator/index.php voor de achterkant)
OP SCHIJF components/com_ajax/ajax.php (geen MVC, geen eigen tabellen)
FORMAT format=json | raw | debug (VERPLICHT)
PLUGIN &plugin=hello&group=ajax ──→ event onAjaxHello (AjaxEvent)
MODULE &module=foo&method=get ──→ ModFooHelper::getAjax()
TEMPLATE &template=bar&method=get ──→ TplBarHelper::getAjax()
RESULTAAT $event->addResult($data) of $event->updateEventResult($data)
INVOER LEZEN $event->getApplication()->getInput()->getInt('id')
JSON-VORM { success, message, messages, data }
BERICHTEN voeg &ignoreMessages=0 toe om wachtende systeemberichten op te nemen
VEILIG SCHRIJVEN stuur X-CSRF-Token; verifieer met Session::checkToken()
AUTORISEER $user->authorise('core.edit', 'com_xxx') in de handler
ADMIN GAST markeer methode met #[AllowUnauthorizedAdministratorAccess]
BESCHERMING allowCache(false) + X-Robots-Tag: noindex, nofollow
KOSTEN elke aanroep is een volledige Joomla-boot - cache, debounce, batch
Naar boven15. Samenvatting
com_ajax is een van de kleinste componenten in Joomla, en toch ontsluit het een grote hoeveelheid interactiviteit. In plaats van een volledig component te bouwen alleen om een waarde terug te geven, bied je een enkele methode aan en laat je Joomla het verzoek, de routing en het antwoord afhandelen.
De kerngedachten zijn kort:
- Een endpoint,
option=com_ajax, stuurt naar een plugin, een module of een template. - Plugins beantwoorden het event
onAjax<Naam>via een getypeerdAjaxEvent; modules en templates antwoorden met een<method>Ajax()-helper. - Een
formatis altijd verplicht, en JSON-antwoorden volgen een vaste envelop. - Beveiliging staat voorop: filter invoer, gebruik het CSRF-token voor schrijfacties, en houd endpoints aan de achterkant gesloten voor gasten, tenzij je ze bewust openstelt.
Als je live zoeken, een opslaan-zonder-herladen-knop of een kleine datafeed aan je site toevoegt, is com_ajax meestal de schoonste manier om dat te doen. En als je hulp nodig hebt bij het ontwerpen van een veilig Ajax-endpoint, bij het uitzoeken waarom er niets terugkomt, of bij de keuze tussen com_ajax en de Web Services API, dan is dat precies het soort geavanceerde Joomla-werk dat ik dagelijks doe.
Naar boven

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.
Veelgestelde vragen
AJAX maakt het mogelijk om dynamische inhoud te laden zonder dat de pagina opnieuw hoeft te worden geladen, waardoor gebruikers direct kunnen reageren. Het zorgt ervoor dat de pagina soepel aanvoelt, wat ideaal is voor moderne, responsieve websites.
De ingebouwde AJAX-interface van Joomla helpt daarbij. Je schrijft een server-side methode in je component en vervolgens een JavaScript-aanroep om gegevens te verzenden en een deel van de pagina naadloos bij te werken.
Ja, maar je moet invoer aan de serverzijde opschonen, zorgen voor goede toegangscontrole en alle ontvangen gegevens valideren om veiligheidsrisico’s te voorkomen.
Absoluut. AJAX voorkomt dat de hele pagina opnieuw wordt geladen, waardoor interacties sneller verlopen. Het vermindert het bandbreedteverbruik en houdt gebruikers betrokken.
Ja, basiskennis is essentieel. Je schrijft JavaScript om AJAX-verzoeken te versturen en de inhoud op de pagina dynamisch bij te werken.
Gebruik ontwikkelaarstools van de browser, zoals het tabblad ‘Netwerk’, om AJAX-aanroepen te bekijken. Je kunt de verzonden en ontvangen gegevens zien, wat je helpt bij het oplossen van problemen.


