in der Version 4.8.9 von Contenido gibt es mit dem neu eingeführten URL-Feature Probleme, auf die achiboy aufmerksam gemacht hat (vielen Dank dafür). In diesem Thread möchte ich kurz darauf eingehen und Lösungsvorschläge zum Beheben der Probleme schildern.
Zusammenfassung der Thread von achiboy:
- Problem mit Weiterleitung nach Update auf 4.8.9
- Problem mit error_site nach Update auf 4.8.9
- Problem mit login_error_page nach Update auf 4.8.9
Was ist das URL-Feature?
Ziel von diesem Feature (Klasse Contenido_Url), interne URLs entgegen zu nehmen und diese für die Ausgabe vorzubereiten. Die entgegengenommenen Werte, es handelt sich um eine assoziative Parameterliste (array('idart'=>123, 'idcat'=>32)), werden an einen beliebigen URL-Builder übergeben, der sich dann um die Erstellung der URL kümmert.
Per default ist der URL-Builder Contenido_UrlBuilder_Frontcontent konfiguriert der URLs wie front_content.php?idart=123&idcat=32 erstellt. Das maskierte '&'-Zeichen, das für die Ausgabe von validen XHTML-Seiten nötig ist, wirkt sich bei Weiterleitungen mit der header-Direktive nachteilig aus, dort sollte das &-Zeichen nicht maskiert werden, da manche Clients das nicht richtig interpretieren können.
Im Folgenden ist eine Anleitung zum beheben dieses Problems, das ausschließlich die Contenido Version 4.8.9 betrifft.
/cms/front_content.php:
Zeile 289 von
Code: Alles auswählen
$errsite = 'Location: ' . Contenido_Url::getInstance()->build($aParams));
Code: Alles auswählen
$errsite = 'Location: ' . str_replace('&', '&', Contenido_Url::getInstance()->build($aParams);
Zeile 949 von
Code: Alles auswählen
$redirect_url = $oUrl->build($aUrl['params']);
Code: Alles auswählen
$redirect_url = str_replace('&', '&', $oUrl->build($aUrl['params']));
/cms/front_crcloginform.inc.php:
In dieser Seite gibt es gleich 2 Probleme, zum einen die Sache mit der Weiterleitung, zum Anderen die Steuerung der eigenen Loginfehler-Seite.
Eine eigene definierte Loginfehlerseite wird nicht mehr angesprochen, man landet immer auf der front_crcloginform.inc.php. Das lässt sich beheben, indem die Zeilen 39 ff von
Code: Alles auswählen
#$err_catart = trim(getEffectiveSetting("login_error_page", "idcatart", ""));
#$err_cat = trim(getEffectiveSetting("login_error_page", "idcat", ""));
#$err_art = trim(getEffectiveSetting("login_error_page", "idart", ""));
Code: Alles auswählen
$err_catart = trim(getEffectiveSetting("login_error_page", "idcatart", ""));
$err_cat = trim(getEffectiveSetting("login_error_page", "idcat", ""));
$err_art = trim(getEffectiveSetting("login_error_page", "idart", ""));
Dann noch die header-Direktiven folgendermaßen anpassen:
Zeile 69 von
Code: Alles auswählen
$sErrorUrl = $oUrl->build($aUrl['params']);
Code: Alles auswählen
$sErrorUrl = str_replace('&', '&', $oUrl->build($aUrl['params']));
Code: Alles auswählen
$sErrorUrl = $oUrl->build($aUrl['params']);
Code: Alles auswählen
$sErrorUrl = str_replace('&', '&', $oUrl->build($aUrl['params']));
Weiterleitungen zur Homepage:
Ein weiterer Nebeneffekt der verwendeten Url-Builder Klassen ergibt sich in Verbindung mit Weiterleitungen zur Homepage in Artikeleigenschaften. Wird dort eine Weiterleitung nur mit "front_content.php" (ohne Parameter idart, idcat oder idcatart) angegeben, quitiert das Frontend die Ausgabe mit einem Fehler (http://forum.contenido.org/viewtopic.php?t=22975).
Das liegt daran, dass Url-Builder aufgrund der Abwärtskompatibilität mindestens einen Parameter (idcat, idart, oder idcatart) erwarten.
Beheben könnt ihr dies, indem ihr bei Artkelweiterleitungen zur Homepage eines der Parameter mit angibt (front_content.php?idart=123 oder front_content.php?idcat=1 oder front_content.php?idcatart=12) oder die entsprechende Stelle in der front_content.php entschärft in dem ihr die Zeilen 944 ff von
Code: Alles auswählen
$oUrl = Contenido_Url::getInstance();
$aUrl = $oUrl->parse($redirect_url);
if (!isset($aUrl['params']['lang'])) {
$aUrl['params']['lang'] = $lang;
}
$redirect_url = $oUrl->build($aUrl['params']);
header("Location: $redirect_url");
Code: Alles auswählen
# $oUrl = Contenido_Url::getInstance();
# $aUrl = $oUrl->parse($redirect_url);
# if (!isset($aUrl['params']['lang'])) {
# $aUrl['params']['lang'] = $lang;
# }
# $redirect_url = $oUrl->build($aUrl['params']);
header("Location: $redirect_url");
Grüße
xmurrix