FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [PHP] Construction lien relatif
 

[PHP] Construction lien relatif

Il y a 450 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [PHP] Construction lien relatif
 
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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 ?...

:)


---------------
.: La Pipicy Team :love: :.

Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

J'ai pu retrouver la racine de mon site dans l'arborescence du serveur de la manière suivante :

Code :
  1. $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...


---------------
.: La Pipicy Team :love: :.
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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 :

|-[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 :

Code :
  1. include('php/script.php'); // mapage1.php
  2. 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 :
  1. include('php/inclus.php'); // pour le cas où script.php est inclus dans mapage1.php
  2. 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 Pipicy Team :love: :.
G.M.G.V.S.O.
Profil : Modo matériel
Plus d'informations

Tu as jeté un ti coup d'oeil sur $_SERVER['PATH_TRANSLATED'] ?


---------------
SPAM & WAREZ = Ban!
Ultimate Boot CD | Memtest+
Mon bar préféré à Lyon ! | Bijoux Fantaisie de Créateur !
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

Je ne connaissais pas effectivement. Mais elle n'existe pas chez Free, qui héberge mon site... Donc ça ne résout pas mon problème :/

Merci de ton aide, et si tu as d'autres idées... :)


---------------
.: La Pipicy Team :love: :.
G.M.G.V.S.O.
Profil : Modo matériel
Plus d'informations

A prioris ça existe chez free en hebergement payant ...

Et en mettant le chemin absolu et non relatif ?


---------------
SPAM & WAREZ = Ban!
Ultimate Boot CD | Memtest+
Mon bar préféré à Lyon ! | Bijoux Fantaisie de Créateur !
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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 :
  1. 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
  2.     {
  3.         $nbSlashes = substr_count($_SERVER['SCRIPT_NAME'], '/'); // on compte le nombre total de slashes contenu dans le lien relatif du fichier courant
  4.         $nbSlashes --; // on ne compte pas le slash de la racine (placé au début du lien relatif)
  5.         $remontee = ''; // on iniitialise la remontée dans l'arborescence
  6.         for($i = 0; $i < $nbSlashes; $i++)
  7.         {
  8.             $remontee .= '../';
  9.         }
  10.         return $remontee;
  11.     }


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 :
  1. 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

---------------
.: La Pipicy Team :love: :.

Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [PHP] Construction lien relatif
 

Annonces Google
Publicité