2010-07-25 4 views
0

Je me suis rendu compte que j'utilisais une fonction particulière encore et encore dans mes fichiers PHP, donc j'ai enlevé la fonction de chacun d'entre eux et l'ai placée dans un fichier PHP séparé et l'ai inclus là où j'en ai besoin. Maintenant, lorsque je fais des mises à jour à la fonction, tous les fichiers qui l'utilisent sont mis à jour. Génial.PHP Inclut l'appel d'autres fichiers

Maintenant, il y a juste un problème, la fonction elle-même utilise des URL relatives, et quand vous incluez le PHP les fichiers sont relatifs au PHP appelant, pas au répertoire PHP inclus. Je sais que la réponse rapide et simple est d'utiliser des liens absolus, mais comment puis-je obtenir le PHP inclus pour référencer les choses à ITSELF et pas au PHP qui l'a appelé.

Exemple:

index.php comprend un fichier appelé create_table.php ..... create_table.php échos CSS et javascript index.php. Le CSS et javascript sont dans le même répertoire que create_table.php, mais en utilisant src = "javascript.js" il veut trouver le javascript.js où index.php se trouve, pas où se trouve create_table.php.

Edit: comment la structure fonctionne

/includes/create_table.php

/includes/style.css /includes/javascript.js
/test/dir/1/2/3/index .php

Alors, quand je tente d'utiliser src = "javascript.js" au lieu de chercher /includes/javascript.js il essaie de trouver /test/dir/1/2/3/javascript. js

+0

il ressemble à vos fichiers dans le même répertoire, lol. donnez-nous les chemins de dossier aussi. –

+0

Je regarderais votre structure de répertoire. Par exemple, un répertoire pour les fichiers CSS; un répertoire pour les fichiers JavaScript; un répertoire pour les communs inclut; etc. Cela rend les problèmes de ce genre tellement plus faciles à gérer. –

+1

** Structure de répertoire particulière n'a pas d'importance ** –

Répondre

2

L'utilisation de liens absolus n'est pas "rapide et sale" mais absolu chose nécessaire.
Et votre problème a très peu en commun avec PHP. C'est un problème HTML. Ce n'est pas PHP appelant votre fichier CSS, mais navigateur, après avoir lu le lien du code HTML. Le seul but du chemin absolu est de résoudre votre problème - pour trouver un fichier particulier à n'importe quel emplacement.
Bien sûr, il ne devrait s'agir que d'un chemin, pas d'un URI. Tous les liens HTML peuvent être (et devraient être) raccourcis vers des parties de chemin.

au lieu de chercher /includes/javascript.js

Bingo!
Par conséquent, il suffit de lui dire de rechercher cette adresse, une absolue - /includes/javascript.js

+0

+1 Oui, bingo! :) Si quelque chose, c'est l'inverse - les URL relatives sont "rapides et sales" IMO. Bien que, comme mentionné dans les commentaires ci-dessous, strictement une URL absolue contient le domaine complet. Ceci est une URL relative à la racine. – MrWhite

0

Je pense que vous allez devoir utiliser des chemins absolus. La question est comment obtenir ces chemins absolus sans le coder en dur ...

Vous pouvez utiliser la constante magique __FILE__ pour obtenir le chemin absolu du script en cours (par exemple, create_table.php) et faire quelque chose comme:

$filename = realpath(dirname(__FILE__).'/../../css/mystyles.css'); 

Pour obtenir le chemin absolu d'un fichier que vous savez comme par rapport au script en cours. (c'est-à-dire jusqu'à deux répertoires et vers le bas dans css /)

Ou vous pouvez démarrer dans l'autre sens et utiliser $_SERVER['DOCUMENT_ROOT']. En supposant que vous connaissiez tous les chemins relatifs à votre webroot. Ce serait ma façon préférée.


EDIT: Je pense que vous pouvez très bien ignorer ce qui précède! Je supposais (avant votre édition) que vous lisez littéralement vos fichiers CSS et JavaScript côté serveur et que vous ajoutez le contenu de index.php - je suppose que non!

Pour re-réponse ... Je ne utiliser les chemins relatifs URL pour CSS côté client et JavaScript en raison de ce problème exactement. Certaines personnes utilisent toujours des URL absolues, personnellement, je préfère les URL relatives à la racine. Si vous générez cette URL côté serveur, cela n'a pas d'importance.

URL relative à la racine: /includes/style.css

Que percevez-vous est le problème? J'aurais dit que c'était préféré.

+0

Etes-vous sûr que ce code aiderait? ;-) Quelle est l'utilité de cette variable $ filename? –

+0

Ah, la question a été modifiée depuis que j'ai répondu la première fois! "renvoie CSS et javascript à index.php." - impliquait que le CSS et JavaScript étaient lus et littéralement insérés dans index.php! On dirait qu'ils sont liés après tout! ($ filename est le nom de fichier absolu du fichier mystyles.css pour lequel vous connaissez le chemin relatif du script en cours.) – MrWhite

+0

Chemin "relatif à la racine" généralement appelé "absolu". Ne pas gâcher * chemin * avec * URL *. –

0

Il existe probablement une meilleure façon de gérer tout ce que vous essayez de faire plutôt que de requérir dynamiquement des fichiers à partir de fonctions PHP. À tout le moins, les chemins absolus sont la clé, et généralement absolus à partir de la racine, comme: require_once ("/ lib/fileOne.php");

pas: require_once ("lib/fileOne.php");

+0

Cela semble être un problème d'URL côté client plutôt qu'un problème de chemin côté serveur, comme cela arrive. – MrWhite

-1

Vous dites donc qu'un fichier est toujours requis. Dans ce fichier, avoir une fonction qui compare __FILE__ à SCRIPT_FILENAME. Ainsi, par exemple, vous savez includes/create_table.php chemin de votre répertoire racine est ../ donc il a une différence de dossier de 1, si le chemin était includes/foo/create_table.php, le chemin d'accès à la racine serait ../../ donc une différence de 2, etc ...

$dif_to_root=1; 

for 
(
$i=0,$path=''; 
$i<($dif_to_root-(count(explode('/',__FILE__))-count(explode('/',getenv('SCRIPT_FILENAME'))))); 
$i++ 
)$path.='../'; 

ont juste maintenant votre code src="$path.includes/style.css"

Questions connexes