Perdu dans les méandres des chemins relatifs?
Posté : 12 mai 2006, 14:30
Salut à tous!
Perdu dans les méandres des chemins relatifs quand il faut sortir d'un dossier de son site pour aller dans un autre? Vos pages comportent toutes les mêmes menus (dynamiques ou non)? Ce qui suit vous intéresse peut-être.
Cette contribution vous propose de paramétrer (en PHP) le chemin relatif des liens des menus en fonction de la page appelée et de son emplacement dans l'arborescence du site. Autrement dit, il s'agit d'adapter la remontée des niveaux à l'emplacement de la page (en gros, les "../", susceptibles de se succéder à l'infini quand vous avez des dossiers qui finissent par ressembler à une poupée russe
).
Comme je travaille toujours en local en premier (vous aussi, j'espère
), le site est placé dans le répertoire suivant:
Créons dans "mon-site" un dossier appelé "pages", dans lequel nous créons un premier fichier PHP appelé "chemin-relatif.php". Ce dernier comporte les lignes suivantes:
Si vous ne voulez pas vous tracasser (ou le moins possible), vous pouvez toujours modifier légèrement le code de la page comme suit:
Exemple de "dossier/dossier/dossier/dossier/toto.php"
À présent, si vous affichez la source de chaque page appelant les menus, vous verrez que le chemin relatif des liens hypertexte de ces derniers s'adapte automatiquement à l'arborescence de votre site, sans que vous arrachiez les cheveux.
Attention! lorsque vous mettez en ligne le site, vérifiez l'emplacement du contenu du dossier "mon-site" par rapport à la racine du site distant. Autrement dit, si le site en ligne est
et ainsi de suite.
J'espère avoir été clair en exposant ma contribution
, mais c'est en l'essayant que l'on voit tout le parti qu'on peut en prendre.
Des remarques? des plantages? des corrections? des suggestions d'amélioration? je suis toute ouïe.
Perdu dans les méandres des chemins relatifs quand il faut sortir d'un dossier de son site pour aller dans un autre? Vos pages comportent toutes les mêmes menus (dynamiques ou non)? Ce qui suit vous intéresse peut-être.
Cette contribution vous propose de paramétrer (en PHP) le chemin relatif des liens des menus en fonction de la page appelée et de son emplacement dans l'arborescence du site. Autrement dit, il s'agit d'adapter la remontée des niveaux à l'emplacement de la page (en gros, les "../", susceptibles de se succéder à l'infini quand vous avez des dossiers qui finissent par ressembler à une poupée russe
Comme je travaille toujours en local en premier (vous aussi, j'espère
Le répertoire "mon-site" est bourré de dossiers, eux-mêmes bourrés de pages PHP susceptibles d'afficher les mêmes menus.Lettre de votre disque dur\Chemin menant à EasyPHP\www\mon-site
Créons dans "mon-site" un dossier appelé "pages", dans lequel nous créons un premier fichier PHP appelé "chemin-relatif.php". Ce dernier comporte les lignes suivantes:
<?php
// On récupère l'URL de la page affichée, ce qui donne, par exemple, http://127.0.0.1/mon-site/autant-de-dossiers-ou-pas-du-tout/la-page.php
$chemin_relatif_url=$_SERVER['PHP_SELF'];
// On "coupe" l'URL en plusieurs parties, chacune étant délimitée par le(s) "/" qui s'y trouve(nt)
$chemin_relatif_url=explode("/", $chemin_relatif_url);
// On définit une variable ayant pour valeur une chaîne de caractères qui n'est autre que l'extension de la page
$chemin_relatif_extension=".php";
/* Grâce à la fonction explode(), chaque partie issue de l'"explosion" est indexée (comptage à partir de 0): l'index 0 correspond à 127.0.0.1, l'index 1 à mon-site, etc.
Maintenant, il faut soustraire à une chaîne de caractères une autre, autrement dit vérifier quel index comporte l'extension .php, et ce grâce à la fonction strstr() (si vous ne voulez aucune sensibilité à la casse, vous pouvez utiliser la fonction stristr()).*/
// Si c'est l'index 2 qui comporte l'extension .php (autrement dit, si on a 127.0.0.1/mon-site/la-page.php), on créé une variable n'ayant rien comme valeur (deux guillemets simples).
if (strstr($chemin_relatif_url[2], $chemin_relatif_extension)) $chemin_relatif_remonter='';
// Si c'est l'index 3 qui comporte l'extension .php (autrement dit, si on a 127.0.0.1/mon-site/un-dossier/la-page.php), on créé une variable ayant comme valeur "../".
else if (strstr($chemin_relatif_url[3], $chemin_relatif_extension)) $chemin_relatif_remonter='../';
// Si c'est l'index 4 qui comporte l'extension .php (autrement dit, si on a 127.0.0.1/mon-site/un-dossier/deux-dossiers/la-page.php), on créé une variable ayant comme valeur "../../".
else if (strstr($chemin_relatif_url[4], $chemin_relatif_extension)) $chemin_relatif_remonter='../../';
// Si c'est l'index 5 qui comporte l'extension .php (autrement dit, si on a 127.0.0.1/mon-site/un-dossier/deux-dossiers/trois-dossiers/la-page.php), on créé une variable ayant comme valeur "../../../".
else if (strstr($chemin_relatif_url[5], $chemin_relatif_extension)) $chemin_relatif_remonter='../../../';
// Si c'est l'index n qui comporte l'extension .php (autrement dit, si on a 127.0.0.1/mon-site/un-dossier/deux-dossiers/.../n-dossiers-moins-deux/la-page.php), on créé une variable ayant comme valeur "../" répété n-2 fois. :P
else if (strstr($chemin_relatif_url[n], $chemin_relatif_extension)) $chemin_relatif_remonter='../../../'; // ../ n-2 fois
?>
Dans le même dossier "pages", créons le fichier "menus.php". En voici le code:<?php
// On fait appel aux codes inscrits dans le fichier chemin-relatif.php
include ("chemin-relatif.php");
?>
<div id="menu-gauche">
<a href="<?php echo $chemin_relatif_remonter ?>menu1.php" title="Menu 1"><h2>Menu 1></h2></a>
<a href="<?php echo $chemin_relatif_remonter ?>menu2.php" title="Menu 2"><h2>Menu 2></h2></a>
<a href="<?php echo $chemin_relatif_remonter ?>menu3.php" title="Menu 3"><h2>Menu 3></h2></a>
</div>
<div id="menu-droite">
<a href="<?php echo $chemin_relatif_remonter ?>menu4.php" title="Menu 4"><h2>Menu 4></h2></a>
<a href="<?php echo $chemin_relatif_remonter ?>menu5.php" title="Menu 5"><h2>Menu 5></h2></a>
<a href="<?php echo $chemin_relatif_remonter ?>menu6.php" title="Menu 6"><h2>Menu 6></h2></a>
</div>
À présent, dans chaque page de votre site, incluez ces menus comme suit (si vous voulez une erreur fatale empêchant l'exécution du code restant dans le cas où le fichier et/ou le chemin ne sont pas trouvés, remplacez include() par require()):<html>
<head>
...
</head>
<body>
<?php
include ("pages/menus.php");
?>
...
Le reste du code HTML et/ou PHP de la page
...
</body>
</html>
Attention au chemin relatif dans l'include()! Si la page en question n'est pas à la racine du dossier "mon-site", faites précéder pages/menus.php par autant de ../ que nécessaires. Si vous ne voulez pas vous tracasser (ou le moins possible), vous pouvez toujours modifier légèrement le code de la page comme suit:
Exemple de "dossier/dossier/dossier/dossier/toto.php"
<?php
include ("../../../../pages/menus.php");
?>
<html>
<head>
...
</head>
<body>
<?php
include ("".$chemin_relatif_remonter."pages/menus.php");
?>
...
Le reste du code HTML et/ou PHP de la page
...
</body>
</html>
Comme quoi il est toujours bon de bien assimilier la notion de chemin relatif. À présent, si vous affichez la source de chaque page appelant les menus, vous verrez que le chemin relatif des liens hypertexte de ces derniers s'adapte automatiquement à l'arborescence de votre site, sans que vous arrachiez les cheveux.
Attention! lorsque vous mettez en ligne le site, vérifiez l'emplacement du contenu du dossier "mon-site" par rapport à la racine du site distant. Autrement dit, si le site en ligne est
et que sa racine contient ce que contient le dossier local "mon-site", modifiez le fichier "chemin-relatif.php" en diminuant de 1 le chiffre de l'index:
$chemin_relatif_url[2] en local devient $chemin_relatif_url[1] en ligne,
$chemin_relatif_url[3] en local devient $chemin_relatif_url[2] en ligne,et ainsi de suite.
J'espère avoir été clair en exposant ma contribution
Des remarques? des plantages? des corrections? des suggestions d'amélioration? je suis toute ouïe.