Terug naar hoofdinhoud
Checkin in Joomla

Checkin in Joomla

28 mei 2026

Elke Joomla-editor heeft de gele waarschuwing gezien: "Dit item wordt momenteel bewerkt door..." , bij een record dat niemand meer aan het bewerken is. De browser werd halverwege gesloten, de sessie verliep, of een fatale fout onderbrak het opslaan. De lock blijft achter en blokkeert de volgende persoon die het record probeert te openen.

Joomla lost dit op met een kleine ingebouwde component genaamd Check-in (com_checkin). Het is één backendscherm en één klik. Vink de betreffende tabellen aan, klik op Check-in, en elke verouderde lock verdwijnt.

Hoe Joomla voorkomt dat editors elkaars werk overschrijven, en hoe je het oplost wanneer een lock blijft hangen.

Dit artikel legt uit hoe Joomla's check-out / check-in-systeem werkt, waarom het bestaat, waar de locks in de database worden opgeslagen, en hoe je de Check-in-component, het lock-icoon, de scheduled task plugin en de developer API gebruikt. Het doel is om dit onderdeel van Joomla vanzelfsprekend te maken in plaats van mysterieus.

1. De basis

1.1 Wat is de Check-in-component?

De Check-in-component (com_checkin) is Joomla's ingebouwde beheertool voor het vrijgeven van bewerkingslocks op databaserijen. Deze zit standaard in Joomla core sinds versie 1.6.

Kort samengevat doet het volgende:

  • Het scant elke databasetabel waarvan de naam begint met jouw ingestelde prefix.
  • Het toont de tabellen die de kolommen checked_out en checked_out_time bevatten én minstens één gelockte rij hebben.
  • Het verwijdert de lock door beide kolommen terug te zetten naar hun standaardwaarde of NULL.

Zie het als de force-eject-knop voor vastgelopen records. Het is niet de normale manier waarop records worden ontgrendeld, dat gebeurt bij het opslaan van een record. Check-in ruimt alleen op wat het opslaan heeft gemist.

1.2 De bibliotheekboek-analogie

Het helpt om elk bewerkbaar record te zien als een bibliotheekboek:

  • Het openen van het bewerkformulier = het lenen van het boek. Jouw naam komt op het kaartje.
  • Klikken op Opslaan of Annuleren = het terugbrengen van het boek. Het kaartje wordt leeggemaakt.
  • De browser sluiten tijdens het bewerken = weglopen met het boek. Het kaartje blijft op jouw naam staan, niemand anders kan het lenen.
  • Global Check-in = de bibliothecaris loopt langs de schappen en wist elk kaartje waarvan de lener duidelijk vergeten is terug te komen.

1.3 Wat is een check-out eigenlijk?

Wanneer je een artikel opent voor bewerking (of een categorie, module of menu-item), schrijft Joomla een lock op rijniveau weg:

UPDATE #__content
   SET checked_out      = 42,                   -- jouw user id
       checked_out_time = '2026-05-27 14:23:00' -- nu
 WHERE id = 1234;

Zolang deze kolommen gevuld zijn, ziet iedere andere gebruiker die de rij opent een waarschuwing en kan deze niet opslaan. Wanneer je op Opslaan & Sluiten of Annuleren klikt, voert Joomla de bijbehorende check-in uit:

UPDATE #__content
   SET checked_out      = NULL,
       checked_out_time = NULL
 WHERE id = 1234;

De lock is verdwenen en de volgende editor kan de rij openen. Dit is het normale scenario. com_checkin is alleen nodig wanneer deze cyclus wordt onderbroken.

1.4 Waar vind ik het?

In de Joomla 6-backend is het pad:

System → Maintenance → Global Check-in

De component bevindt zich in administrator/components/com_checkin/. Er is bewust geen frontendmap. Er bestaat ook geen menu-itemtype of API-endpoint. Het is een tool voor Super Users.

2. De raceconditie die Check-in voorkomt

Zonder een check-out-systeem kunnen twee editors die vijf seconden na elkaar opslaan een stille bug veroorzaken genaamd last-write-wins:

14:23:00  Editor A opent artikel #42 en wijzigt de titel
14:23:05  Editor B opent artikel #42 en wijzigt de introtekst
14:23:40  Editor A klikt op Opslaan  → titel opgeslagen, intro teruggezet naar origineel
14:23:45  Editor B klikt op Opslaan  → intro opgeslagen, titel teruggezet naar de oude waarde van A

Beide editors denken dat hun wijzigingen correct zijn opgeslagen. Beide hebben ongelijk. De tweede opslagactie heeft stilletjes de helft van de eerste overschreven.

Check-out voorkomt dat deze raceconditie überhaupt begint. Editor B ziet een waarschuwing voordat er één karakter wordt getypt:

Dit artikel wordt momenteel bewerkt door Editor A sinds 14:23.

Dit is pessimistische locking op applicatieniveau. Joomla waarschuwt de tweede editor vooraf, in plaats van het conflict pas tijdens het opslaan te detecteren. De twee kolommen checked_out en checked_out_time vormen het volledige mechanisme.

3. Wanneer een lock blijft hangen

De check-in-stap wordt overgeslagen wanneer iets de editor onderbreekt:

  • Het browsertabblad wordt gesloten zonder op Opslaan of Annuleren te klikken.
  • De gebruikerssessie verloopt terwijl het bewerkformulier nog open staat.
  • De browser crasht, de laptop gaat slapen, of de wifi valt weg tijdens het opslaan.
  • Een PHP fatal error treedt op voordat de controller checkin() bereikt.
  • Een tweede tabblad opent hetzelfde artikel, de check-in van het eerste tabblad wordt uitgevoerd, waarna het sluiten van het tweede tabblad de rij opnieuw gelockt achterlaat door de tweede check-out.

Het resultaat is in elk geval hetzelfde: een rij die als checked out gemarkeerd staat door een gebruiker die het item niet meer aan het bewerken is. Dat is het moment waarop Global Check-in zijn plaats in de toolbar verdient.

4. Het Global Check-in-scherm

4.1 De lijst

Open System → Maintenance → Global Check-in. Het scherm toont een lijst met drie kolommen:

KolomBetekenis
Checkbox Vink de tabellen aan die je in bulk wilt inchecken.
Databasetabel Volledige tabelnaam inclusief prefix, bijvoorbeeld jos_content.
# items Hoeveel rijen in die tabel momenteel gelockt zijn.

Vink de gewenste tabellen aan, klik op de toolbar-knop Check-in, en Joomla toont het bericht "N items succesvol ingecheckt".

4.2 De lege status

Als geen enkele tabel gelockte rijen bevat, zie je een vriendelijk "niets te doen"-paneel, geen lijst en geen toolbaractie. Dit is de status die je wilt zien. Dit scherm openen en een lege lijst aantreffen is het normale en gezonde resultaat.

4.3 Bot of chirurgisch

Global Check-in is bot. Het geeft elke gelockte rij vrij in de tabellen die je aanvinkt, inclusief rijen waar andere editors mogelijk nog actief in werken. Voor één enkele rij gebruik je beter het lock-icoon in de lijstweergave van die component (zie sectie 5).

5. De editor-ervaring

5.1 Het lock-icoon in lijstweergaven

Open Content → Articles. Elke rij toont een klein lock-icoon naast de titel wanneer checked_out is ingesteld:

  • Hover over het icoon, tooltip met de naam van de gebruiker en het tijdstip van check-out.
  • Klik op het icoon, als je de juiste ACL-rechten op de rij hebt, wordt de rij direct ingecheckt.
  • Zonder toestemming, de klik doet niets en de rij blijft gelockt.

Deze check-in per rij is de snelle route. Editors hoeven zelden Global Check-in te openen. Ze klikken gewoon op het lock-icoon in de artikellijst.

5.2 De lock-waarschuwing in het bewerkformulier

Als Editor B een artikel opent dat door Editor A wordt bewerkt, ziet B een gele melding bovenaan het formulier. B kan de gegevens nog steeds bekijken, maar de knop Opslaan is uitgeschakeld. B heeft dan drie opties:

  1. Het tabblad sluiten en later terugkomen.
  2. A vragen om op te slaan en te sluiten.
  3. Een Super User vragen, of zelf op het lock-icoon klikken indien toegestaan, om de lock vrij te geven.

5.3 Per rij versus Global, kies het kleinste hulpmiddel

PadBereikBeste toepassing
Lock-icoon in lijstweergave Eén rij Een editor die zijn eigen vergeten lock oplost.
Global Check-in (com_checkin) Alle gelockte rijen in alle tabellen Opschonen na een crash of onderhoudsvenster.
Scheduled task (plg_task_globalcheckin) Alle tabellen, gefilterd op leeftijd Routinematig onderhoud op sites met meerdere editors.

6. Welke tabellen worden gescand?

6.1 De conventie

Een tabel verschijnt alleen in Global Check-in wanneer deze beide onderstaande kolommen bevat:

checked_out         INT (nullable in Joomla 4+, was 0-default in 3.x)
checked_out_time    DATETIME (nullable in Joomla 4+)

De component leest dbprefix uit de configuratie, doorloopt alle tabellen waarvan de naam met die prefix begint, haalt de kolomlijst op en slaat stilletjes alles over wat niet beide kolommen bevat. Daarom profiteren third-party extensies automatisch mee, als hun tabel de conventie volgt verschijnt deze vanzelf in Global Check-in, zonder registratie, plugin of XML.

6.2 Typische core-tabellen

Wanneer iets gelockt is, zie je meestal tabellen zoals:

TabelWat is gelockt
#__content Artikelen
#__categories Categorieën (van elke extensie)
#__menu Menu-items
#__modules Modules
#__users Gebruikersprofielen
#__fields / #__fields_groups Custom fields
#__redirect_links Redirects
#__tags Tags

Alles wat niet in deze lijst staat heeft óf geen checked_out-kolom, bijvoorbeeld #__session of #__assets, óf bevat simpelweg geen momenteel gelockte rijen.

6.3 De prefix-filter

De component weigert elke tabel aan te raken waarvan de naam niet begint met de ingestelde prefix. Dat heeft twee praktische gevolgen:

  1. Gedeelde databases werken netjes. Als je twee Joomla-sites in één database host (abc_content en xyz_content), raakt een check-in op site A alleen de abc_*-tabellen aan.
  2. Tabellen zonder of met een verkeerde prefix zijn onzichtbaar. Een custom extensie waarvan de tabel mytable_data heet (zonder #__) verschijnt nooit, zelfs niet als de tabel checked_out-kolommen bevat.

Gebruik altijd #__ in je tabeldefinities. Joomla vervangt dit tijdens runtime door de ingestelde prefix.

7. De onderliggende API

7.1 Waarom geen echte database-locks?

Joomla gebruikt bewust geen SELECT ... FOR UPDATE of tabel-locks voor editor-concurrency. Daar zijn meerdere redenen voor:

  • Bewerkingssessies duren langer dan databaseverbindingen. Databases zijn geoptimaliseerd voor korte transacties, niet voor menselijke editsessies van twintig minuten. Een echte row lock die zolang actief blijft zou de connection pool uitputten. Joomla slaat de lock daarom op als metadata in de rij zelf.
  • Cross-engine-portabiliteit. Joomla ondersteunt MySQL, MariaDB, PostgreSQL en SQL Server. Lock-mechanismen verschillen tussen deze systemen. Advisory columns werken overal hetzelfde, waardoor Joomla voorspelbaar en portable blijft.
  • Geen deadlocks. Twee kolommen kunnen geen deadlock veroorzaken. Twee echte database-locks op dezelfde rij wel.
  • Cluster-safe. De lockstatus staat in de database zelf, waardoor elke webnode dezelfde status ziet. Bestands- of geheugenlocks zouden falen in een load-balanced omgeving.
  • Menselijk leesbaar. SELECT * FROM #__content WHERE checked_out IS NOT NULL is iets wat een developer gewoon kan uitvoeren. Het is leesbaar en eenvoudig te debuggen, administrators kunnen locks direct inspecteren.

7.2 Table::checkOut()

Elke Joomla-tabel die locking ondersteunt erft van Joomla\CMS\Table\Table, dat het volgende levert:

public function checkOut($userId, $pk = null): bool

De methode triggert een "before"-event, werkt de kolommen checked_out en checked_out_time bij en triggert daarna een "after"-event. Het integerveld checked_out bevat de user id, geen sessie-id. Daardoor kan Joomla tonen wie de lock bezit, inclusief naam, in de waarschuwing.

7.3 Table::checkIn()

De spiegelmethode wist de kolommen opnieuw:

public function checkIn($pk = null): bool

checkIn() wordt aangeroepen door:

  • AdminModel::checkin(), de backendknoppen Opslaan en Annuleren.
  • Table::store(), het normale opslagpad. Een record opslaan voert altijd een check-in uit.
  • Table::delete(), vóór verwijdering, zodat een eventuele lock eerst wordt vrijgegeven.

Een succesvolle save is dus de normale manier waarop locks worden opgeheven. De Check-in-component ruimt alleen de achterblijvers op.

7.4 Table::isCheckedOut() en sessiemetadata

De controle die bepaalt of een waarschuwing wordt getoond is subtieler dan veel mensen denken. De methode isCheckedOut() raadpleegt de tabel #__session wanneer session tracking actief is:

if (Factory::getApplication()->get('session_metadata', true)) {
    // SELECT COUNT(userid) FROM #__session WHERE userid = $against
    // If 0 → the row is treated as not-checked-out,
    //         even though the columns are still filled in
}

In de praktijk betekent dit:

  • Met session_metadata = true (de standaardinstelling), zodra de sessie van de lockende gebruiker eindigt, gedraagt de rij zich als ontgrendeld. De volgende editor kan het item openen en opslaan, ook al lijken de kolommen nog "gelockt".
  • Met session_metadata = false vertrouwt de controle blind op de kolommen. Verouderde locks blokkeren dan daadwerkelijk andere editors totdat Global Check-in ze opruimt.

Veelgehoorde mythe: "Joomla geeft oude locks nooit automatisch vrij". De realiteit: met de standaardinstellingen past het gedrag zich al aan zodra sessies verlopen. Global Check-in en de scheduled task ruimen daarna alleen de kolommen op.

De instelling bevindt zich op System → Global Configuration → System → Session Settings → Track Session Metadata.

7.5 De vier table-events

Developers kunnen inhaken op de lock-lifecycle via vier events per rij:

EventWanneer het wordt getriggerdVeelgebruikte toepassing
onTableBeforeCheckout Vlak voordat de lock wordt gezet Auditlog: "gebruiker X gaat rij Y locken".
onTableAfterCheckout Direct nadat de lock is gezet Een notificatie sturen naar andere open editors.
onTableBeforeCheckin Vlak voordat de lock wordt verwijderd De check-in weigeren wanneer businesslogica dat vereist.
onTableAfterCheckin Direct nadat de lock is verwijderd Een gecachte lockstatus ongeldig maken.

7.6 Het component-event onAfterCheckin

Global Check-in triggert ook een eigen event nadat elke tabel is verwerkt. De eventklasse is Joomla\CMS\Event\Checkin\AfterCheckinEvent (Joomla 5.0 en later). Een typische subscriber:

public function onAfterCheckin(AfterCheckinEvent $event): void
{
    $table = $event->getTableName();
    Log::add("Global check-in cleared locks in {$table}", Log::INFO, 'audit');
}

Dit is handig voor compliance-logs, je wilt weten wie locks in bulk heeft vrijgegeven en wanneer. Let erop dat het event één keer per tabel wordt getriggerd, niet één keer per rij.

8. Geautomatiseerde check-in met de task plugin

8.1 Wat is het?

Sinds Joomla 5.0 bevat core een Scheduled Tasks-plugin genaamd Global Check-in:

plugins/task/globalcheckin/

Deze doet hetzelfde als de Check-in-component, maar dan volgens een cron-achtige planning en zonder dat iemand handmatig checkboxen hoeft aan te vinken.

8.2 Activeren

Er zijn twee stappen:

  1. Ga naar System → Manage → Plugins, zoek op Global Check-in en activeer de plugin.
  2. Maak een taak aan via System → Manage → Scheduled Tasks → New.

Kies de volgende waarden:

VeldKies
Type Global Check-in
Rule Cron-expressie of interval, bijvoorbeeld elk uur
Delay (hours) Minimale leeftijd van een lock voordat deze wordt vrijgegeven (standaard 1)
Status Enabled

8.3 De delay-parameter

De delay beschermt editors die daadwerkelijk nog aan het bewerken zijn. Met delay = 1 worden alleen locks ouder dan één uur vrijgegeven. Een editor die nog aan het typen is blijft veilig.

Kies een delay die iets langer is dan de langste verwachte bewerksessie:

  • Typisch: 2 uur.
  • Agressief: 1 uur.
  • Voorzichtig: 24 uur.

8.4 Wanneer gebruik je welk hulpmiddel?

De meeste productiesites doen er goed aan de scheduled task te activeren met een delay van minimaal 2 uur. Het Global Check-in-scherm wordt dan het "break-glass"-hulpmiddel, zelden nodig, maar klaar voor gebruik wanneer er iets misgaat.

9. Rechten en ACL

9.1 De twee acties

De ACL van Check-in wordt ingesteld via System → Global Configuration → Permissions → Check-in:

ActieWat het regelt
core.admin De component configureren, in de praktijk vooral de ACL zelf, er zijn verder geen opties.
core.manage Toegang tot het Global Check-in-scherm en het uitvoeren van check-ins.

Standaard erven alleen Super Users beide rechten. Je kunt een Site Manager-groep toegang geven door Manage toe te staan op com_checkin.

9.2 De permissie per rij is anders

Het vrijgeven van één enkele rij via het lock-icoon in een lijstweergave wordt bepaald door de component die eigenaar is van de rij, niet door com_checkin. Om een artikel via het icoon te ontgrendelen heb je de juiste rechten nodig op com_content, niet op com_checkin.

Een gebruiker met Manage-rechten op com_checkin kan dus wel een bulk check-in uitvoeren, maar mogelijk geen lock-icoon aanklikken op een individueel artikel. Beide routes gebruiken verschillende permissies.

9.3 Aanbevolen rollenmatrix

Rolcom_checkin ManageCheck-in per rijDagelijks gebruik
Super User Ja Ja Alleen indien nodig.
Site Manager Ja Ja Global Check-in uitvoeren na onderhoud.
Content Editor Nee Ja (eigen component) Op het lock-icoon klikken bij eigen artikelen.
Author Nee Nee Correct opslaan en sluiten, hulp vragen als iets vastloopt.

Global Check-in is een onderhoudsrecht, terwijl check-in per rij een contentbeheerrecht is.

10. Bouw het in je eigen extensie

10.1 Het recept

Om jouw component mee te laten doen aan Joomla's check-in-systeem zijn vier stappen voldoende.

1. Voeg de twee kolommen toe aan je tabeldefinitie.

CREATE TABLE `#__myext_items` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -- ... jouw velden ...
    `checked_out`      INT UNSIGNED NULL DEFAULT NULL,
    `checked_out_time` DATETIME     NULL DEFAULT NULL,
    KEY `idx_checked_out` (`checked_out`)
);

2. Extend Joomla\CMS\Table\Table in je Table-class. Je krijgt checkOut() en checkIn() gratis mee.

3. Extend Joomla\CMS\MVC\Model\AdminModel in je model voor het bewerkformulier. De methode save() roept automatisch checkin() aan. getItem() voert de checkOut() uit.

4. (Optioneel) Voeg het lock-icoon toe aan je lijstweergave:

echo HTMLHelper::_('jgrid.checkedout',
    $i, $item->editor, $item->checked_out_time, 'items.', $canCheckin);

Dat is alles. Je tabel verschijnt nu automatisch in Global Check-in zodra er gelockte rijen zijn, de scheduled task ruimt oude locks automatisch op en het lock-icoon werkt in jouw lijstweergave.

10.2 Evolutie van het schema

Joomla 4 wijzigde de kolommen checked_out van NOT NULL DEFAULT 0 naar nullable, waarbij niet gelockt gelijkstaat aan NULL. De Check-in-component en de task plugin ondersteunen beide varianten. Als jouw legacy-extensie nog het oude "default zero"-patroon gebruikt, blijft Global Check-in gewoon werken. Je kunt migreren wanneer het jou uitkomt.

11. Multi-server, API en headless

11.1 Load-balanced clusters

Omdat de lockstatus volledig in de database wordt opgeslagen, werkt Joomla check-in probleemloos in clustered hosting zonder extra configuratie:

  • Editor A opent een rij op webnode A, checked_out wordt opgeslagen in de gedeelde database.
  • De aanvraag van Editor B komt binnen op webnode B, dezelfde rij wordt geladen en de lock is zichtbaar.
  • Beide nodes kunnen de check-in uitvoeren. Het resultaat is direct overal zichtbaar.

Sticky sessions zijn voor de lock zelf niet nodig.

11.2 De Web Services API

Joomla 4 en later bevatten een JSON API op /api/index.php/v1/. Dezelfde AdminModel-code stuurt zowel de API-endpoints als de backendformulieren aan, dus:

  • Een PATCH op een artikel voert intern check-out, save en check-in uit.
  • Een API-client die een artikel alleen leest plaatst geen lock.
  • Een API-client die een artikel voor bewerking opent moet expliciet het check-out-endpoint aanroepen, daarna opslaan en vervolgens rekenen op automatische check-in.

De lock is adviserend. Een ruwe PATCH die check-out negeert slaagt gewoon en kan een lopende backendbewerking overschrijven. Als je een headless editor bovenop de API bouwt, ben je zelf verantwoordelijk voor het uitvoeren van check-out voordat het formulier wordt getoond, het tonen van de lockstatus in je UI en het uitvoeren van check-in wanneer de gebruiker weg navigeert.

11.3 CLI-scripts en directe SQL

De lock wordt afgedwongen door Joomla's PHP-code, niet door de database zelf. Dat betekent:

  • CLI-scripts die direct Table::store() aanroepen omzeilen de lockcontrole tenzij ze eerst expliciet isCheckedOut() uitvoeren.
  • Onderhoudsscripts met ruwe UPDATE-statements omzeilen het systeem volledig.
  • Third-party migrators respecteren locks mogelijk niet. Wees voorzichtig wanneer editors actief zijn.

Als jouw CLI-script schrijft naar een tabel die check-in ondersteunt, toon dan wat beleefdheid en voer check-out en check-in uit rondom de write-operatie.

12. Troubleshooting en nuttige SQL

12.1 Wie heeft dit artikel gelockt?

SELECT a.id, a.title, u.name AS locked_by, a.checked_out_time
  FROM jos_content a
  JOIN jos_users   u ON u.id = a.checked_out
 WHERE a.checked_out IS NOT NULL;

Vervang jos_ door jouw daadwerkelijke databaseprefix.

12.2 Welke tabellen ondersteunen überhaupt locks?

SELECT TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_SCHEMA = DATABASE()
   AND TABLE_NAME   LIKE 'jos_%'
   AND COLUMN_NAME  = 'checked_out';

Dit is exact wat de Check-in-component in PHP doet. Het resultaat is de volledige lijst van tabellen die deelnemen aan het lock-systeem op jouw site.

12.3 Noodgeval: alle locks in alle core-tabellen wissen

UPDATE jos_content    SET checked_out = NULL, checked_out_time = NULL WHERE checked_out IS NOT NULL;
UPDATE jos_categories SET checked_out = NULL, checked_out_time = NULL WHERE checked_out IS NOT NULL;
UPDATE jos_menu       SET checked_out = NULL, checked_out_time = NULL WHERE checked_out IS NOT NULL;
UPDATE jos_modules    SET checked_out = NULL, checked_out_time = NULL WHERE checked_out IS NOT NULL;
UPDATE jos_users      SET checked_out = NULL, checked_out_time = NULL WHERE checked_out IS NOT NULL;

Gebruik bij voorkeur Global Check-in of de scheduled task in plaats van directe SQL. Deze triggeren het event onAfterCheckin, waar andere extensies mogelijk op vertrouwen voor auditlogging.

12.4 Veelvoorkomende problemen

"Global Check-in is traag." De component voert SHOW TABLES uit en daarna DESCRIBE op elke tabel met de juiste prefix. Op een site met 200 of meer tabellen kan dit enkele seconden duren. Gebruik dit scherm daarom niet als "health check"-pagina. Activeer de scheduled task zodat je het scherm zelden hoeft te openen.

"Ik heb ingecheckt maar de editor ziet nog steeds de waarschuwing." De waarschuwing wordt tijdens het laden van de pagina opgebouwd vanuit de waarde van checked_out. De editor moet het formulier of de lijstweergave verversen om de vrijgegeven lock te zien.

"De task draaide maar de locks zijn er nog steeds." Controleer de Delay-parameter van de task. Met delay = 24 blijven locks jonger dan 24 uur bewust behouden. Draai de task één keer met delay = 0 om alles geforceerd vrij te geven en herstel daarna je normale waarde.

"Locks van een custom extensie verschijnen nooit in Global Check-in." De tabelnaam begint niet met jouw dbprefix, of de tabel mist één van de twee vereiste kolommen. Controleer dit met:

SHOW COLUMNS FROM <yourtable> LIKE 'checked_out%';

Je zou exact twee rijen moeten zien.

13. Best practices en cheat sheet

Als je maar een paar dingen uit dit artikel onthoudt, laat het dan deze zijn:

  • Check-in is niet de primaire manier waarop een lock wordt verwijderd, opslaan is dat. De component bestaat voor situaties waarin opslaan nooit heeft plaatsgevonden.
  • Kies altijd het kleinste hulpmiddel dat het probleem oplost: eerst het lock-icoon, daarna Global Check-in, daarna de scheduled task.
  • Activeer plg_task_globalcheckin op productiesites met meerdere editors en gebruik een logische delay, 2 uur is een goed begin.
  • De conventie bestaat uit twee kolommen: checked_out en checked_out_time. Elke tabel die deze bevat doet automatisch mee.
  • De lock is adviserend. Ruwe SQL of onzorgvuldige CLI-scripts kunnen het systeem omzeilen.
  • Met session_metadata = true (de standaardinstelling) gedragen verlopen sessies zich in de UI al als ontgrendeld, Global Check-in ruimt alleen de kolommen op.
  • Subscribe op onAfterCheckin als je een audittrail nodig hebt.

Cheat sheet

ÉÉN RIJ ONTGRENDELEN    Klik op het lock-icoon in de lijstweergave
MEERDERE RIJEN          System → Maintenance → Global Check-in
AUTOMATISCH VRIJGEVEN   Activeer plg_task_globalcheckin, stel delay = 2 in
ONDERSTEUN HET ZELF     Voeg checked_out + checked_out_time toe
                        Extend Table en AdminModel
AUDIT WIE VRIJGAF       Subscribe op onAfterCheckin
CHECK-IN WEIGEREN       Subscribe op onTableBeforeCheckin
ALLE LOCKTABELLEN       INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'checked_out'
LOCK DIAGNOSTICEREN     SELECT a.*, u.name FROM <table> a JOIN #__users u ON u.id = a.checked_out

14. Samenvatting

Joomla's check-in-systeem is klein, zichtbaar en bewust eenvoudig gehouden. Twee kolommen bewaren de lockstatus. Eén backendscherm geeft locks vrij. Eén scheduled task automatiseert de opschoning. Geen magie, geen contrib-module en geen verborgen status.

Voor administrators is het praktische advies eenvoudig: activeer de scheduled task met een logische delay, leer editors het lock-icoon te gebruiken voor hun eigen vastgelopen rijen en behandel Global Check-in als een noodhulpmiddel dat je zelden nodig hebt. Voor developers geldt: het systeem werkt gratis mee voor elke extensie die de conventie met twee kolommen volgt, zonder pluginregistratie of XML.

Of in één zin: wanneer Joomla geen kans kreeg om zichzelf op te ruimen, fungeert Check-in als het opruimmechanisme.

Checkin in Joomla
Peter Martin

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

© Peter Martin / db8 Website Support. All rights reserved.