Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 16. April 2021 10:21

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 61

Absturz beim Design-Import

Hallo,

ich habe ein Design aus einer Installation 2.2.13 exportiert und möchte es in eine andere Installation 2.2.15 importieren.
Dabei gibt es einen Absturz mit folgender Meldung:

Fatal error: Uncaught TypeError: count():
Argument #1 ($var) must be of type Countable|array, null given in C:\xampp\htdocs\a\modules\DesignManager\lib\class.dm_design_reader.php:56
Stack trace:
#0 C:\xampp\htdocs\a\modules\DesignManager\lib\class.dm_design_reader.php(75): dm_design_reader->{closure}()
#1 C:\xampp\htdocs\a\modules\DesignManager\lib\class.dm_design_reader.php(237): dm_design_reader->_scan()
#2 C:\xampp\htdocs\a\modules\DesignManager\action.admin_import_design.php(103): dm_design_reader->get_design_info()
#3 C:\xampp\htdocs\a\lib\classes\class.CMSModule.php(1403): include('C:\\xampp\\htdocs...')
#4 C:\xampp\htdocs\a\modules\DesignManager\DesignManager.module.php(56): CMSModule->DoAction('admin_import_de...', 'm1_', Array, '')
#5 C:\xampp\htdocs\a\lib\classes\class.CMSModule.php(1479): DesignManager->DoAction('admin_import_de...', 'm1_', Array, '')
#6 C:\xampp\htdocs\a\admin\moduleinterface.php(74): CMSModule->DoActionBase('admin_import_de...', 'm1_', Array, '', Object(Smarty_CMS))
#7 {main} thrown in C:\xampp\htdocs\a\modules\DesignManager\lib\class.dm_design_reader.php on line 56

Hat jemand eine Idee, was die Ursache des Problems ist?

Offline

#2 17. April 2021 09:26

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 61

Re: Absturz beim Design-Import

Um auszuschließen, dass es sich um ein Problem mit meinem exportierten Design handelt, habe ich jetzt mal dieses https://themes.cmsmadesimple.org/upload … _1.0.1.zip
heruntergeladen und versucht zu importieren.
Der Fehler ist der gleiche.
Ich habe Version 2.2.15 ohne Beispieldateien installiert, aber daran kann es wohl nicht liegen?

Viele Grüße
Frank

Offline

#3 17. April 2021 10:18

owr_web
Server-Pate
Registriert: 16. Dezember 2010
Beiträge: 543

Re: Absturz beim Design-Import

Um auszuschließen, dass es das Design ist, solltest du mit der gleichen Version hochladen und dann erst auf die 15er updaten.

Offline

#4 17. April 2021 10:29

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 61

Re: Absturz beim Design-Import

Leider steht beim B&B Design nicht dabei, was die "gleiche Version" ist.
Da es nun wie geschrieben schon mit 2 Designs nicht funktioniert, vermute ich mal dass es eher ein Problem von Version 2.2.15 ist?

Offline

#5 17. April 2021 13:56

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 61

Re: Absturz beim Design-Import

Problemursache eingegrenzt:
Habe das B&B Design (siehe mein 2. Beitrag) lokal auch nicht unter 2.2.13 installieren können.
Auf dem Webserver funktioniert es aber.
Der Unterschied: Lokal läuft PHP 8.02, remote PHP 7

Das heisst, cmsms hat Probleme mit PHP 8!

Laut PHP Doku ändert sich in PHP 8 für den statischen Aufruf mancher Funktionen der XMLReader-Klasse etwas an den Rückgabewerten. Habe nur noch nicht die Stelle gefunden, die ich ändern muss.

Kann mir jemand weiterhelfen?

Beitrag geändert von philfr (17. April 2021 13:57)

Offline

#6 17. April 2021 16:51

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 61

Re: Absturz beim Design-Import

Alles muss man alleine machen ;-)

In der Datei modules\DesignManager\lib\class.dm_design_reader.php
muss folgendes geändert werden:

Zeile 55 auskommentieren

[== php ==]
private function _scan()
    {
        $in = array();
        $cur_key = null;

        $__get_in = function() use ($in) {
//            global $in;  // Zeile muss weg!
            if( ($n = count($in)) ) {
                return $in[$n-1];
            }
        };

Bei Zeile 450 nach foreach einfügen:

[== php ==]
// substitute other tpl keys in this content       
foreach( $tpl_recs as $tpl2 ) {          
   if (!is_array($tpl2)) continue;  // neu hinzugefügt          
   if( $tpl['key'] == $tpl2['key'] ) continue;

Offline

#7 18. April 2021 22:33

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: Absturz beim Design-Import

Und das funktioniert?
Würde mich wundern.
Das global muss da tatsächlich raus.
(weil $in nicht als globale Variable deklariert wurde, sondern nur innerhalb des Scopes der Methode _scan() innerhalb der Klasse dm_design_reader gilt; da kann man nicht mit global drauf zugreifen - man könnte $in zwar auch einfach innerhalb dieses Scopes als globale Variable deklarieren, aber das ist bad practice.)
Aber das alleine reicht nicht.
Es sollte auch noch

$__get_in = function() use (&$in) {

sein.
Ich meine die Variable $in wird doch außerhalb der Funktion $__get_in() verändert.
Wie soll man das innerhalb dieser Funktion jemals mitbekommen, wenn das nicht als Referenz im Use-Statement übergeben wird?
(noch besser wäre allerdings statt global oder Referenz die Variable $in einfach immer mit an die Funktion zu übergeben)
Innerhalb der Funktion ist $in immer einfach nur NULL, weil man mit global $in nicht auf das leere Array aus der Methode _scan() zugreift, sondern, weil das ja nicht geht, stattdessen einfach eine neue globale Variable allerdings ohne Wert deklariert.
Diese Funktion ergibt jedenfalls so wie sie da steht einfach keinen Sinn.
Denn $__get_in() gibt immer false zurück!
IMMMER!
(Leider auch mit Deiner Änderung.)
Das muss ich nichtmal testen.
Das sieht doch jeder, der PHP nicht nur für Zusatzstoffe hält.
(die Kritik geht an jenen, der das Ding vor 5 Jahren so programmiert hat)

if( $__get_in() != 'design' ) {
    // validity error.
}

Das ist der eigentliche Grund, warum es scheinbar doch funktioniert.
"Validity Error" hat keinerlei Konsequenzen.
Daher fällt auch niemandem auf, dass man $in als Referenz übergeben muss.
Ist das jetzt die neue Stufe von Fehler im Code zu verschleiern?
Sinngemäß steht da ganze 16 Mal, wenn Fehler, mach einfach weiter.
D.h. invalides XML würde zu unvorhersehbaren Ergebnissen führen.
Hätte man das error handling an dieser Stelle mal zu Ende gedacht, wäre schon längst aufgefallen, dass der Import generell nie funktionieren würde.

if (!is_array($tpl2)) continue;  // neu hinzugefügt

Interessant wäre jetzt an dieser Stelle, herauszufinden, unter welchen Bedingungen $tpl2 kein Array sein sollte.
Denn eigentlich müsste es immer ein Array sein.

Der Fehler liegt in Zeile 474:

$tpl_recs['newname'] = $template->get_name();

Man verändert das Array, über das man gerade iteriert.
Das allein ist schon mal keine gute Idee. Zumal man innerhalb dieser Schleife nochmal über dasselbe Array iteriert (wo dann der Fehler auftritt).
In diesem Fall fügt man einem Array, welches seinerseits auch wiederum Arrays beinhalten soll, einfach einen Wert hinzu, der aber lediglich ein String und kein Array ist.

Was man eigentlich machen will, ist, dem aktuellen Template dieser Iteration, einen neuen Namen geben.
Stattdessen fügt man diesen der Liste aller Templates hinzu -> deshalb der Fehler, weil plötzlich etwas in der Liste ist, was da nicht reingehört. Noch dazu wird dieser Wert niemals korrekt ausgelesen, da man ja zu Beginng der Schleife nicht nach $tpl_recs['newname'] sucht, sondern nach $tpl['newname'].

Ergo müsste man an dieser Stelle folgendes machen:

- entweder man arbeitet auch hier wieder mit Referenzen
- oder man arbeitet mit key => value

also entweder in der ersten Foreach Schleife die Zeile 423:

ändern in

und zusätzlich Zeile 474 ändern in:

$tpl['newname'] = $template->get_name();

Oder Zeile 423 ändern in:

foreach( $tpl_recs as $k => $tpl ) {

und zusätzlich Zeile 474 ändern in:

$tpl_recs[ $k ]['newname'] = $template->get_name();

Alles andere kaschiert den Fehler nur und führt an anderer Stelle wieder zu anderen Problemen - nämlich spätestens dann, wenn es um "newname" geht.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline