2016-08-09 23 views
1

Ich habe eine HTML-Datei, die von selbst funktioniert. Die HTML-Datei enthält einige relative Pfade.PHP include HTML-Datei mit relativen Pfad

Wenn ich die HTML-Datei in PHP einschließen, stoße ich auf Probleme mit relativen Pfaden.

Die chart.html Datei hat ein script src wie folgt aus:

<script src="./data/data.js"></script> 

und index.php sind wie folgt aussieht:

include('./chart/chart.html'); 

Der Fehler, den ich in Browser erhalten auf diese Fehler:

X GET http://localhost/project/data/data.js 

Offensichtlich ist der Weg für data.js fehlt das Diagramm Ordner. Es sollte so aussehen: http://localhost/project/chart/data/data.js

Hier ist meine Ordnerhierarchie:

Sites/ 
    project/ 
    index.php 
    chart/ 
     chart.html 
     data/ 
      data.js 

Ich weiß, dass ich die HTML-Datei ändern kann, und das Diagramm auf den Pfad hinzufügen, aber das wird die HTML-Datei nicht zu sein, sichtbar machen von selbst. Im Grunde nimmt die HTML-Datei an, dass der Pfad auf dem aktuellen relativen Pfad von chart.html basiert. Also, was ist der richtige Weg, um PHP diese HTML-Datei enthalten und nicht die relativen Pfade durcheinander bringen?

+0

Warum nicht die absolute URL verwenden? –

+1

Versuchen Sie, ''. Von dem Fehler, ich denke, das 'php'-Skript beginnt, aus dem aktuellen Arbeitsverzeichnis zu suchen und daher erhalten Sie einen Fehler. –

+0

@VivekPradhan Ihre vorgeschlagene Lösung würde die Funktionalität der eigenständigen 'chart.html' Datei, die benötigt wird, durchbrechen. –

Antwort

3

Das Problem hier ist die Diskrepanz zwischen absoluten und relativen Pfaden. Indem Sie es in einen anderen Pfad einbinden, den Pfad von chart.html effektiv ändern, aber den relativen Pfad der abhängigen Dateien NICHT ändern, brechen Sie den Code.

Es gibt die Basis-Tag https://developer.mozilla.org/en/docs/Web/HTML/Element/base, die Sie in den Kopf setzen könnten. Dies kann jedoch die Situation verschlimmern, da der andere Inhalt, den Ihre index.php enthalten könnte, nicht mehr funktioniert, es sei denn, diese verwenden absolute Pfade. Wenn Sie dies nicht tun, könnte eine gute Lösung sein.

Die zweite Lösung wäre wahrscheinlich (programmatisch) nach relativen Pfaden in Ihrem HTML zu suchen und diese Pfade durch korrigierte Pfade im laufenden Betrieb zu ersetzen. Es gibt einige seltsame Fälle, in denen Javascript in HTML verwendet wird und es möglicherweise einen "Anti-Kopierschutz" -JS-Code gibt, der wahrscheinlich daran ersticken wird.

Die dritte Lösung (abhängig von Ihrem Anwendungsfall natürlich) wäre, die HTML nicht zu enthalten, sondern stattdessen eine iframe in Ihrer Ausgabe, wo Sie auf den richtigen Pfad zeigen. Da es vom richtigen Pfad geladen wird, sollten relative Pfade wieder funktionieren. (Ich würde das vorziehen, vor allem, wenn es eine Art von "Vorschau" -Funktionalität ist, nach der Sie suchen).

Eine andere Lösung könnte eine andere index.php in den Planordner zu setzen, dass - indem (und den ursprünglichen index.php s Code flexibel genug zu machen) - wird die gleiche Arbeit wie das Original index.php tun, aber, wie es verlangt wird Von einem anderen Weg aus ist alles in Ordnung.

Ein anderer Ansatz wären URL-Umschreibungen, bei denen Sie als erscheinen lassen könnten, als ob die index.php im Diagrammverzeichnis wäre (möglicherweise ist eine Umleitung vom ursprünglichen Aufruf erforderlich). URL-Rewrites können je nach Ihrer gesamten Konfiguration schwierig sein.

Das sind meine Vorschläge, je nachdem, was Sie eigentlich mit Ihrem Projekt machen wollen, könnte es geeignetere Lösungen geben.

Update der zusätzlichen index.php Lösung:

Beachten Sie, dass dies nur für die Ansicht ein Projekt zu einer Zeit arbeiten, und gleichzeitig nicht mehrere. Auch das hängt stark davon ab, was Ihr index.php tut oder wie es funktioniert. Lassen Sie mich annimmt, dass es wie folgt aussieht:

<?php 
$project = !empty($_POST['project']) ? $_POST['project'] : ''; 
$projects = array('chart', 'otherproject'); 
if(in_array($project, $projects)) { 
    include $project.'/'.$project.'.html'; 
} 
foreach($projects as $p) { 
    echo '<a href="?project='.$p.'">'.$p.'</a>'; 
} 

nun die neuen chart/index.php würde wie etwas tun:

<?php $project='chart'; include '../index.php'; 

und müssen Sie zu Ihrem ursprünglichen ändern /index.php zu:

<?php 
$project = !empty($project) ? $project : '';     // <-- changed 
$projects = array('chart', 'otherproject'); 
if(in_array($project, $projects)) { 
    include $project.'/'.$project.'.html'; 
} 
foreach($projects as $p) { 
    echo '<a href="/URL/TO/ROOT/'.$p.'/index.php">'.$p.'</a>'; // <-- changed 
} 
+0

Eine andere Lösung könnte sein, eine andere index.php in den Diagrammordner zu setzen, die - indem sie (und macht den ursprünglichen index.phps Code flexibel genug) - die gleiche Arbeit macht wie die ursprüngliche index.php, aber wie es von einem anderen Pfad angefordert wird, ist alles in Ordnung. -> Könnten Sie mehr dazu sagen? Wenn es funktioniert, ist es die beste Idee. Ich habe es versucht, aber index.php im Diagrammordner sollte immer noch die chart.html als ./chart/chart.html enthalten. Die neue index.php versteht nicht, dass sie neben der chart.html sitzt. – apadana

+0

@apadana Auch hier können Sie 'include' verwenden, die Pfade relativ zum root anstelle des aktuellen Verzeichnisses verwenden. – klaar

+0

@apadana aktualisierte meine Antwort. Ich hoffe, das hilft; o) – Jakumi