Mit include einbinden in verschiedenen Ebenen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Huchinotte
Mitglied
Beiträge: 765
Registriert: 24.10.2007 09:34

Mit include einbinden in verschiedenen Ebenen

Beitrag von Huchinotte »

Hi ....

bin grad dabei eine Webseite zu basteln. Dazu verwende ich bei den Hauptseiten die alle im Root liegen, den include Befehl um den Header und das menue zu includieren, was auch so weit funktioniert

Code: Alles auswählen

<!-- header-->
<?php include ("header.php");?> 
<!-- ende header-->

<!-- menue-->
<?php include ("menue.inc.php");?> 
<!-- ende menue-->
Nun habe ich aber noch im Root einen Unterorder der jeweil nochmals einen Ordner enthällt ... in diesem habe ich dann noch weitere Seiten sprich ungefähr so
Root --> Bilder --> Party - party.php
Nun möchte ich in der party.php natürlich auch das menue und den header includieren, aber das funktioniert nur wenn ich den direkten Pfad in die Include Anweisung angebe. Aber das ist ja nicht Sinn der Sache. Wie muss der Include Befehl aussehen damit ich auch darüber gelegene Dateien includieren kann?

Gruß Huch
Benutzeravatar
Frank1604
Ehemaliges Teammitglied
Beiträge: 2106
Registriert: 07.11.2007 09:25
Wohnort: Einhausen
Kontaktdaten:

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von Frank1604 »

Hallo,

du musst den Pfad dann relativ angeben. also so ungefähr:

Code: Alles auswählen

    <!-- header-->
    <?php include ("../header.php");?>
    <!-- ende header-->

    <!-- menue-->
    <?php include ("../menue.inc.php");?>
    <!-- ende menue-->
Gruß, Frank
Meine Meinung steht fest. Bitte verwirrt mich nicht mit Tatsachen!
Huchinotte
Mitglied
Beiträge: 765
Registriert: 24.10.2007 09:34

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von Huchinotte »

Hi ......

ja das mit dem relativen Pfad habe ich auch schon versucht. Wenn ich das ganze Lokal teste mit xaamp dann bekomme ich folgende Fehlermeldung wenn ich auf die Seiten im Unterordner zugreife

Code: Alles auswählen

Warning: include(../header.php) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\web-server\hp_pfiff\bilder\party\party_1.php  on line 2

Warning: include() [function.include]: Failed opening '../header.php' for inclusion (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\web-server\hp_pfiff\bilder\party\party_1.php on line 2

Warning: include(../menue.inc.php) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\web-server\hp_pfiff\bilder\party\party_1.php on line 5

Warning: include() [function.include]: Failed opening '../menue.inc.php' for inclusion (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\web-server\hp_pfiff\bilder\party\party_1.php on line 5
Bin jetzt nicht die Leuchte in Sachen php aber was bedeutet (include_path='.;C:\xampp\php\pear\')

Gruß Huch
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von P7BB »

Es sagt dir, dass der Pfad ungültig ist. Also Um das mit relativen Pfaden (Pfäden?) zu erleutern:
../ bedeutet, dass du ein verzeichnis zurückgehst. Nach dem / kommt dann die Pfadangabe. Du könntest auch 2 Verzeichnisse zurückgehen: ../../
./ bedeutet, dass es sich um das selbe Verzeichnis handelt. "./index.php" ist also das gleiche, wie "index.php". Du kannst es auch mit dem vorherigem Verzeichnis kombinieren: ./../ oder .././ wobei beides den gleichen effekt hat, wie ../

wenn also jetzt die header.php und die menu.inc.php in dem root-verzeichnis liegen, muss der pfad von der party.php folgender sein: ../../header.php und ../../menu.inc.php
So einfach ist das schon ;)
Huchinotte
Mitglied
Beiträge: 765
Registriert: 24.10.2007 09:34

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von Huchinotte »

Hi .........P7BB,

danke für die Erklärung. Die Fehlermeldungen habe ich nun weg und auch die Seite wird mir angezeigt, aber nicht so als wenn ich auf die Hauptseiten zugreife. Der Punkt ist das die ganzen formatierungen aus der css nicht genommen werden.
Wenn ich auf den Seiten im Rootverzeichnis bin funktioniert alles so weit. Gehe ich dann auf die php Seite wo im Unterordner liegt wird die css wohl nicht geladen.
Genauso verhält es sich mit dem Menue das ich include. Auf den Hauptseiten heissen die Links

Code: Alles auswählen

http://localhost/web-server/hp_pfiff/galerie.php
auf der Unterseite "http://localhost/web-server/hp_pfiff/bi ... arty_1.php" wird daraus

Code: Alles auswählen

http://localhost/web-server/hp_pfiff/bilder/party/galerie.php
Die CSS lade ich in der header.php und das menue natürlich in der menue_inc.php. Also wird zwar die header.php included aber die css nicht dabei geladen. Und die menue_inc.php wird auch included aber die Links werden irgendwie umgewandelt.
Den include Befehl habe ich abgeändert wie du es beschrieben hast

Code: Alles auswählen

<!-- header-->
<?php include ("../../header.php");?>
<!-- ende header-->
<!-- menue-->
<?php include ("../../menue.inc.php");?>
<!-- ende menue-->
Es sieht so aus das er auf den Unterseiten alle zu ladenden Funktionen wie die css und die Menuelinks nun mit den Pfad belegt wo sich die Unterseiten befinden. Hm schwer zu erklären aber als Beispiel die css. diese liegt im Root also unter

Code: Alles auswählen

http://localhost/web-server/hp_pfiff/format.css
und diese wird auf der Unterseite nun so aufgerufen

Code: Alles auswählen

http://localhost/web-server/hp_pfiff/bilder/party/format.css
Und wenn ich das richtig verstehe scheint mir das auch klar denn die css wird ja im header aufgerufen

Code: Alles auswählen

<link rel="stylesheet" href="format.css" type="text/css" />
und da ich diese jetzt include wird der Pfad von dem unterordner jetzt mit integriert aber dort liegt diese nicht. Ich denke ich muss noch irgendwie die drectory mit angeben? Bin mir aber nicht sicher!


Gruß Huch
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von P7BB »

Ja, das Problem ist eigentlich kein Problem, sondern eine logische Folge aus deinem Vorhaben ;)
Die Datei liegt im bilder/party/-Ordner, das heißt, dass alle relativen Pfade auch von dieser Datei ausgehen. So führen relative Menülinks zu einer Datei, die relativ vom bilder/party/-Ordner ausgeht.
Das Problem kannst du so beseitigen: Definiere in jeder PHP-Datei sowas wie $root_dir mit dem wert "./" oder auch "../../",...
Diese Variable wird nun in allen Dateien benutzt, um auf den root-Ordner zurückzuverweisen und anschließend werden alle Pfade vom root-Ordner aus verlinkt.
Beispiel:

party.php

Code: Alles auswählen

<?php
$root_dir = "../../"; // root verzeichnis liegt 2 Verzeichnise unter dem der party.php

...

?>
header.php

Code: Alles auswählen

...
<link rel="stylesheet" href="<?php echo $root_dir; ?>/format.css" type="text/css" />
...
Die Variable $root_dir hat eben nun immer den Teilpfad so angepasst, dass er zum root-Ordner hinführt.
Sollte jetzt die format.css aber beispielsweise in einem ordner "template" liegen, so würde der pfad so aussehen müssen:

Code: Alles auswählen

...
<link rel="stylesheet" href="<?php echo $root_dir; ?>/template/format.css" type="text/css" />
...
Sofern $root_dir nicht gesetzt ist, steht dort einfach nur das hier:

Code: Alles auswählen

...
<link rel="stylesheet" href="/format.css" type="text/css" />
...
"/format.css" ist gleichzusetzen mit "./format.css"

Edit: 333 Beiträge *g*
Huchinotte
Mitglied
Beiträge: 765
Registriert: 24.10.2007 09:34

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von Huchinotte »

Hi .............

super das klappt ja schon einmal sehr gut. Also alle Seiten funktionieren jetzt und auch die Links vom Menue gehen jetzt auf der Unterseite. Folgendes habe ich jetzt gemacht

party.php

Code: Alles auswählen

<!-- header-->
<?php $root_dir = "../../";
include ("../../header.php");?>
<!-- ende header-->
<!-- menue-->
<?php $root_dir = "../../";
include ("../../menue.inc.php");?>
<!-- ende menue-->
header.php (teilauszug aus den relevanten Funktionen)

Code: Alles auswählen

<script type="text/javascript" src="<?php echo $root_dir; ?>/highslide/highslide-with-gallery.js"></script>
<link rel="stylesheet" href="<?php echo $root_dir; ?>/highslide/highslide.css" type="text/css"/>
<link rel="stylesheet" href="<?php echo $root_dir; ?>/format.css" type="text/css" />

<script type="text/javascript">
hs.graphicsDir = '<?php echo $root_dir; ?>/highslide/graphics/';
menue.inc.php (mal einen Links als Beispiel)

Code: Alles auswählen

<a href="<?php echo $root_dir; ?>/index.php"  onfocus="this.blur()">&nbsp;&nbsp;Home</a></td>
So weit so gut. Nur habe ich jetzt noch einen Schönheitsfehler. Wenn ich local per xaamp auf die Seite zugreife und mich im Root bewege werden die Links so dargestellt

Code: Alles auswählen

http://localhost/food.php
so gehe ich nun richtung der party.php ins Unterverzeichnis passt das auch noch. Nur wenn ich jetzt von der Unterseite wieder zurück gehe z.B. auf die oben genannte food.php dann wird plötzlich

Code: Alles auswählen

http://localhost//food.php
draus. Sprich der Backslash hat sich vermehrt. Und wenn ich dann auf der mit dem doppelten Backslash wieder zurück auf die Unterseite und wieder zurück auf die food.php sinds auf einmal 3 Backslashes, es wird dann immer ein dazu addiert.
Ich denke hab wohl in der Unterseite (party.php) doch noch einen Fehler drinn beim includen.

Edit: hm jo Fehler gefunden im Link muss der backslash raus vor dem filenamen

Gruß Huch
P7BB
Mitglied
Beiträge: 383
Registriert: 15.07.2008 19:40

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von P7BB »

Huchinotte hat geschrieben:Edit: hm jo Fehler gefunden im Link muss der backslash raus vor dem filenamen
Oh, dann ist der Slash doch nicht gleichzusetzten mit ./ :o

Aber ok, wieder was gelernt :D
Ossiost
Mitglied
Beiträge: 2
Registriert: 02.03.2014 11:03

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von Ossiost »

Hallo,
ich weiß eure Beiträge zu diesem Thema sind schon etwas her, aber ich habe es über die Suchfunktion gefunden und denke mein Problem ist recht ähnlich, aber ich verstehe die Lösung noch nicht ganz, vielleicht könnt ihr mir da helfen.

Also zu meiner Situation. Ich bin dabei die Seite von unserem Sportverein zu aktualisieren. Da war schon länger keiner mehr dran und deshalb ist die noch auf iFrame Basis aufgebaut. Also das Menü und der Header sind in einem iFrame und die Inhalte werden dann immer in ein weiteres geladen. Da das ja nicht mehr wirklich zeitgemäß ist würde ich gerne auf php "umstellen".
Die Seite hat allerdings schon eine ganz ordentliche Größe und ist deshalb zur Übersichtlichkeit in mehrere Ordner und Unterordner aufgeteilt.
z.B.: rootdir/Aktuelles/Berichte/2014/Bericht1.html
Die Anzahl der Unterordner variiert aber denn es gibt auch mal Übersichtsseiten, wo dann eine Liste mit allen Berichten aus einem Jahr ist...

Jetzt meine Idee:
Ich habe ein Tutorial über die Include Funktion in php gesehen in dem der Autor sein Menü ausgelagert hat mit der Begründung, dass er es dann nicht auf allen Unterseiten bearbeiten muss, wenn er es mal verändern will, sondern nur eine Datei verändert und dann wird ja überalle die veränderte Menü datei included. Ich hab mir gedacht perfekt das brauche ich, auch wenn das ne Menge Copy and Paste Arbeit heißt, weil ich ja dann auf allen Unterseiten die include Funktion unterbringen muss, aber es danach ja dann leicht habe.

So jetzt das Problem:
Wie kriege ich es hin, dass die Pfade in meinem Menü auf allen Unterseiten stimmen? Weil ich habe gemerkt, dass meine menu.html datei ja eins zu eins an die stelle geladen wird, wo ich die include Funktion benutzt habe. Aber wenn ich mich jetzt in unterschiedlichen Ebenen befinde, dann ändern sich ja auch die relativen Pfade. Gibt es vielleicht eine Möglichkeit, dass ich alle Seiten von der menu.html Datei aus verlinke und das dann jeweils angepasst wird für die Unterseiten?

Falls ihr genau das hier schon erklärt habt, dann verzeiht mir bitte und erklärt es nochmal für einen totalen php Neuling.

Schon mal danke für die HIlfe :)
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Re: Mit include einbinden in verschiedenen Ebenen

Beitrag von D@ve »

Natürlich könntest Du jetzt automatisch die Ordner scannt und Dir daraus ein Menü bastellt, aber gnaz ehrlich... Das hier...
Die Seite hat allerdings schon eine ganz ordentliche Größe und ist deshalb zur Übersichtlichkeit in mehrere Ordner und Unterordner aufgeteilt.
z.B.: rootdir/Aktuelles/Berichte/2014/Bericht1.html
...sieht mir stark danach aus, dass Du Dir ein CMS installieren solltest (Drupal, oder Joomla etc). Das wird zwar mal einmal richtig Arbeit, die Artikel einzupflegen. Aber imo tust Du Dir keinen Gefallen damit, HTML-Seiten von Hand zu pflegen.

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Antworten

Zurück zu „Coding & Technik“