[PHP] Construction lien relatif
Dernière réponse : dans Programmation
Salut à tous,
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 ?...
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é :
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 ?...
Autres pages sur : php construction lien relatif
Lassé par la pub ? Créez un compte
J'ai pu retrouver la racine de mon site dans l'arborescence du serveur de la manière suivante :
Il ne me reste plus qu'à la compléter par le chemin complet vers mon fichier à ouvrir avec fopen();
Ca répond donc à ma première question, mais je me demande s'il n'y a pas une méthode plus simple et robuste pour y répondre...
$racine = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);
Il ne me reste plus qu'à la compléter par le chemin complet vers mon fichier à ouvrir avec fopen();
Ca répond donc à ma première question, mais je me demande s'il n'y a pas une méthode plus simple et robuste pour y répondre...
Je relance au cas où je n'aurais pas été clair dans mes précédents messages
Prenons un exemple concret. J'ai :
un fichier script.php contenu dans le dossier php, dossier à la racine du site
un fichier inclus.php, lui aussi dans le dossier php. Ce fichier est inclus dans le fichier script.php
un fichier mapage1.php situé à la racine du site. Le fichier script.php est inclus dans ce fichier
un fichier mapage2.php situé dans le dossier pages, dossier à la racine du site. Le fichier script.php est inclus dans ce fichier
Sous une forme schématique :
Donc dans les fichiers mapage1.php et mapage2.php, pour l'inclusion du fichier script.php, j'ai respectivement :
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 :
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...
Merci d'avance de votre aide.
Prenons un exemple concret. J'ai :
Sous une forme schématique :
|-[php]
| |-inclus.php
| |-script.php
|-[pages]
| |-mapage2.php
|-mapage1.php
| |-inclus.php
| |-script.php
|-[pages]
| |-mapage2.php
|-mapage1.php
Donc dans les fichiers mapage1.php et mapage2.php, pour l'inclusion du fichier script.php, j'ai respectivement :
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 :
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...
Merci d'avance de votre aide.
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) :
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 :
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.
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 :
Donc voilà la fonction (basique pour le moment, mais fonctionnelle et suffisante pour mes besoins actuels) :
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 :
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.
Lassé par la pub ? Créez un compte