Include et liens relatif

Petit nouveau ! | 7 Messages

27 mai 2006, 02:56

Bonsoir et surtout bonne nuit à toutes et à tous,

Voilà je tente d'utiliser la fonction Include pour me permettre d'effectuer une mise à jour rapide de mes menues, pieds et tete de page.

Comme vous vous en doutez, les liens tiennent compte de la page qui les appels, resulta en fonction de la position des pages dans le site (à la racine du site ou en sous repertoire) les liens ne peuvent plus fonctionner.

Par exemple :
Sur une des pages incluse, j'ai placé des images liées par rapport à la racine du site (ex : /sous_rep/image.jpg)

J'aimerai savoir si il existe une solution pouvant contourner cette restriction afin de créer une seul page à inclure avec tous les liens et images fonctionnant correctement

Mammouth du PHP | 19672 Messages

27 mai 2006, 07:56

Il faudrait que tu construises tes liens relatifs à partir d'un point fixe : tu pourrais utiliser $_SERVER['DOCUMENT_ROOT'] qui indique la racine de ton site/serveur : de cette manière, quel que soit le niveau de profondeur de tes répertoires, tu seras toujours juste.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 7 Messages

27 mai 2006, 09:30

J'ai bien tenter d'utiliser cette methode mais à chaque fois ça me retourne l'emplacement sur le serveur et non pas l'adresse

Par exemple

Code : Tout sélectionner

<a href="<? echo $_SERVER['DOCUMENT_ROOT'] ?>/index.php">lien de test </a>
Donne

Code : Tout sélectionner

<a href="/home/p/percheri/user/www/html/index.php">lien de test </a>
Je comprend bien que cette variable permet de spécifier à la fonction include où trouver les fichiers sur le serveur mais pour les liens ça coince.

Sinon après quelques recherche il peut exister cette solution que j'ai bricolé mais elle est loin d'etre esthetique.

Code : Tout sélectionner

<a href="http://<?php echo $_SERVER['SERVER_NAME']; ?>/index.php">lien de test </a>
Qu'en pense tu?

Mammouth du PHP | 19672 Messages

27 mai 2006, 09:51

Suggestion : défini-toi une constante à partir de ta page index: il te suffira de la configurer pour le version en ligne différement de la version locale sur ta machine :

Supposons que sur ta machine, ton site soit dans C:\www\messite\monsite1 alors qu'en ligne, ce soit sur /home/p/percheri/user/www/html/ : l'un est une adresse Windows, l'autre Linux/UNIX : ce qui nous importe, c'est l'endroit de la racine. $_SERVER['DOCUMENT_ROOT'] donnera en ligne ce que tu as montré : /home/p/percheri/user/www/html/ mais sur ta machine, ça va donner C:\www

Crée une constante comme ceci sur ta machine :
define("RACINE", $_SERVER['DOCUMENT_ROOT'] ."/messites/monsite1/");
Pour ta version en ligne, fais la même ligne configurée comme ceci:
define("RACINE", $_SERVER['DOCUMENT_ROOT'] ."/");
À partir de là, dans tes fichiers, quand tu veux pointer vers une image se trouvant dans "images/monimage.png", le répertoire image se trouvant à la racine de ton site, écris tes liens comme ceci :
<img src="<?php echo(RACINE ."images/monimage.png"); ?>" alt="" />

Pour la constante, soit tu la définis dans ta page index, mais ça comporte le risque suivant: si un internaute entre sur ton site par une autre page, la constante ne sera pas définie : donc, tu peux créer un petit fichier de configuration avec cette simple définition et tu ajoutes un include() dans l'en-tête des différentes pages. Tu peux même éventuellement tester si la définition n'a pas déjà été faite :
if(!defined("RACINE"))
{
    define("RACINE", $_SERVER['DOCUMENT_ROOT'] ."/");
}
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 7 Messages

27 mai 2006, 14:28

Je viens de tester ta solution. Elle fonctionne très bien mais peut s'appliquer qu'aux script.

Ca me permet donc enfin de tester mes include correctement en local (je te remerci pour ça)

Voici la condition que j'ai mis en place :

Code : Tout sélectionner

<? /* Si on est en local */ if ( ereg('toutenkamion', $_SERVER['REQUEST_URI']) ) { define('RACINE', 'e:/mes sites web/toutenkamion'); } /* Si on est en ligne */ else { define("RACINE", $_SERVER['DOCUMENT_ROOT'] ."/"); } ?>
Pour les URL, je ne peut donc pas utiliser cette solution pour les images car leur adresses serait :
http://home/p/percheri/user/www/html/mon_image.png ou
http://e:/mes sites web/toutenkamion/mon_image.png

Je pense inserer dans les pages à inclure une condition qui permettrait de remonter d'autant de fois qu'il le faut des les répertoire en fonction de la position de la page qui inclus tout ceci

Par exemple :

Niv 0 (racine) : medias/mon_image.png
Niv 1 (sous repertoire) : ../medias/mon_image.png
Niv 2 (sous-sous repertoire) : ../../medias/mon_image.png

Et ainsi de suite tout ça gràce à une boucle. Par contre je sais pertinement que je vais utiliser des fonctions "lourde" et une personne peut mon conseiller une liste de fonction à utiliser je suis très interesser.
Ensuite pour leur utilisation je ferai mes recherches

Petit nouveau ! | 7 Messages

27 mai 2006, 15:05

Je pense m'en etre correctement sorti

Code : Tout sélectionner

<? /* Recuperation nombre de slash, au nombre de 2 à la racine du site */ $niveau = substr_count($_SERVER["REQUEST_URI"], '/'); $position = ''; for ($i=2; $i<$niveau; $i++) { $position = $position . '../'; } ?>
Ensuite je n'ai plus qu'a faire ceci

Code : Tout sélectionner

<img src="<? echo $position ?>medias/mon_image.png" />
Si ma solution est valide, je met mon sujet comme résolu

Petit nouveau ! | 6 Messages

28 mai 2006, 00:31

tu defini deux constantes, une pour les url et une pour le systeme de fichier

Code : Tout sélectionner

<? define('URL_RACINE', '$_SERVER['HTTP_HOST'] ."/monsite"); define('FICHIER_RACINE', $_SERVER['DOCUMENT_ROOT'] ."/monsite"); ?>
Et ensuite tu utilises la première pour les liens et les images et la deuxieme pour les includes

Code : Tout sélectionner

<?php include FICHIER_RACINE."/repertoire/script.php" ?> <a href="<?php echo URL_RACINE ?>/test.php">lien de test </a> <img src="<?php echo URL_RACINE ?>/image.png" />

Petit nouveau ! | 7 Messages

28 mai 2006, 16:32

Je te remerci pour ces précisions. par contre j'ai lu hier soir que le fait d'utiliser des URL completes (ex : http://monsite.com/) declenche une requette HTTP pour chaque image pouvant ralentir l'affichage des pages.

J'opte donc pour l'utilisation de lien relatif (ex : ../repertoire/mon_image.png) ce qui implique que je doit utiliser la condition mis en ligne un peut plus haut.

Par contre je me pose une question assez importante : quel est l'avantage d'utiliser des constantes au lieu des variables?