ebody: HTML Menü mit php include einbinden und relative Pfade nutzen

Hallo,

ich binde eine HTML Datei mit einem Menü in verschiedene HTML Seiten mit <?php include(); ?> ein. Die Seiten befinden sich in unterschiedlichen Ordnern und Ebenen.

Die Menü Datei befindet sich im Ordner /include/

  • /de/include/
  • /de/include/menu.html

Die menu.html Seite greift auf Bilder und CSS Dateien im Ordner /menu/ zu

  • /de/menu/img/
  • /de/menu/css/

In die index.php Seiten wird die Datei /include/menu.html eingebunden:

  • /de/index.php
  • /de/vw/index.php
  • /de/vw/beatle/index.php
  • /de/porsche/index.php

Egal in welcher Seite und Ebene die menu.html eingebunden wird, die Pfade innerhalb der Datei müssen immer auf den Ordner /menu/ zugreifen.

Da ich die Seite über localhost, einer lokalen IP und der Domain selbst teste, möchte ich gerne relative Pfade innerhalb der menu.html verwenden.

Ich habe (glaube ich) jede Variante mit...

  • ../de/menu/img/file.svg
  • ./de/menu/img/file.svg
  • /de/menu/img/file.svg
  • de/menu/img/file.svg

...ausprobiert, aber ich konnte bisher keinen relativen Pfad finden, der in jeder Ebene funktionieren würde.

Ist das in diesem Fall überhaupt möglich oder müsste ich absolute Pfade verwenden oder mit PHP z.B. die Pfade innerhalb der menu.html (dann menu.php) anpassen?

Gruß ebody

  1. @@ebody

    Ich habe (glaube ich) jede Variante mit...

    • ../de/menu/img/file.svg
    • ./de/menu/img/file.svg
    • /de/menu/img/file.svg
    • de/menu/img/file.svg

    ...ausprobiert

    Du hast (glaube ich) /de/menu/img/file.svg doch nicht ausprobiert?

    🖖 Stay hard! Stay hungry! Stay alive! Stay home!

    --
    Home Office ist so frustierend, weil man jetzt noch viel stärker bemerkt mit wievielen Menschen man zu tun hat, die nicht sinnerfassend lesen können. (@Grantscheam)
    1. Hallo Gunnar,

      Du hast (glaube ich) /de/menu/img/file.svg doch nicht ausprobiert?

      kommt drauf an, wie seine Server aussehen. Wenn's sowas wie das hier ist:

      http://example.org/foo/bar/demopage.php
      http://localhost:8084/bar/demopage.php
      http://10.2.3.4/test/bastel/bar/demopage.php

      dann kommt man mit einem server-absoluten Pfad nicht hin.

      Natürlich kann man sich seine Test-Server passend konfigurieren, dass der Path-Teil der URL immer gleich ist. Aber wenn ebody diese Möglichkeit hätte, würde er wohl nicht fragen. Glaube ich 😉

      Rolf

      --
      sumpsi - posui - obstruxi
  2. Hallo ebody,

    da die menu.html aus Sicht des Browsers gar nicht existiert, sondern als Teil von (beispielsweise) /index.php, /foo/data.php und /bar/baz/info.php ausgeliefert wird, hast Du keine Chance, das allein in menu.html zu lösen.

    Ich hatte das Problem in einer mit Klassen organisierten PHP Anwendung auch. Da gab es im Wesentlichen eine Einstiegsseite, die auf www.example.org/foo/test.php zu finden war, und wenn ich lokal getestet habe, war es localhost:8080/test.php.

    Meine beiden Lösungen sehen so aus:

    Das kann man konfigurationsfrei lösen. Du brauchst dafür folgende Informationen:

    • wo im Filesystem des Servers liegt das Root-Verzeichnis des Web
      Das kann menu.php mit Hilfe von FILE ermitteln, wenn es die Minimalinformation hat, wo es sich selbst relativ zum Web-Root befindet. Liefert FILE beispielsweise den String /usr/web/ebody/testapp/de/include/menu.php, dann kann menu.php wissen, dass das Projekt in /usr/web/ebody/testapp liegt.
    • wo, relativ zum lokalen Root-Verzeichnis, liegt die aufgerufene PHP Datei
      Hier kommt $_SERVER['SCRIPT_FILENAME'] ins Spiel. Darin steht, welche PHP Datei der Webserver gestartet hat, als lokaler Pfad auf dem Server. Es könnte zum Beispiel /usr/web/ebody/testapp/demo1/page.php sein. menu.php entfernt den Root-Ordner und weiß nun: /demo1/page.php wurde aufgerufen.
    • Daraus gewinnt man die Information, wieviele Ordner tief die aufgerufene PHP Seite liegt, und kann die richtige Anzahl von ../ vor die Ressourcenpfade setzen.

    Eine Lösung mit Konfigurationsdatei ist, das Web-Root in einer include-Datei abzulegen, die nicht mit deployed wird. Um diese include-Datei finden zu können, müssen die includenden PHPs aber auch wissen, wo sie sich im Web-Baum befinden. Oder Du verwendet den include_path.

    <?php 
    $ServerSetup = ARRAY('WWW-Root' => '/test1'):
    

    Diese Datei kann menu.php includen, oder Du includest die Datei in allen Einstiegsscripten und verwendest $ServerSetup (oder wie auch immer Du sie nennen magst) als globale Variable. Bei Bedarf setzt Du dann $ServerSetup['WWW-Root'] als Präfix für alle Ressourcen-URLs.

    Rolf

    --
    sumpsi - posui - obstruxi