Templateprobleme nach Umschaltung auf PHP 8

  • Moin,


    nach Umschaltung auf PHP 8 habe ich bei einem Template eine Fehlermeldung.


    Das Template nennt sich 'theme1586' ist von 2013 und ist von Templatemonster (schon angefragt, gibt leider kein Support mehr dafür):



    Folgende Fehlermeldung erscheint:




    Nach Umschaltung auf Protostar mit Call Stack erscheint das:



    Joomla ist 3.9.24, alle Extensions sind aktuell.

    Hoster ist Strato.

    Link zur Seite: https://bit.ly/3qf1GpW


    Die Seite läuft mit PHP 7.4 einwandfrei.


    Hier noch der Inhalt der category.php (Zeile 23 habe ich rot markiert):



    Wenn es keine Lösung gibt, kommt ein neues Template daher.

    Natürlich in Verbindung mit Joomla! 4. :)

  • Hallo Pascal,

    das ist natürlich korrekt. Und nutze natürlich weiterhin 7.4.


    Ich habe auch schon 5 Seiten erfolgreich auf PHP 8 umgeschaltet.

    PHP 7.4 wird ja auch noch, nach aktuellem Stand, bis 11/22 supported.


    Spätestens dann muss aber die Seite mit PHP 8 stabil laufen.

    Deshalb schon einmal meine Tests mit PHP 8.


    Wie gesagt, wenn es nicht passt, habe ich ja genügend Zeit,

    die Seite mit einem neuen Template und Joomla 4 neu zu erstellen. ;)

  • Bzgl. des ersten Fehlers würde ich mal die error.php des Templates umbenennen, falls das die Ausgabe schon inklusive Debug und "Fehler berichten" = Maximum war. Der Stack wäre schon interessant.

    Nach Umschaltung auf Protostar mit Call Stack erscheint das

    Da wundert mich, dass der Override aus dem anderen Template überhaupt gezogen wird. Der sollte ja Protostar gar nicht interessieren, falls nicht irgendein Framework-Plugin und oder dummes Modul oder so den ins Spiel bringt. "wrap_with_tag(" ist jedenfalls weder ein Joomla noch ein PHP-Ding. Heißt also, dass die Datei, in der diese Funktion hinterlegt ist gar nicht geladen wird.


    Zu Fehler 1: In PHP8 gibt es ein paar Ecken und Ösen, dass man z.B. bei Verwendung von "+" explizit numerische Werte verwenden muss. Oder Strings eben mit "." verknüpfen muss und nicht mit "+" darf. Irgendsowas wird das bei dir sein. Meist aber leicht zu kösen, wenn man die Fehlerstelle sieht...

  • Generell - die Umstellung auf PHP8 ist ja im Gange aber es gibt immer wieder Sachen, die nicht kompatibel sind. Gerade hatte ich etwas, das hat keinen Fehler geworfen sondern sah völlig normal aus, keine Notice, keine Warnung, nur eine Abfrage lief falsch.


    Für die Supporter also als Hinweis: Fragt doch auch nach ob PHP 8 im Spiel ist, wenn etwas unerklärbartes passiert.

  • Bzgl. des ersten Fehlers würde ich mal die error.php des Templates umbenennen, falls das die Ausgabe schon inklusive Debug und "Fehler berichten" = Maximum war. Der Stack wäre schon interessant.

    Das Ergebnis:



    Dazu der Inhalt der includes.php (Zeile 86 Rot markiert):



    Dazu habe ich diesen Thread hier gefunden:


    A non-numeric value encountered in line on line 93


    (Habe ich es damals schon geahnt?).


    Zu Fehler 1: In PHP8 gibt es ein paar Ecken und Ösen, dass man z.B. bei Verwendung von "+" explizit numerische Werte verwenden muss. Oder Strings eben mit "." verknüpfen muss und nicht mit "+" darf. Irgendsowas wird das bei dir sein. Meist aber leicht zu kösen, wenn man die Fehlerstelle sieht...

    Habe ich gemacht und es hat funktioniert.


    Die Startseite und weitere Menüpunkte funktionieren wieder.


    Allerdings erscheint bei einigen Menüpunkten (Typ unterschiedlich) jetzt ein neuer Fehler der selben Zeile:



    Da bin ich aber noch nicht weitergekommen .....


    (Onlineseite ist wieder PHP 7.4)


    Tests i.M. nur Offline.

  • $mainContentWidth = 12 - ($asideLeftWidth + $asideRightWidth);

    Muss sein

    Code
    $mainContentWidth = 12 - ((int) $asideLeftWidth + (int) $asideRightWidth);

    Es gäbe auch noch andere Ansatzstellen im Code, um letztlich zum Ergebnis zu kommen.


    Eigentlich wäre es schon Aufgabe des Eingabefelds im Templatestil eine Integerzahl zu forcieren. Geht in Joomla nämlich ganz einfach durch Verwendung von filter="" in den Feldern.


    Also: Überall wo man mit Zahlen rechnet und die Zahlen ganze Integerzahlen sind, was ja oben der Fall ist, setzt mein ein (int) oder (integer) davor. So erzwingt man das "Diese Variable ist jetzt eine ganze Zahl; zum Rechnen geeignet".


    Ein String, der nicht mit einer Zahl beginnt, wird zur Zahl 0 durch das (int).


    "" wird zu 0.

    "5" wird zu 5.

    "0" wird zu 0.

    "1blödesDing" wrd zu 1.

    "blodesDing1" wird zu 0.

    "3.89" wird zu 3

    mit (int) davor.


    Bei Kommawerten, nimmt man dann was anderes, um die Zahl zu erzwingen.

    Stichwort "Type Casting": https://tutorials.supunkavinda.blog/php/type-casting


    Wäre

    Code
    $asideLeftWidth

    schon eine Integer-Zahl, stört das (int) auch nicht. Läuft dann eher unter "unnötig doppelt gemoppelt".

  • Muss sein

    Code
    $mainContentWidth = 12 - ((int) $asideLeftWidth + (int) $asideRightWidth);

    Genau diesen Eintrag habe ich nach dem Link aus #6 umgeschrieben. Funktionierte aber nicht (Caches etc. gelöscht usw.)


    Nach erneuter Offline-Installation habe ich es nochmals geändert und nun funktioniert es!


    Die ersten PHP 8-Probleme mit meinem Template scheinen also gelöst.




    Dennoch gibt es (nur auf dieser, meiner Seite) noch Probleme mit Drittanbietern,


    Obwohl aktuellste Versionen vom 04.01.2021 gibt es noch Deprecated- Fehlermeldungen mit PHP 8


    - Phoca Gallery

    - Phoca Download

    - JCE Pro (wird mit nächstem Update gefixt)


    Des Weiteren auch für die Komponente JEvents.

    Da gibt es aber vermutlich nächste Woche ein Fix mit der 3.6.13.


    Bei Ari Data Tables habe ich angefragt ....


    Da diese Probleme aber demnächst für PHP 8 beseitigt werden, kann ich so

    erstmal mit der PHP 8 offline weiter testen und arbeiten. :)


    Erstmal vielen Dank an Re:Later mit seinem unfassbaren Hintergrundwissen, das er zur Lösung verschiedenster

    Probleme mit Joomla und Extensions hier einsetzt!

    Beste Grüße! :)

  • Wie in einem anderen Thread geschrieben, habe ich Jan informiert. Er teilte mir nun mit, dass er gerne die Fehlermeldungen hätte, damit er sich das ansehen kann.


    Liebe Grüße

    Christine

  • Einige der Deprecated-Meldungen in PHP8 sind extrem nervtötende, zeitaufwendige Beschäftigungstherapie. Verstehe ab jetzt jeden Entwickler, der sagt "Schalte einfach Fehler berichten aus.".


    Beispiel: "Deprecated: Required parameter $xy follows optional parameter $yz in ..."

    Die los zu werden, bedeutet ggf. stundenlanges Überarbeiten inklusive Tests diverser Codestellen und Seiten und vor allem ist der Code/die Funktion/Methode dann nicht mehr rückwärtskompatibel.

    Und er wird geworfen selbst wenn die betr. Codestellen gar nicht ausgeführt werden.


    Mir gehen Nerds mittlerweile ziemlich auf den... Haben scheint's nichts besseres zu tun. Die Stärke von PHP war es einmal, dass auch Anfänger damit schnell Erfolge haben konnten ohne sich um so Krampf kümmern zu müssen.