Weiterblättern bei Suchergebnissen funktioniert nicht
Author: Ing. Michael Fürst (m.fuerst@bluegate.at)
Web: http://www.bluegate.at
Publiziert: Oktober 2007
Einleitung und Hinweise
Dieses Tutorial ist für die Version 3.0.4 SP 2.1 des XT:Commerce Shops ausgelegt. Die Anwendung des Tutorials erfolgt auf eigene Gefahr und der Author übernimmt keine Haftung für mögliche Schäden am System.
Problemstellung
Nachdem Sie eine Suchabfrage (über die Such-Box oder die erweiterte Suche) durchgeführt haben, können Sie auf der Ergebnisseite nicht weiterblättern, wenn die Anzahl der Suchergebnisse die Anzahl der maximal darzustellenden Produkte übersteigt (z.B.: Seite 1 2 3 [nächste >>])
Lösung: Die Variable $PHP_SELF ist leer
Der Link zum Weiterblättern wird über das Objekt "splitPageResult" mit der Methode "display_links($max_page_links, $parameters = '')" erzeugt. Die zugehörige Datei finden Sie hier:
/includes/classes/split_page_results.php
Zu Beginn der Methode display_links(..) sehen Sie, dass die Variable $PHP_SELF global definiert wird:
... // display split-page-number-links function display_links($max_page_links, $parameters = '') { global $PHP_SELF, $request_type; $display_links_string = ''; ...
In der Variable $PHP_SELF sollte nun eigentlich der Skriptname der aktuell aufgerufenen Seite stehen. Im Fall des Suchergebnisses wäre das "advanced_search_result.php".
Ich konnte jedoch schon auf mehreren Systemen feststellen, dass diese Variable NULL ist. Dadurch ist dann natürlich auch keine korrekte Verlinkung möglich. Im Zusammenspiel mit Direct URL kann dies dazu führen, dass der Link dann mit dem Wert "index.php" gefüllt wird, da leere Links in der Funktion zur Erzeugung der Links ("/inc/xtc_href_link.inc.php") mit diesem Wert überschrieben werden.
Änderung an der Methode löst das Problem
Eine minimale Änderung an der Methode löst dieses Problem. Indem wir den aktuellen Skriptnamen nicht über die Globale $PHP_SELF beziehen sondern in der Methode neu über basename($_SERVER['PHP_SELF']) setzen.
Die aktualisierte Methode, bei der die Links problemlos funktionieren, sieht folgendermaßen aus:
... // display split-page-number-links function display_links($max_page_links, $parameters = '') { global $PHP_SELF, $request_type; $PHP_SELF = basename($_SERVER['PHP_SELF']); // <--- SKRIPT NAME SETZEN $display_links_string = ''; ....
Ursachenforschung...
Das Problem steht laut PHP Dokumentation in direktem Zusammenhang mit der Direktive "register_globals" der php.ini. Ist diese auf "false" gesetzt (aus Sicherheitsgründen der zu bevorzugende Wert), kann mittels $PHP_SELF nicht mehr auf den aktuellen Skriptnamen zugegriffen werden. Stattdessen muss der Zugriff über den Superglobalen Array $_SERVER['PHP_SELF'] erfolgen. Weiters kann bei "register_globals=off" auf POST oder GET Daten nur noch über die Arrays $_GET bzw. $_POST zugegriffen werden.
Auszug aus der PHP Dokumentation:
Warnung
Ab PHP 4.2.0 ist der standardmäßige Wert für die PHP-Anweisung register_globals off. Dies ist eine wesentliche Änderung in PHP. Die Anweisung register_globals off beeinflusst den Satz von vordefinierten Variablen, die im globalen Bereich verfügbar sind. Um zum Beispiel DOCUMENT_ROOT zu bekommen, müssen Sie $_SERVER['DOCUMENT_ROOT'] statt $DOCUMENT_ROOT verwenden oder um $id von der URL www.example.com/test.php zu bekommen $_GET['id'] statt $id oder $_ENV['HOME'] statt $HOME.




















