Migratie van Joomla 3 naar Joomla 4, de aandachtspunten

Ingediend door Dirk Hornstra op 22-aug-2022 22:11

Al een tijdje is Joomla aan het rondbazuinen dat ze Joomla 3 uitfaseren en overgaan naar Joomla 4: roadmap. Zo te zien zijn ze met versie 4l gestart in augustus 2021. De ondersteuning van versie 3 stopt in augustus 2023.

Nu kwam er in april 2022 wat feedback over onze website, zaken die anders zouden kunnen, andere indeling van de site, nieuwe onderdelen. Ik had het jaartal in de naam van het sjabloon verwerkt en zo zag ik dat we in 2014 het huidige ontwerp opgeleverd hebben. Dus "dat is alweer 8 jaar oud".

Tja, laat ik dan meteen de site bijwerken naar de "nieuwste versie" van Joomla en daar alle aanpassingen in doorvoeren. Want als ik nu zaken ga aanpassen en uitbreiden in versie 3 dan mag/kan ik waarschijnlijk later alles opnieuw doen omdat versie 4 een andere syntax/structuur heeft. Dubbel werk, daar zitten we niet op te wachten.

Ik had de taak voor mezelf ingepland om te starten op 2 mei en klaar te zijn op 16 mei. 

Daar ben ik toen niet aan toegekomen. Andere verplichtingen, overdag aan het werk, 's avonds en in het weekend met andere zaken bezig. En zo blijft het liggen.

Op 27 juli 2022 was ik mooi op tijd bij het concert van Lady Gaga in het Gelredome, eerst met een biertje rondhangen op het horeca-plein. Muziek luisteren, kijken wat voor mensen er rond lopen en een planning gemaakt wat ik de komende tijd ga doen. Daar heb ik mezelf een schop onder de kont gegeven ( knap als je dat kunt ;) ) en mezelf de opdracht gegeven om de avonden als ik tijd had met die update aan de slag te gaan. En dat heb ik gedaan. Zondag 31 juli gestart, woensdag 17 augustus is mijn migratie-script zo stabiel dat de data netjes overgezet wordt, het "administratie"-deel geen foutmeldingen geeft en er geen zaken verwijderd worden die behouden moeten blijven (als je het fout doet, kun je alle iconen bij onderdeel "systeem" kwijt raken) en mijn sjabloon voor de homepage toont redelijk het overzicht wat ook op de huidige website wordt getoond.

Developers zijn slechte schatters. "Oh, dat doe ik wel even in 16 uur. Ah, dat is een dagje werk". Zie je mijn initiële schatting? Twee weken werk, 14 dagen. Ik zie nu op 18 dagen maar ik ben er nog niet: al mijn eigen modules/componenten zal ik nog moeten ombouwen, want zaken zijn in Joomla zo veranderd dat functies vervallen zijn, zaken anders aangeroepen moeten worden. Daarom noemt Scott Hanselman zijn podcast ook de "Hanselminutes podcast". Als hij een inschatting moet geven "dat kost een uur, dus 60 minuten", dan is de werkelijkheid dat het 180 "hanselminuten" gaat duren.

In ieder geval, mocht je ook op het punt staan om over te gaan naar de nieuwe versie van Joomla, dan heb je misschien wat aan de zaken waar ik tegenaan gelopen ben.

Je kunt je huidige installatie updaten naar versie 4. Dat doe ik niet, ik maak een nieuwe, schone installatie en kopieer mijn data uit de Joomla 3 omgeving daar naartoe. Zou houd ik een werkende Joomla 3 omgeving en kan ik "rustig" de Joomla 4 omgeving inrichten en vergelijken met de huidige site. Er moeten nog wat anderen naar de aanpassingen kijken, tussendoor komen weer nieuwe artikelen op de huidige website. Het is handig dat ik dat tussendoor even kan "syncen". Als we tevreden zijn, alles werkt, dan kan ik via de .htaccess in de root zorgen dat onder water we naar de versie 4 map doorgestuurd worden.

Waar ik tijd mee verloren ben is dat ik als een jonge hond gestart ben. Ik maak wel even een script, we gooien zaken leeg, we zetten zaken over en gaan met die banaan! Dat had ik eerst in onderdelen, dat werkte niet goed, daarna in één script en daarna toch maar weer in onderdelen.

Op een later tijdstip (ik moet nu nog zoveel doen, het huidige sjabloon aanpassen, nieuwe sjablonen toevoegen, huidige modules/componenten laten werken, nieuwe componenten/modules aanmaken, ik moet nog met andere projecten (onder andere Azure aan de slag)) ga ik mijn script/component delen via mijn GITHUB-locatie, dan plaats ik hier een LINK (en kun je deze tekst aanklikken).

Wel beschrijf ik hier wat ik stap-voor-stap doe. Als je dat volgt zou je het ook werkend moeten krijgen!

Stap 1: maak een nieuwe omgeving en maak een back-up van de database.

Installeer Joomla 4 op een nieuwe omgeving. Maak vervolgens een back-up van de database. Als je dan tijdens de import-/sync-flow tegen iets aanloopt (er gaat iets kapot, je hebt teveel verwijderd), dan kun je simpel alle tabellen in je nieuwe database verwijderen en met het back-up-script weer terugzetten. Je hebt dan weer een nette Joomla 4 omgeving (hoeft niet de volledige installatie door te lopen) en je kunt weer door.

Stap 2: synchroniseer de structuur van Joomla: tabellen assets, extensions, modules en template_styles.

De basis van een Joomla-omgeving bestaat uit de bouwstenen die in een aantal tabellen zitten. Zo heb je de tabel "assets". Verschillende tabellen zitten hieraan gekoppeld, hiermee geef je eigenschappen aan content, menu's en meer. 

In de tabel extensions staan jouw plug-ins, modules en componenten. Het veld client_id geeft aan of het zichtbaar is in de website of in het administrator-deel.

In de tabel modules geef je aan welke onderdelen op welke "position" in jouw website beschikbaar moeten zijn. Die "position" gebruik je in je sjabloon om de modules op te vragen (top, right, left, bottom, menu, etc.).

In de tabel template_styles geef je aan welke sjabloon actief (de standaard) is op de website en in het administrator-deel.

Naast het bijwerken van deze tabellen maak ik ook zelf tabellen aan. Deze zijn voor het "mappen" van de ID's. In de originele Joomla-3 database staat in de asset-tabel op ID 33 het record met naam "com_content.category.12" (titel is Voorzieningen), na import in de Joomla-4 database heeft die daar record 79. In de tabel categories (die import komt nog) zit een veld asset_id. In de Joomla-3 database verwijst die naar 33, die moet in de Joomla-4 tabel naar 79 gaan verwijzen.

Stap 3: synchroniseer de menu's: tabellen menu_types, menu, modules_menu.

Menu_types is eenvoudig, alleen de types. En omdat in menu het veld menutype niet verwijst naar de ID maar naar de naam, hoef je daar geen extra acties op te doen, wel op de velden component_id en parent_id. Met modules_menu koppel je records uit de tabel modules aan menu's, ook hier aan de mogelijk gewijzigde ID's denken.

Stap 4: synchroniseer content: tabellen categories, content, workflow_associations, content_frontpage.

Dit is iets wat ik moet kunnen herhalen. We doen het dus simpel, we gooien alle tabellen leeg en pompen dan de data over. Omdat we de boel leeg gooien, hoeven we ons niet druk te maken over het veld parent_id, dat klopt altijd. Alleen het veld asset_id, daar moet je dus de koppeltabel voor gebruiken. En let op: in Joomla-4 wordt de tabel workflow_associations gebruikt! Staat een record van de tabel content er niet in, dan is het artikel niet zichtbaar op de website!

Stap 5: synchroniseer de gebruikers: tabellen usergroups, users en user_usergroup_map.

Ook hier weer, moet herhalend uit te voeren zijn, dus we gooien alle tabellen leeg en zetten de inhoud van over.

Stap 6: synchroniseer banners: tabellen banners, banners_clients, banner_tracks.

Ook hier supersimpel, tabellen leeg gooien en data overzetten.

En de volgende stappen, dat zijn "eigen tabellen" voor onze omgeving. Zo hebben we weblinks, een koppeling met Twitter, met Yahoo Weather en een agenda (event-list). Die ga ik hier dus niet benoemen.

Welke problemen kwam ik tegen?

Content en modules werden niet zichtbaar. Toen bleek dat in de tabel modules (en content) het veld publish_up en publish_down gevuld is met "0000-00-00 00:00:00" en niet met "NULL". Door die weer leeg te maken was het opgelost.

Bij de modules en componenten loop ik er tegenaan dat zaken anders werken. Kon je in Joomla-3 nog met $item->params->get("naam") gegevens opvragen, nu werkt dat met een $itemParams = $item->getParams(); en kun je met die $itemParams->get("naam") gegevens opvragen. Maar ook stukken code zoals "JHtml::_('behavior.caption');" worden niet meer ondersteund. Dus het is een kwestie van veel zaken uitschakelen/weg halen en uitzoeken wat de nieuwe syntax is.

Nu eerst door met het werkend krijgen van mijn componenten en modules, dan door met het echt leuke onderdeel: nieuwe sjablonen en onderdelen/componenten toevoegen. Als dat allemaal afgerond is, deel ik hier nog wel even een update.

Ik zie nu al dat het werkend krijgen van de modules wat haken en ogen heeft, zo heb ik het overzicht van de agenda en de weblinks, dat werkt. Maar "klik je door" naar een overzicht van sublinkjes of naar een detailscherm van de agenda, dan kom je op een 404-pagina. Mogelijk moet ik de "routering-pagina's" van de modules aan gaan passen.