Autor: fontajos
Datum: 24.11.03 18:56
Hallo Katja,
ok.. dann wollen wir mal...
Nomenklatur: {shopdir} = Grundverzeichnis des PhPepperShops (nach Entpacken des ZIPs = phpeppershop_src)
Es gibt im PhPepperShop grundsätzlich vier Verzeichnisstufen:
1.) {shopdir}/
2.) {shopdir}/shop/
3.) {shopdir}/shop/Frameset/
4.) {shopdir}/shop/Admin/
Die allermeisten für den Shopkunden ausführbaren Scripts findet man im Verzeichnis Nr. 2. (z.B. das bekannte USER_ARTIKEL_HANDLING_AUFRUF.php). Die Ausnahmen sind index.php in Nr. 1 und top.php in Nr. 3. Im Admin Verzeichnis (Nr. 4) sind dann alle Administrationsscripts untergebracht (Admin sollte .htaccess geschützt sein).
Damit wir Scripts von dort wo wir uns befinden (1-4) auch von überall sonst (1-4) includen können, wird der Include Pfad jeweils vor den eigentlichen Includes entsprechend dem Standort des Scripts mit folgendem ini_set Befehl angepasst:
if (PHP_OS == "WINNT" || PHP_OS == "WIN32" || strlen($HTTP_ENV_VARS["windir"]) > 0) {$pd = ";";} else {$pd = ":";}
ini_set("include_path", "./$pd../$pd../../$pd./Frameset$pd./shop$pd/usr/local/lib/php");
Dies war ein Beispiel für ein Script aus Nr. 2.
Nr. 1: ini_set("include_path", "../:./shop/Admin:./:../");
Nr. 3: ini_set("include_path", "./$pd../$pd../../$pd../Frameset$pd/usr/local/lib/php");
Nr. 4: ini_set("include_path", "./$pd../$pd../../$pd../Frameset$pd./shop/Admin$pd./Admin$pd../Admin$pd/usr/local/lib/php");
$pd steht dabei für Path-Delimiter (Pfad Trennzeichen: Bei Windows ist das ein Semikolon beim Rest der Welt ein Doppelpunkt.)
Der 'Trick' / Sinn der ini_set - Übung ist es, den Pfad jeweils so anzupassen, dass aus dem aktuellen Verzeichnis (./) alle weiteren Verzeichniss (Nr. 1-4) via relativer Adressierung (../ oder ../../ oder shop/Admin u.s.w. ...) gefunden werden können -> und somit alle dort plazierten Dateien included werden können.
Wenn man nun kein ini_set hat sollte man am einfachsten den Provider wechseln ... da dies aber nicht zur Debatte steht, muss man für JEDES SCRIPT welches andere Dateien included die jeweils richtigen Pfade vor die zu includenden Dateien setzen. Ich mach das jetzt mal für die Datei {shopdir}/shop/Admin/SHOP_ADMINISTRATION.php (also ein Nr. 4 Script):
Original:
// include Pfad anpassen. Dabei werden die unterschiedlichen Delimiter-Zeichen fuer
// Windows und UNIX/Linux beruecksichtigt. Danke fuer die Idee an Eduard Mas Walgram.
// Windows --> Delimiter = Strichpunkt | UNIX/Linux --> Delimiter = Doppelpunkt
if (PHP_OS == "WINNT" || PHP_OS == "WIN32" || strlen($HTTP_ENV_VARS["windir"]) > 0) {$pd = ";";} else {$pd = ":";}
ini_set("include_path", "./$pd../$pd../../$pd../Frameset$pd./shop/Admin$pd./Admin$pd../Admin$pd/usr/local/lib/php");
// Einbinden der benoetigten Module (PHP-Scripts)
// Bei Unklarheiten, siehe include-Hierarchie in der Dokumentation
if (!isset($ADMIN_Database)) {include("ADMIN_initialize.php");}
if (!isset($ADMIN_SQL_BEFEHLE)) {include("ADMIN_SQL_BEFEHLE.php");}
if (!isset($SHOP_ADMINISTRATION_ARTIKEL)){include("SHOP_ADMINISTRATION_ARTIKEL.php");}
if (!isset($USER_ARTIKEL_HANDLING)){include("USER_ARTIKEL_HANDLING.php");}
...angepasst:
// include Pfad anpassen. Dabei werden die unterschiedlichen Delimiter-Zeichen fuer
// Windows und UNIX/Linux beruecksichtigt. Danke fuer die Idee an Eduard Mas Walgram.
// Windows --> Delimiter = Strichpunkt | UNIX/Linux --> Delimiter = Doppelpunkt
if (PHP_OS == "WINNT" || PHP_OS == "WIN32" || strlen($HTTP_ENV_VARS["windir"]) > 0) {$pd = ";";} else {$pd = ":";}
// ini_set("include_path", "./$pd../$pd../../$pd../Frameset$pd./shop/Admin$pd./Admin$pd../Admin$pd/usr/local/lib/php");
// Einbinden der benoetigten Module (PHP-Scripts)
// Bei Unklarheiten, siehe include-Hierarchie in der Dokumentation
if (!isset($ADMIN_Database)) {include("./ADMIN_initialize.php");}
if (!isset($ADMIN_SQL_BEFEHLE)) {include("./ADMIN_SQL_BEFEHLE.php");}
if (!isset($SHOP_ADMINISTRATION_ARTIKEL)){include("./SHOP_ADMINISTRATION_ARTIKEL.php");}
if (!isset($USER_ARTIKEL_HANDLING)){include("../USER_ARTIKEL_HANDLING.php");}
-------------
Ok, nochmals zusammengefasst. ALLE DATEIEN welche den Befehl include oder include_once oder require oder require_once benutzen, müssen auf die zu includende Datei angepasste Pfade erhalten -> dann gehts auch ohne ini_set.
Einen weiteren Pferdefuss gibt es noch: Wenn man z.B. von {shopdir}/shop/Frameset/top.php (Nr. 3) aus die Datei {shopdir}/shop/USER_ARTIKEL_HANDLING.php (Nr. 2) included, so wird das nicht funktionieren, weil PHP danach als current working directory (./) den Pfad zu Nr. 3 gespeichert hat und nicht - wie erwartet das Nr. 2. Folglich funktionieren (nur dann) alle Anpassungen in den Nr. 2 Scripts nicht mehr, weil der Pfad nicht mehr stimmt. Eine Lösung hierfür wäre vielleicht die Dateien vom Frameset ins Nr. 2 zu zügeln und das Frameset in der index.php ({shopdir}/shop/Admin/indextemplate.txt) entsprechend anzupassen...
Kurzum... es wird wohl immer beim basteln bleiben, bis man zu einem vernünftigen Provider geht -> dazu zählen Tripod und Co. freilich nicht.
Gruss
José
=======================
Entwickler PhPepperShop
=======================
Nachricht bearbeitet (11-24-03 19:24)
|
|