Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.
Seiten: 1
#1 14. September 2011 15:07
- faglork
- arbeitet mit CMS/ms
- Ort: Fränkische Schweiz
- Registriert: 15. Dezember 2010
- Beiträge: 1.152
- Webseite
Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
Moin!
Wenn ich folgenden code in der Version 1.9.4.2 in einen UDT einbaue:
global $gCms;
$classes = array();
$manager =& $gCms->GetHierarchyManager();
$thisPage = $gCms->variables['content_id'];
$currentNode = &$manager->sureGetNodeById($thisPage);
while( isset($currentNode) && $currentNode->getLevel() >= 0 ) {
$currentContent =& $currentNode->getContent();
array_unshift($classes, $currentContent->Alias());
$currentNode =& $currentNode->getParentNode();
}
dann resultiert das im Testbereich im Backend mit einer einwandfreien Ausgabe (kommmt weiter unten im code), im Frontend jedoch ladet das script in einer Endlosschleife:
PHP Fatal error: Maximum execution time of 30 seconds exceeded in /path/to/webroot/lib/classes/class.cms_tree.php on line 313
Dasselbe script in einer anderen 1.9.4.2-Installation funzt.
Kann mir mal bitte jemand nen Tipp geben?
Servus,
Alex
Beitrag geändert von faglork (14. September 2011 15:08)
Offline
#2 14. September 2011 15:17
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.437
Re: Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
Wo liegt der Unterschied bei den beiden Seiten?
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
#3 14. September 2011 15:32
- piratos
- arbeitet mit CMS/ms
- Registriert: 12. August 2011
- Beiträge: 545
Re: Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
[== php ==]
while( is_object($currentNode) ) {
es wird ein object oder null zurück gegeben wäre also mit isset immer gesetzt = endlos.
Offline
#4 16. September 2011 12:03
- faglork
- arbeitet mit CMS/ms
- Ort: Fränkische Schweiz
- Registriert: 15. Dezember 2010
- Beiträge: 1.152
- Webseite
Re: Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
Wo liegt der Unterschied bei den beiden Seiten?
Ahhh ... Mle CMS ... ich ahne da was ...
habs jetzt anders gelöst. Es gibt einen Tag "sectionimage" welcher allerdings - zumindest bei mir - nicht funktioniert hat. Nach erfolgreicher "Reparatur" funktioniert das Teil einwandfrei - wers verwenden will:
Der verwendete Pfad war nicht der Serverpfad, sonder ein relativer Pfad ausgehend vom document_root (steht so in der Tag-Hilfe). PHP file_exists verlangt aber den Serverpfad. Also habe ich den ergänzt:
$servpath = $gCms->config['root_path'];
und die Abfrage geändert auf
if(!file_exists($servpath.$imSpec.$extension))
Voila! Funzt!
Zusätzlich habe ich noch einen default Wert für $default_image eingetragen:
$default_image = isset($params["default_image"]) ? $params["default_image"] : 'top' ;
... damit ich nicht immer das default Image extra angeben muss.
Und weil ich kein Bild als Ausgabe wollte sondern einen style habe ich die Ausgabe ersetzt durch
echo "<style type='text/css'>div#pagewrapper {background-image: url(${imSpec}${extension});}</style>";
und dann {sectionimage levels="4"} im Seitentemplate in den <head> eingefügt, unterhalb des CSS.
Servus,
Alex
Beitrag geändert von faglork (16. September 2011 12:11)
Offline
#5 16. September 2011 12:53
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.437
Re: Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
Dennoch ist da ein Fehler in der While-Schleife.
Wie Piratos sagte:
$currentNode = &$manager->sureGetNodeById($thisPage);
gibt entweder false oder ein Objekt zurück. (theoretisch)
Somit ist zumindest dieser Teil der While-Schleife immer erfüllt:
while ( isset($currentNode) ... )
Das allein führt allerdings nicht zur Endlos-Schleife, denn der zweite Teil der While-Scheife:
while( ... $currentNode->getLevel() >= 0 )
ist nur dann erfüllt, wenn $currentNode ein Objekt ist und dessen Level größer oder gleich 0 ist. Merkwürdigerweise scheint die Level in Deinem Fall nie kleiner 0 zu sein (theoretisch geht das auch garnicht anders, denn wenn ein Inhaltsobjekt existiert, dann ist dessen Level automatisch immer größer oder gleich 0. Nur Objekte, die nicht existieren, hätten eine Level von -1, aber das ist natürlich ein Widerspruch... ). Also muss $currentNode nur ein Objekt sein, damit auch diese Bedingung erfüllt ist.
Denn wenn es kein Objekt wäre, würde hier mit einem fatalen Fehler abgebrochen werden. Scheinbar liefert aber die letzte Zeile der While-Schleife bei Dir immer ein Objekt:
$currentNode =& $currentNode->getParentNode();
Somit wären wir auch bei Piratos Lösung bei einer Endlos-Schleife.
Die Frage ist also, warum liefert $currentNode->getParentNode() bei Dir immer ein Objekt?
Ich würde sagen, Fehler im Core. Aber da muss ich erstmal etwas genauer schauen.
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
#6 16. September 2011 15:41
- faglork
- arbeitet mit CMS/ms
- Ort: Fränkische Schweiz
- Registriert: 15. Dezember 2010
- Beiträge: 1.152
- Webseite
Re: Seltsamer Fehler in UDT ... Endlosschleife? Aber wo?
Ich würde sagen, Fehler im Core. Aber da muss ich erstmal etwas genauer schauen.
Aber auf zwei Installationen funzt das einwandfrei. Keine Endlosschleife. Nur bei einer, der mit Mle CMS ... vielleicht liegts eher daran.
Servus,
Alex
Offline
Seiten: 1