Je website draait nu ook zonder jou
Ergens op je website staat een artikel dat eigenlijk al weken geleden gearchiveerd had moeten worden. Niet omdat er iets mis mee is, maar omdat het archiveren ervan iemands taak was om te onthouden — en mensen vergeten nu eenmaal dingen. Afgelopen zomer heb ik Joomla geleerd om dat onderdeel zelf af te handelen. Lees hier hoe dat werkt.
Het workflowsysteem van Joomla weet al hoe het een artikel van Concept naar In beoordeling, vervolgens naar Gepubliceerd en uiteindelijk naar Gearchiveerd kan verplaatsen. Wat het tot nu toe niet kon, was die overgang uitvoeren zonder dat iemand op een knop klikte. De planner van Joomla weet op zijn beurt al hoe hij taken op vaste tijdstippen moet uitvoeren: elk uur, elke nacht of elke maand. Die twee systemen waren alleen nooit met elkaar verbonden.
Dat was mijn project voor Google Summer of Code. Inmiddels zijn die twee systemen aan elkaar gekoppeld. Hieronder lees je hoe het eruitziet, wat er onderweg is veranderd en hoe je het zelf kunt uitproberen.
De korte versie
Je kunt nu aan elke workflowovergang een regel koppelen. Die regel bepaalt wanneer de overgang automatisch moet plaatsvinden en op welke artikelen deze van toepassing is. Een geplande taak controleert periodiek welke items aan de voorwaarden voldoen, voert de overgangen uit en registreert alles wat er is gedaan — of niet kon worden gedaan.
Je eerste regel instellen
Schakel eerst workflows in voor artikelen via Inhoud → Artikelen → Opties → Integratie.

Workflows inschakelen voor artikelen
Open vervolgens Inhoud → Workflows, selecteer een workflow en open een van de overgangen. Daar vind je een nieuw tabblad: Automatisering.
Schakel de automatisering in en kies hoe deze moet worden uitgevoerd. Dat kan op twee manieren:
-
Na een vertraging: een bepaald aantal minuten, uren, dagen of maanden nadat het artikel die fase heeft bereikt.
-
Volgens een schema: met een cron-expressie die je zelf opgeeft, bijvoorbeeld om elke maandag om 06.00 uur iets uit te voeren.
Selecteer vervolgens de gebruiker namens wie de regel wordt uitgevoerd. Dat is belangrijker dan het misschien lijkt. De overgang wordt uitgevoerd met precies de rechten van die gebruiker. Een regel kan dus nooit iets doen wat de geselecteerde gebruiker niet handmatig zou mogen doen. Verliest die gebruiker morgen de benodigde toegangsrechten, dan stopt de regel vanaf dat moment met werken. En dat is precies het gewenste gedrag.
Sla de regel op en je bent klaar. ‘Verplaats alles wat zeven dagen in Concept staat naar In beoordeling’ is nu iets wat je website zelfstandig uitvoert.
Alles nauwkeurig afstellen
Een regel die zonder onderscheid op alle artikelen in een bepaalde fase wordt toegepast, is voor een echte website meestal te grof. Daarom kan een regel twee afzonderlijke onderdelen bevatten. Het gescheiden houden daarvan bleek een van de nuttigste ontwerpkeuzes van deze zomer.
Een filter bepaalt op welke artikelen de regel van toepassing is. Een voorwaarde bepaalt of het juiste moment is aangebroken om de regel uit te voeren.
Je kunt acht verschillende kenmerken controleren: de categorie, de tag, de gebruikersgroep van de auteur, het aantal hits, de dag van de week, een datum, hoelang het artikel zich al in de huidige fase bevindt en hoelang geleden het voor het laatst is bewerkt.
Voor elk kenmerk zijn passende vergelijkingsmogelijkheden beschikbaar. Zo kun je bijvoorbeeld instellen:
-
‘De categorie is Nieuws of Sport.’
-
‘De auteur behoort tot de gebruikersgroep Redacteuren.’
-
‘Het artikel heeft minder dan 50 hits.’
-
‘Het artikel bevindt zich al meer dan 14 dagen in deze fase.’
Standaard voeg je eenvoudig voorwaarden toe waaraan allemaal moet worden voldaan. Daarmee kun je vrijwel alle gebruikelijke situaties afhandelen.
Heb je complexere logica nodig, zoals ‘dit óf dat’ of ‘niet dit’, dan kun je in de plugin Workflow Automation de Expertmodus inschakelen. Daarmee worden groeperingen en geneste voorwaarden mogelijk.

Expertmodus voor automatisering
Er is ook een knop Voorbeeldweergave. Voordat je een regel opslaat, kun je daarmee bekijken welke artikelen op dat moment aan het ingestelde filter voldoen.

Expertmodus voor automatisering met de knop Voorbeeldweergave
Drie websites, drie regels
De kleine nieuwssite die vergeet artikelen te archiveren.
Stel één regel in voor de overgang van Gepubliceerd naar Gearchiveerd, met een vertraging van 30 dagen. Voeg een filter toe dat alleen de categorie Nieuws selecteert. Zo blijven tijdloze handleidingen gewoon beschikbaar, terwijl de dagelijkse nieuwsberichten automatisch worden opgeruimd.
Het overheidsportaal waar concepten blijven liggen.
Stel een regel in voor de overgang van Concept naar In beoordeling, na zeven dagen. Voeg de voorwaarde toe dat de dag van de week geen zaterdag of zondag mag zijn. Zo komen er in het weekend geen artikelen in de wachtrij van een beoordelaar terecht. De bestaande notificatieplugin verstuurt een e-mail met de uitkomst.
De vakantiecontent die niemand offline haalt.
Voorzie seizoensgebonden artikelen van een tag. Stel vervolgens één regel in voor de overgang van Gepubliceerd naar Gearchiveerd, na drie dagen, met een filter dat alleen die tag selecteert. Stel de regel één keer in november in en je hoeft er daarna niet meer naar om te kijken.
Geen van deze regels kost meer dan een minuut om in te stellen. En daarna hoeft niemand er nog aan te denken.
Kunnen zien wat er staat te gebeuren
Automatisering die je niet kunt zien, is automatisering die je niet kunt vertrouwen. Dat bleek een veel groter onderdeel van het werk dan ik had verwacht toen ik mijn voorstel schreef.
Elke workflow heeft nu een tabblad Aankomende overgangen. Daarin zie je welke items in de wachtrij staan en wanneer elke overgang moet plaatsvinden. Er is ook een sitebreed overzicht, met filters waarmee je alles in één keer kunt bekijken.


In de artikellijst krijgen artikelen een klein label waarop staat wanneer de volgende automatische overgang plaatsvindt. Wanneer je een artikel bewerkt, vind je dezelfde informatie terug in de zijbalk, inclusief de overgang die zal worden uitgevoerd.
Ook in het workflowdiagram worden geautomatiseerde overgangen gemarkeerd.



Het workflowdiagram, waarin geautomatiseerde overgangen zijn gemarkeerd met een klokpictogram.
Gaat er iets mis, dan legt een automatiseringslogboek vast wat er is gebeurd en waarom een artikel niet verder wordt verwerkt, in plaats van de actie eindeloos opnieuw te proberen. Je ontvangt bovendien een e-mailmelding.
Je zou niet zelf op onderzoek uit moeten hoeven gaan om te ontdekken dat een regel ongemerkt niet meer werkt.

Het automatiseringslogboek, met elke uitvoering, het resultaat en de reden van eventuele fouten.
Voor ontwikkelaars
De lijst met controles ligt niet vast. Dankzij twee nieuwe events kunnen extensies hun eigen controles aan de voorwaardenbouwer toevoegen en de bijbehorende waarden aanleveren.
Zo kan een component van een derde partij functionaliteit aanbieden waar Joomla zelf niets van weet, terwijl deze toch in dezelfde interface beschikbaar komt.
Het project bevat ook een kleine voorbeeld-plugin die een externe service een ja-of-neevraag stelt. Daarmee wordt zowel aangetoond dat de events werken als geïllustreerd hoe zo'n integratie kan worden opgebouwd.
Wat ik heb geleerd
Een functie schrappen is moeilijker dan er een bouwen — en meestal is het de juiste keuze.
In mijn oorspronkelijke voorstel stonden ook geplande overgangen per artikel. Daarmee zou je voor één specifiek artikel een datum kunnen instellen. Daarnaast wilde ik ondersteuning toevoegen voor workflows met lussen. Beide functies zijn in de loop van de zomer geschrapt.
Geen van beide was bijzonder moeilijk om te bouwen. En juist dat was het probleem. Zodra regels aan workflowovergangen waren gekoppeld, zou een tweede plek om tijdstippen in te stellen betekenen dat je op twee plaatsen moest kijken wanneer een artikel onverwacht gedrag vertoonde. Lussen introduceerden bovendien een hele categorie mogelijke fouten voor een situatie waar niemand daadwerkelijk om had gevraagd.
Een functie bestaat voor het grootste deel uit meer dan alleen de functie zelf.
Het oorspronkelijke idee — een item na N dagen verplaatsen — vormt misschien maar een vijfde van het uiteindelijke werk. De rest bestaat uit rechtenbeheer, filters, foutafhandeling, logging en het vooraf inzichtelijk maken van wat er gaat gebeuren.
Ik had geen rekening gehouden met die verhouding. Uiteindelijk bleek dit een les die me is bijgebleven.
Een reviewopmerking gaat meestal over een principe, niet over één regel code.
De opmerking verwijst naar één specifieke plek, maar de reviewer beschrijft iets waarvan die verwacht dat het overal geldt.
Leren om opmerkingen op die manier te interpreteren en vervolgens ook de vier andere plekken aan te passen waar niemand expliciet iets over had gezegd, heeft ervoor gezorgd dat ik veel meer uit elke reviewronde haal.
De juiste reflex bij het werken in de codebase van iemand anders is niet: ‘Hoe zou ik dit schrijven?’
De juiste vraag is: ‘Hoe wordt dit binnen dit project al gedaan?’
Joomla heeft voor vrijwel alles eigen conventies. Door die te volgen, zorg je ervoor dat je code beoordeeld kan worden door mensen die er nog nooit eerder mee hebben gewerkt. Dat is een andere vaardigheid dan zelfstandig goede code schrijven. En juist die vaardigheid wilde ik deze zomer het liefst ontwikkelen.
Probeer het uit en vertel ons wat er misgaat
De functie is voltooid en de pull request voor Joomla staat open voor beoordeling:
https://github.com/joomla/joomla-cms/pull/48480
Een paar maanden geleden had ik nog nooit één regel Joomla-code geschreven. Inmiddels kan Joomla zelfstandig artikelen door een workflow verplaatsen. Ik hoop dat deze functionaliteit binnenkort ook op jouw website beschikbaar komt.
Ik ben dankbaar voor de begeleiding van mijn mentoren Tushar Malik en Dileep Adari, en natuurlijk voor de cruciale bijdragen van Benjamin Trenkle.
