Je me pose des questions pour construire un lien relatif "variable" pointant vers un même fichier depuis différentes pages ne se situant pas au même niveau de l'arborescence de mon site. Et pour le moment, je n'ai encore pas trouver de réponses satisfaisantes.
2 ex auxquels je suis confronté :
ex 1 : j'ai plusieurs pages dans lesquelles je fais un include() d'un script php. Dans le fichier inclus, je dois ouvrir un fichier précis (toujours le même). Comment je dois écrire le lien dans fopen() pour pointer vers ce dernier fichier, sachant que mon script est inclus dans des pages pouvant se trouver à différents niveaux de l'arborescence de mon site ? Un simple lien relatif avec des éventuels ../ n'est pas évident à mettre en place, car je dois à chaque fois analyser la position de la page contenant le script... Je ne peux pas mettre de lien absolu (question de portablité du script). Que faire ?
ex 2 : j'ai un script qui est appelé depuis une url à l'intérieur de mes pages. Mes pages peuvent toujours se trouver à différents niveaux de l'arborescence. Dans le script appelé, je fait une redirection vers une autre page, pouvant elle aussi se trouver à différents niveaux de l'arborescence. Comment écrire le lien relatif (toujours pas absolu, question de portabilité) ?
Merci d'avance pour vos idées ou vos pistes. J'avais pensé mettre un lien relatif depuis la racine de mon site (en démarrant le lien par un "/" ). Problème : la racine pour fopen() n'est pas celle du site... D'où une erreur ! Je pense qu'une des solution pourrait être de passer par realpath(), mais je ne vois pas trop comment construire le lien ?...
Donc dans les fichiers mapage1.php et mapage2.php, pour l'inclusion du fichier script.php, j'ai respectivement :
Code :
include('php/script.php'); // mapage1.php
include('../php/script.php'); // mapage2.php
Jusque là, pas de souci, vu que la position relative de script.php est fixe par rapport à mapage1.php et ma page2.php.
Mais le problème se pose pour l'inclusion de inclus.php dans script.php. En effet son lien d'inclusion dépend non pas de sa position par rapport à script.php, mais de sa position par rapport au fichier dans lequel script.php est inclus. Donc, le lien d'inclusion de inclus.php dans script.php est variable :
Code :
include('php/inclus.php'); // pour le cas où script.php est inclus dans mapage1.php
include('../php/inclus.php'); // pour le cas où script.php est inclus dans mapage2.php
D'où ma question : comment coder en PHP ce lien variable relatif à l'inclusion de inclus.php dans script.php
La question est valable pour include() (et pourrait être contourné en faisant toutes les inclusion dans les fichiers mapageX.php). Mais le problème reste entier dans le cas de fopen() par ex.
Donc si vous avez des solutions ou des idées pour pouvoir créer automatiquement le lien pointant vers fopen/iclude/require(inclus.php) dans script.php en fonction de la position de mapageX.php par rapport à script.php...
La technique du chemin absolu, je l'ai testé (voir mon 2 ème message de ce topic). Mais ça me génère des erreurs de fichier non trouvés avec include();...
Du coup je me suis penché sur un autre angle d'attaque : prendre comme point de repère fixe la racine du site et construire tous mes liens relatifs à partir d'elle.
Dans l'ordre :
1. évaluer la position dans l'arborescence du fichier actuel
2. construire les retours à la racine, c'est-à-dire calculer le nombre de ../ nécessaire pour revenir du fichier actuel à la racine
3. ajouter ce nombre de ../ en début des liens pointant vers mes fichiers à inclure (include() ou ouvrir (fopen()
Donc voilà la fonction (basique pour le moment, mais fonctionnelle et suffisante pour mes besoins actuels) :
Code :
function racine() // calcule la position relative du fichier actuel par rapport à la racine et crée le nombre de remontées(../) nécessaires pour y revenir
{
$nbSlashes = substr_count($_SERVER['SCRIPT_NAME'], '/'); // on compte le nombre total de slashes contenu dans le lien relatif du fichier courant
$nbSlashes --; // on ne compte pas le slash de la racine (placé au début du lien relatif)
$remontee = ''; // on iniitialise la remontée dans l'arborescence
for($i = 0; $i < $nbSlashes; $i++)
{
$remontee .= '../';
}
return $remontee;
}
Et par rapport à mes exemples donnés dans un de mes précédents posts, on écrit les liens à inclure ou ouvrir dans le fichier script.php de la façon suivante :
Code :
include(racine().'php/inclus.php');
Voilà
Améliorations à apporter : ce script oblige à remonter à la racine à chaque fois. Et donc à réécrire toute l'arborescence du fichier de destination (à inclure ou ouvrir). On pourrait donc passer en paramètre le niveau dans l'arborescence du fichier à inclure/ouvrir et le soustraire à $nbSlashes. C'est surtout intéressant si tout ce passe en permanence dans un sous-niveau de l'arborescence.
Message édité par marsien le 04-05-2007 à 18:29:49