Double astuce pour les liens & autres(à partir de l'url)

Contenu du snippet

C'est un petit peu compliqué à comprendre l'utilité, puis le code lui-même. (Les explications de l'utilisation de ces astuces sont dans la conclusion)

-----------------------------------------------------------------------------------------------
1ERE PROBLEMATIQUE :
Sur votre site, pour ne pas répéter la structure (bannière, menu,pied-de page, tout ce qui ne change pas d'une page à l'autre), vous utilisez l'url:
Exemple:http://www.votresite.ext/la_page_qui_contient_tout.php?la_page_a_inclure=celle_la.php
dans 'la_page_qui_contient_tout.php', vous avez un code du style: include($_GET['la_page_a_inclure']);'
Malheureusement, ce système a l'inconvénient de ne pas plaire à certains référenceurs de sites qui n'aiment pas les '?' dans l'url, et qui, par conséquent, refuseront de référencer votre chef-d'oeuvre, objet de votre fierté qui DOIT être connu.
Il faut utiliser dans ce cas des url du type:
http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php
et dans votre code, vous mettez : include(substr($_SERVER["PATH_INFO"],1)); (j'ai trouvé ça dans Login n°109, article de Yann Rocq)
Malheureusement encore, imaginons que la page à inclure soit dans un sous répertoire (du type : mon_répertoire/celle_ci.php), à ce moment, la page ne sera pas trouvée, car le répertoire sera ignoré.

-----------------------------------------------------------------------------------------------
2NDE PROBLEMATiQUE:
Elle est liée à la première.
exemple:l'utilisateur peut être sur la page : P1: http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php
il peut aussi être sur la page : P2: http://www.votresite.ext/la_page_qui_contient_tout.php/mon_répertoir/celle_ci.php
Du fait que les fichiers inclus peuvent être avec ou sans répertoire avant le nom du fichier (exemple: 'celle_la.php' et 'mon_répertoire/celle_ci.php'), les liens ne peuvent pas être directs (exemple: <a href='../ma_page.php'>ma_page</a>) car si la page actuelle est P1, si l'utilisateur suit le lien, il arrivera sur l'url:
http://www.votresite.ext/ma_page.php
tandisque s'il est sur la page P2 et qu'il suit le même lien, il arrivera sur:
http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php
La seule solution est de mettre l'url complète à chaque lien. Cela donnera pour le lien précédent: <a href='http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
que l'utilisateur soit sur P1 ou P2, il arrivera au même endroit.
Mais il reste un problème. Vous dévelloppez en local, et l'url complète chez vous est différente de l'url complète en ligne.
Chez vous, le lien sera ( avec EasyPHP):
<a href='http://127.0.0.1/www/votre_site/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
En ligne, le lien sera:
<a href='http://www.votresite.ext/la_page_qui_contient_tout.php/ma_page.php'>ma_page</a>
Il faut donc que les liens dépendent du lieu de sur quel site l'utilisateur ou vous vous connectez.
Les problèmes est le même pour appeller un page css, ou tout autre fichier.

Source / Exemple :


//-----------------------------------------------------------
/* 1ERE PROBLEMATIQUE  */
/* version 'pas à pas' */
//exemples: 
//P1 l'url en ligne : 'http://www.votresite.ext/la_page_qui_contient_tout.php/celle_la.php'
//P2 l'url en local: 'http://127.0.0.1/www/votre_site/la_page_qui_contient_tout.php/celle_la.php'

$len=strlen($_SERVER['SCRIPT_NAME'] + 1 );
//renverra
//P1 44
//P2 59

$inc=substr($_SERVER['REQUEST_URI'],$len);
//renverra
//P1 & P2 "celle_la.php"

/* Version 'compacte' */
$inc = substr($_SERVER['REQUEST_URI'],strlen($_SERVER['SCRIPT_NAME']) + 1);

//--------------------------------------------------------
/* 2NDE PROBLEMATIQUE*/

/* version compacte */
$x = strtok($_SERVER['PATH_INFO'],'/');
$y ="../";
while($x=strtok('/')){
	$y .= "../";
}
define( 'HERE' , $y );

Conclusion :


J'espère que vous avez compris.
Pour la suite:
Pour les liens, il suffit de mettre:
<a href=<?= "\"".HERE ?>(la_page_qui_contient_tout.php/)ma_page.php">ma page</a>
Ce qu'il y a entre () n'est pas indispensable si le lien ne dirige pas vers lea page de structure avec une inclusion.

Pour l'inclusion :
include($inc);

Bravo à ceux qui ont suivi jusque là et qui ont compris ;-) (moi-même, je suis pas sûr :p ).

Prévenez-moi si cela ne marche pas.

L'avantage de ce système est qu'il ne dépend pas du tout de l'adresse du site, ni du répertoire où il se trouve.

EDIT du 28/05/2004:
La dernière version de la 2ème astuce est mieux, car elle n'utilise plus une URL absolue du type http://www.lesite.ext, mais une URL relative du typpe ../../le_rep/lefichier.ext
/EDIT

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.