http://mawel.free.fr : Site d'informations pratiques
pour la mise en place de sites
dynamiques en php
--> Accueil <--  > Liens relatifs
> Tutoriels
   Erreurs courantes
   Saisie de texte riche
   Structure de données
   Ajout/Modif/Suppression
   Résoudre un problème
   Soumission de données
   Pseudo-templates
   Enregistrement de fichiers
   Liens relatifs


> Cours
   1. Structure de site



Contact
   Votre avis
   e-mail



Liens
   Inventons!
  

Introduction

Dans un site web, on passe de page en page en utilisant des liens, et l'on charge accède aux images de la même manière par leur adresse.

Les adresses peuvent être codées de plusieurs manières :
  • En absolu, c'est a dire en indiquant le nom du serveur, le répertoire et le nom du fichier. On a ainsi : http://mawel.free.fr/Images/LogoMawel.gif, qui indique l'adresse du logo de ce site.
  • En relatif par rapport au serveur on suppose que l'on connait déjà le nom du serveur, et l'on indique le chemin qu'a partir de la racine du serveur. On obtient alors : /Images/LogoMawel.gif, toujours pour la même image.
  • Enfin, en relatif par rapport a l'adresse courante. On utilise alors : ../Images/LogoMawel.gif si l'on se trouve, comme c'est le cas actuellement, dans le répertoire "Tutoriels". On remonte donc d'un cran, puis on redescend dans "Images".
La problèmatique est raltivement identique lorsque l'on met en place un "Include" en php.

Le chemin peut aussi être indiqué en absolu par rapport a la racine du disque : c:\PHP\Scripts\Librairie.php, ou en relatif par rapport a la position courante, "Librairie.php" si l'on se trouve déjà dans "Scripts".

Quelles répercussions des choix ?

Le choix de l'une ou l'autre manière de faire les liens a de nombreuses répercussions sur la vie future du site. En particulier pour les raisons suivantes :
  • Lorsque l'on code en "absolu", il faut être certain que les chemins ne bougent pas. En particulier, si les url des images ont été codées en absolu avec le nom du serveur, il devient impossible de modifier le nom du serveur sans reprendre toutes les adresses. Si cela n'est pas forcément génant sur un site web pour lequel les adresses changent rarement, cela l'est beaucoup plus sur un Intranet pour lequel les adresses des machines sont souvent sujettes a des modifications.
  • Lorsque l'on code en relatif complet, il faut être absolument certain que les pages ne soient pas bougées de place les unes par rapport aux autres, ou il faudra de la même manière revnir sur toutes les adresses.

Une solution possible

Dans ce contexte, ni le fait de coder en absolu, ni le relatif ne sont des solutions véritablement pérennes.

Tout le problème consiste a pouvoir faire des adresse qui ne soient absolues, mais par rapport a quelque chose que l'on peut facilement contrôler.

L'idée consiste a dire que l'on pose de manière "arbitraire" que la racine du site se situe en un endroit précis. Ensuite, dans chaque fichier on va définir deux variables, $HTMLRel et $PHPRoot. Ces variables vont contenir respectivement le chemin HTML relatif entre le fichier courant et la racine du site, et le chemin PHP absolu entre la racine du disque hébergeant le serveur et la racine du site.

En pratique cela donne par exemple :
  • $PHPRoot = "c:/program files/apache group/apache/htdocs/mawel2"
  • $HTMLRel = "../"

Ces informations sont celles pour l'image de ce site sur ma machine personnelles. Ainsi, il est très simple lorsque l'on souhaite faire un lien HTML vers un autre fichier du site de le coder de la manière suivante :

<img src=<? echo $HTMLRel ?>Images/LogoMawel.gif>


Dans la mesure ou le $HTMLRel est correctement définit, ce type de lien fonctionne quel que soit le répertoire dans lequel on se trouve.

De manière analogue, un include se fera :
include $PHPRoot . "/Script/Include.php"


On a donc définit des liens qui sont toujours absolus, par rapport a quelque chose de relatif que nous maitrisons : $HTMLRel et $PHPRoot. Pour peu que ces deux variables soient correctement positionnées, il devient possible de déplacer une page de manière totalement transparente.

Comment générer automatiquement les variables

Bien sur, il n'est pas question de placer dans chaque page du site les deux variables. Il faudrait alors aller modifier manuellement leur valeur a chaque modification.

On va donc procéder de la manière suivante :
  1. Placer, a l'endroit que l'on considére comme la racine du site, un fichier "SiteRoot", vide, qui ne servira de référence.
  2. Placer, dans chaque répertoire, un script "_RelPos.php", qui sera inclut dans chaque script php du site. Ce fichier possède un script qui va aller calculer les valeurs courantes de $PHPRoot et $HTMLRel.
Le script de "_RelPos.php" est le suivant :
<?php

$Dir = str_replace('\\', '/', getcwd());
$Dir = explode('/', $Dir);
$NDir = count($Dir);
for($i=count($Dir); $i>0;$i--)
{
if(file_exists(implode('/', $Dir) . '/SiteRoot'))
{
$PHPRoot = implode('/', $Dir);
$HTMLRel = str_repeat("../", $NDir - count($Dir));
$i = 0;
}
unset($Dir[$i]);
}
?>


Il se lit de manière assez simple :
  1. Prendre le nom du répertoire courant : getcwd, on remplace automatiquement les "\" par "/" pour éviter les soucis liés a Windows/Unix.
  2. Découper le chemin dans un tableau
  3. Remonter dans le chemin d'accès jusqu'a ce que l'on trouve le fameux "SiteRoot". Un fois qu'on y arrive on sait que le restant du chemin est $PHPRoot, et l'on connait le nombre de repertoire qu'il faut remonter pour arriver a la racine du site web.
Ce qui est intéressant, c'est que ce script permet, quel que soit l'endroit ou il se trouve, d'indiquer l'adresse de la racine du site a tous les scripts qui se trouvent dans le même repertoire que lui.

Chemins relatifs par l'exemple

Sur ce site, on trouve les répertoires organisés de la manière suivante :
  • Racine
  • Racine\Images
  • Racine\Tutoriels
  • Racine\Cours
Comme chaucun le sait, j'utilise le principe des pseudo-template. Il existe donc un seul fichier "Structure.php" qui contient l'ensemble des éléments qui sont repris sur toutes les pages.

Selon la page qu'on lit, l'adresse courante est "http://mawel.free.fr/index.php", ou "http://mawel.free.fr/Tutoriels/Pseudo.php". Il est donc absolument nécessaire que "Structure.php" soit capable de construire les liens vers les images correctement.

Ainsi, lorsqu'on se trouve dans "Racine", $HTMLRel est vide. Les liens construits : <img src=<? echo $HTMLRel ?>Images/LogoMawel.gif> deviennent : <img src=Images/LogoMawel.gif>. On pointe donc en relatif vers le logo.

Si l'on se trouve dans "Racine\Tutoriels", $HTMLRel contient "../", et le lien calculé dans "Structure.php" devient "<img src=../Images/LogoMawel.gif>". On pointe donc toujours correctement sur l'image, sans avoir rien modifié dans aucun fichier.

De la même manière, $PHPRoot me permet de toujours pouvoir accèder au répertoire dans lequel se trouve "Structure.php", quel que soit l'emplacement ou se trouve le script. include $PHPRoot . "/Script/Include.php" se transforme de manière a toujours pointer vers le bon répertoire.

Ce système continuerait de fonctionner de manière analogue si l'on plaçait des nouvelles pages dans un sous-repertoire de "Tutoriels".

Conclusion

Ce système apporte une solution simple et efficace, qui permet de toujours accèder aux éléments, dans la mesure ou l'on connait leur position par rapport a une racine "fictive" que l'on peut fixer et modifier.

Il garanti que tous les liens présents dans les pages HTML seront générés en relatif par rapport a la page courante. On s'affranchit alors des problèmes liés au changement d'adresse d'un site, ou au changement de répertoire de l'ensemble d'un site. Cela est particulièrement utile lorsque l'on travaille en développement sur un site dont l'adresse est "http://127.0.0.1/Mawel2" (exemple sur ma machine), et en production : "http://mawel.free.fr".

En utilisation de $PHPRoot enfin, on obtient toujours un point d'accès vers le répertoire racine, et l'on peut facilement trouver ses bibliothèques de script par rapport à ce dernier.