Terug naar hoofdinhoud

AJAX in Joomla

29 juni 2026

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

Naar boven

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-parameterWat wordt aangeroepenHet 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=json verpakt het resultaat in een standaard JSON-envelop.
  • format=raw geeft het resultaat as-is terug, als platte tekst of HTML, zonder verpakking.
  • format=debug is handig tijdens het ontwikkelen, omdat het fouten opener toont.

Hoofdstuk 6 behandelt de formaten in detail.

Naar boven

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

  1. Het laadt elke plugin in de gevraagde groep (standaard ajax; overschrijf dit met &group=system en dergelijke).
  2. Het vuurt het event onAjaxHello af - het woord na plugin=, met een hoofdletter, met onAjax ervoor.
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:

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

Naar boven

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 boven

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

6. 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!" }
}
VeldBetekenis
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.

Naar boven

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, nofollow in, zodat zoekmachines de endpoint-URL's niet indexeren.
Naar boven

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.

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

Naar boven

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 boven

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

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

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

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

Naar boven

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=json voor data en lees die uit het veld data; gebruik format=raw voor 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() of exit() 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.
Naar boven

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 boven

15. 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 getypeerd AjaxEvent; modules en templates antwoorden met een <method>Ajax()-helper.
  • Een format is 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
AJAX in Joomla
Peter Martin
Peter Martin
Joomla Specialist

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

Veelgestelde vragen

Wat is AJAX in Joomla en waarom zou ik het gebruiken?

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.

Hoe implementeer ik AJAX in een Joomla component?

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.

Is AJAX veilig te gebruiken op Joomla-websites?

Ja, maar je moet invoer aan de serverzijde opschonen, zorgen voor goede toegangscontrole en alle ontvangen gegevens valideren om veiligheidsrisico’s te voorkomen.

Kan AJAX de prestaties van mijn Joomla website verbeteren?

Absoluut. AJAX voorkomt dat de hele pagina opnieuw wordt geladen, waardoor interacties sneller verlopen. Het vermindert het bandbreedteverbruik en houdt gebruikers betrokken.

Moet ik JavaScript kennen om AJAX in Joomla te gebruiken?

Ja, basiskennis is essentieel. Je schrijft JavaScript om AJAX-verzoeken te versturen en de inhoud op de pagina dynamisch bij te werken.

Hoe kan ik AJAX-aanroepen in Joomla debuggen?

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.