Update Joomla 3 naar Joomla 4, het wordt tijd

Ingediend door Dirk Hornstra op 15-aug-2023 22:56

In 2022 had ik al eens een blog geplaatst over het updaten naar Joomla 4: link en in 2021 had ik al geblogd over PHP 8: link. Maar ja, ik heb het druk, veel dingen te doen. Maar als ik nu inlog in de productie-0mgeving, dan is het niet meer te negeren, deze meldingen worden getoond:



De ondersteuning voor Joomla 3.10 eindigt op 17 augustus 2023. Migreer naar Joomla 4.
U draait nu op PHP 7.4.28 welke niet langer beveiligingsupdates ontvangt van de ontwikkelaars. Update naar PHP 8.0 of hoger.
 

En dan weet je dat het tijd wordt om actie te ondernemen. Nu moet ik toegeven dat ik "natuurlijk" al wat voorbereidingen getroffen had. Ik had vakantie, maar omdat ik nogal gecharmeerd ben van Docker heb ik op mijn laptop in Docker Desktop 2 containers aangemaakt, een php-7 met Joomla 3 en een php-8 met Joomla 4. Zodat ik eerst op mijn eigen computer kon zien welke zaken kapot zouden gaan (waardoor je website alleen nog maar een wit scherm toont).

Mocht je ook een Joomla 3 website hebben draaien, dan heb je mogelijk wat aan mijn tips. En als je site dan ook nog eens op PHP 7 draait, dan neem ik aan dat je ook over wilt naar PHP 8.

Ter info: die stappen van mijn vorige blog over het updaten naar Joomla 4, volg ze niet. Het leek zo mooi om met een "schone installatie" te beginnen en je data over te zetten, maar het is foutgevoelig en Joomla biedt de mogelijkheid om je Joomla 3 site redelijk "geruisloos" over te zetten naar Joomla 4. Dat heb ik lokaal in mijn Docker container gedaan en ik was daar zeer tevreden over.

Stap 1: haal via FTP je data binnen en maak 2 Docker containers aan, een PHP 7 versie en een PHP 8 versie.

Met deze 2 containers kun je controleren of je de site via Docker kunt laten draaien "zoals ie nu draait" en in de PHP 8 container kun je zien "hoe ie zou moeten draaien" als alles geüpdate is. Ik heb via FTP alle bestanden binnen gehaald naar c:\projecten\project en een dump van de SQL database (daar via .ZIP, maar het resultaat heb ik weer uitgepakt naar een .sql bestand (wat eigenlijk een gewoon tekst-bestand is) en dat project.sql genoemd. De bestanden heb ik geplaatst in c:\projecten\project\db, c:\projecten\project\joomla320. Daar staan mijn "huidige bestanden", ik kopieer dat naar eigen mappen, zodat we via Docker kunnen "ompielen/updaten". Dus ik heb een map c:\projecten\project\docker\site\db, een c:\projecten\project\docker\site\joomla320 en een c:\projecten\project\docker\site\joomla400. In eerste instantie staan in joomla320 en joomla400 dezelfde bestanden.

Stap 2: maak je netwerk en je 2 containers aan.

Voer in de command-prompt de volgende acties uit (heb je nog geen Docker Desktop, die is hier te downloaden: link):

 

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 projectnetwork

docker run --detach --name 'project_php7' --network=projectnetwork -p 80:80 -p 3306:3306 -v c:/Projecten/project/docker/site:/opt/project mattrayner/lamp:latest-1804-php7

docker run --detach --name 'project_php8' --network=projectnetwork -p 80:80 -p 3306:3306 -v c:/Projecten/project/docker/site:/opt/project mattrayner/lamp:latest-1804-php8

Stap 3: configureer de website.

Als je een container start en je gaat in je browser naar http://localhost dan zie je daar de standaard LAMPP site. Dat moet "jouw" Joomla-site worden. Je moet hiervoor wat zaken aanpassen. Het is handig om te weten hoe vi werkt, aangezien je bestanden gaat aanpassen.
Start de container en ga naar het tabblad Terminal.



cd /etc/apache2
vi apach2.conf

// zorg dat onderstaande hier in komt:

 

<Directory /opt/project/joomla320/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

<Directory /opt/project/joomla400/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

// ga hier uit (:w)
// en pas dan het ander bestand aan:

cd /etc/apache2/sites-available
vi 000-default.conf

// zorgt dat onderstaande hier in komt:
// dit is voor de PHP 7 container:

vi 000-default.conf

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /opt/wergea/joomla320
<Directory /opt/wergea/joomla320>
Options Indexes FollowSymLinks MultiViews
# To make wordpress .htaccess work
AllowOverride All
Order allow,deny
allow from all
</Directory>

// dit is voor de PHP 8 container:

vi 000-default.conf

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /opt/wergea/joomla400
<Directory /opt/wergea/joomla400>
Options Indexes FollowSymLinks MultiViews
# To make wordpress .htaccess work
AllowOverride All
Order allow,deny
allow from all
</Directory>

Stap 4: configureer je database.

In je Joomla installatie heb je een bestand configuration.php, waarin je ziet hoe de database heet, welke user en password gebruikt worden ($db, $user, $pass).  We gaan er in het voorbeeld even vanuit dat je database project heet, de user is gebruiker en wachtwoord is nietTeRaden.
Start je Docker container op en voer het volgende uit in het tabblad Terminal:
 



mysql <ENTER>


// hiermee zit je in mysql

CREATE DATABASE project; <ENTER>
CREATE USER 'gebruiker'@'localhost' IDENTIFIED BY 'nietTeRaden';<ENTER>
GRANT ALL PRIVILEGES ON project.* TO 'gebruiker'@'localhost';<ENTER>

// hierna type je exit<ENTER> zodat je weer in de normale terminal zit.

mysql -uroot project < /opt/project/db/project.sql

Bovenstaande voer je zowel uit binnen je PHP 7 container als binnen je PHP 8 container.

Stap 5: controleer je websites.

In de PHP 7 omgeving zou je website al moeten werken. Heb je jouw website online al op een PHP 8 omgeving draaien, dan zou ook de PHP 8 omgeving in je Docker container moeten werken.

Stap 6: laten we updaten!

Als je online al een PHP 8 omgeving hebt, dan kun je meteen deze stap uitvoeren in je PHP 8 container. In mijn geval doe ik het eerst in mijn PHP 7 container.

Start je container, ga naar http://localhost/administrator, log daar in met je gegevens.

Kijk of je huidige Joomla 3 versie "up-to-date" is. Is dat niet het geval, dan krijg je hier wel de melding te zien dat je moet updaten. Doe dat eerst, zodat je helemaal bij bent. Ik zat nog op versie 3.10.4, de huidige versie (14 augustus) is 3.10.12.

Ga dan via Systeem, Algemene Instellingen naar Joomla! Update. Bij het "Update kanaal" selecteer je "Volgende Joomla" en je klikt op "Opslaan & Sluiten".
Je komt dan in een scherm waar pre-update controles uitgevoerd worden. Dat is mooi, want dan kun je je voorbereidingen treffen.
In mijn geval zie ik een lijst met een 3-tal items waarbij staat "Potential upgrade issue", het zijn eigen plugins die ik gemaakt heb en die ik later ga bijwerken.
Voor de upgrade schakel je die plugins uit. Dat doe je via "Extensies" en dan "Plugins". Hier zoek je op de namen en door op het knopje met het groene vinkje te klikken komt er een rood rondje met wit kruis in de knop: uitgeschakeld.
Alle dingen met "JCE" schakel ik uit.
Ook kwam ik er later achter dat bepaalde items in de site (in mijn template of via modules) bijgewerkt moesten worden. Die kun je via "Extensies" en dan "Modules"  tijdelijk uitschakelen.
Via Extensies - Beheren - Updaten kun je ook nog zorgen dat je extensies bijgewerkt worden (dat werd ook gemeld in het overzicht, ik moest het Web Links Package bijwerken).
Klik linksboven op de knop "Controleer op update". De lijst wordt dan weer doorgewerkt. En als je alles goed bijgewerkt hebt / de probleemzaken uitgeschakeld hebt zou je geen meldingen meer moeten krijgen.
Klik dan op het tabblad ernaast, Live update. In mijn geval ga ik dan van 3.10.12 naar 4.3.3.

Het /administrator deel zou moeten werken, je krijgt daar de melding dat de update gelukt is. In mijn geval krijg ik een foutmelding omdat ik in mijn sjabloon zaken gebruik die niet meer ondersteund worden.
Dat moet je nu gaan oplossen. Dat doe je door in /administrator naar Systeem, Algemene Instellingen te gaan. Vervolgens rechts op het tabblad Systeem zet je het schuifje bij "Foutopsporing systeem" op Ja. Klik op Opslaan. Als je nu op de website kijkt, zie je niet alleen de foutmelding, maar ook "hoe" je tot deze foutmelding gekomen bent. Welke bestanden, welke regel. Als je straks klaar bent met het oplossen van je fouten, zet dat schuifje dan weer uit, zodat er niet "per ongeluk" teveel informatie getoond wordt.

Stap 7: en nu in het echt!

Maak binnen de beheer-omgeving/controlpanel van jouw hosting een nieuwe subsite aan. Bijvoorbeeld update.jouwdomeinnaam.nl. Daar kopieer je al je bestanden heen, je maakt een eigen database, maakt een back-up van je huidige database en zet deze terug in de nieuwe lege database. Je past configuration.php aan zodat je bij de nieuwe site verbinding maakt met je nieuwe database.

Hierna log je in op update.jouwdomeinnaam.nl/administrator en pas je even de tekst aan van een artikel. Even voor de zekerheid controleren of die tekst alleen aangepast wordt op je update.jouwdomeinnaam.nl omgeving en NIET op je huidige productie website!
Op mijn online omgeving liep ik er namelijk tegen aan dat er zaken gecached worden! Dus als in configuration.php bij public $live_site = 'jouwdomeinnaam.nl'; staat, ging ie na inloggen op /administrator naar je live-omgeving! De fix was om configuration.php te verwijderen van FTP, in je browser opnieuw de site te openen en daarna via FTP het juiste bestand weer te uploaden.

Dat de live omgeving zaken extreem cached is vervelend, maar door het verwijderen van een bestand (of hernoemen van een map), de pagina te herladen en dan via FTP de gewijzigde zaken over te zetten lost het wel op.

Stap 8: toch nog wat foutjes...

Ik doorloop wat pagina's en ga zoeken.. en kom erachter dat het zoeken niet meer werkt. Via-via zie ik dat com_search een Joomla 3 component is en die niet meer in Joomla 4 zit: link. Daar wordt verwezen naar een Github locatie: link. Lokaal geïnstalleerd, maar ik krijg in het admin-deel foutmeldingen en bij de resultaten wordt alleen in de weblinks gezocht... terwijl de content van artikelen natuurlijk veel relevanter is.

De oplossing is echter veel makkelijker.. in Joomla 4 heb je namelijk wel "slim zoeken". En dat is een prima vervanger! Die laten indexeren, hierna bij Filters een filter aangemaakt, naam default-search, categorieën, artikelen en weblinks aangevinkt. Hierna via Systeem, Site Modules een nieuwe module aangemaakt (voor de sidebar van de website). Vreemd dat de titel er boven blijft, maar dat ga ik wel aanpassen in mijn sjabloon.

Ook de weblinks gaan nog niet helemaal goed. Ik heb de module opnieuw geïnstalleerd, dus het overzicht van de categorieën gaat goed. Maar als ik "door klik", dan zie ik geen links. Ik heb de onderstaande update doorgevoerd:



update [db-prefix]weblinks
set created=modified
 

Daarmee ben ik er nog niet, want de links zijn nog steeds niet zichtbaar. Maar als ik vervolgens in de backoffice elke link ga "wijzigen" (en daar niets aanpas), maar alleen op "opslaan en sluiten" klik, dan komen ze wel tevoorschijn. De hoeveelheid links op deze site is niet heel groot, dus dit heb ik redelijk snel gedaan.

Ik ben nu nog bezig om bestanden over te zetten, morgen de werkelijke omzetting doorvoeren, omdat ik ook nog een stukje "eigen PHP script" daarna moet aanpassen. Maar dan is het ook klaar!