Discussion:
Chemins relatifs
(trop ancien pour répondre)
jc
2010-07-03 10:28:31 UTC
Permalink
Bonjour,

Je souhaiterai avoir un fichier menu.php que j'appel par un include(../ ou
../../ ou .../.../.../ ......) ou à différents endroits de l'arboresence
du site.

Le problème est que lorsque j'inclus le menu dans ces pages, les liens du
menu se font à partir de là où se situ menu.php mais pas de là où le fichier
menu.php est inclus.

J'ai regardé sur le manuel les constantes magique : __DIR__, __FILE__ et les
variables d'environement tels que $_SERVER['REQUEST_URI'], echo
$_SERVER['REQUEST_URL'], $_SERVER['DOCUMENT_ROOT']
mais je n'ai pas compris si cela et comment pouvais résoudre mon problème.

Voila le type d'arborescence:

root
|
|-modules -menu.php
|
|- categorie1 - index.php
| |
| |- categorie 11 - index.php
| | |
| | |- categorie 111 - index.php
| | |
| | |-categorie 112 - index.php
| | |
| | - categorie 12 - index.php
| | |
| | |- categorie 121 - index.php
| | |
| | |-categorie 122 - index.php
| | |
| - categorie 2


Merci.
JC
CrazyCat
2010-07-04 18:00:52 UTC
Permalink
Bonjour,
Post by jc
Je souhaiterai avoir un fichier menu.php que j'appel par un include(../ ou
../../ ou .../.../.../   ......) ou à différents endroits de l'arboresence
du site.
J'ai regardé sur le manuel les constantes magique : __DIR__, __FILE__ et les
variables d'environement tels que $_SERVER['REQUEST_URI'], echo
$_SERVER['REQUEST_URL'], $_SERVER['DOCUMENT_ROOT']
mais je n'ai pas compris si cela et comment pouvais résoudre mon problème.
Tu es sur la bonne piste: $_SERVER['DOCUMENT_ROOT'] te permet de
connaitre la racine de ton site, hors tu sais où est placé ton
menu.php par rapport à cette racine.

Donc, tu peux très facilement utiliser:
<?php
include($_SERVER['DOCUMENT_ROOT'].'/modules/menu.php');
?>

--
Tchattez en liberté: http://www.zeolia.net
Aide informatique: http://www.g33k-zone.org
Helio
2010-07-05 17:15:56 UTC
Permalink
Bonjour,

$_SERVER['DOCUMENT_ROOT'] ne marchera que sur un serveur Apache. Ce
n'est pas défini sur un serveur IIS par exemple.

Sinon, je te recommande d'utiliser require_once, le "once" pour éviter
les boucles d'inclusion, et le "require" pour arrêter l'exécution du
programme immédiatement en cas de chemin erroné.

Enfin, il est confortable d'utiliser l'autoload :
http://php.net/manual/fr/language.oop5.autoload.php

@+
Post by jc
Bonjour,
Post by jc
Je souhaiterai avoir un fichier menu.php que j'appel par un include(../ ou
../../ ou .../.../.../   ......) ou à différents endroits de l'arboresence
du site.
J'ai regardé sur le manuel les constantes magique : __DIR__, __FILE__ et les
variables d'environement tels que $_SERVER['REQUEST_URI'], echo
$_SERVER['REQUEST_URL'], $_SERVER['DOCUMENT_ROOT']
mais je n'ai pas compris si cela et comment pouvais résoudre mon problème.
Tu es sur la bonne piste: $_SERVER['DOCUMENT_ROOT'] te permet de
connaitre la racine de ton site, hors tu sais où est placé ton
menu.php par rapport à cette racine.
<?php
include($_SERVER['DOCUMENT_ROOT'].'/modules/menu.php');
?>
--
Tchattez en liberté:http://www.zeolia.net
Aide informatique:http://www.g33k-zone.org
Etienne
2010-07-06 14:35:16 UTC
Permalink
Post by jc
Bonjour,
Je souhaiterai avoir un fichier menu.php que j'appel par un include(../
ou ../../ ou .../.../.../ ......) ou à différents endroits de
l'arboresence du site.
Salut.

moi j'ai cette méthode

function GetFullPath($path)
{
static $RootPath = '/';
if (!strcmp($RootPath, '/'))
$RootPath = str_replace($_SERVER['SCRIPT_NAME'], '',
$_SERVER['SCRIPT_FILENAME']);

if (strlen($path) > 0 && $path[0] == "/")
return sprintf("{$RootPath}%s", $path);
else
return sprintf("%s/%s", dirname($_SERVER['SCRIPT_FILENAME']), $path);
}

Qui transforme un chemin relatif en chemin absolue.
Voila.

du coup tu peux faire des
include(GetFullPath('/dir/dir/page.inc'));

Si ca t'aide.

Etienne
CrazyCat
2010-07-06 19:53:18 UTC
Permalink
Je me permets de parler plutôt sur le principe général que ce cas
spécifique.
Ne serait-il pas plus judicieux d'avoir un index.php à la racine qui
gère toutes les pages et de l'url-rewriting pour accèder aux rubriques
et sous-rubriques ?

Cela permet de limiter la problématique du positionnement relatif en se
basant sur dirname(__FILE__) dans l'index.php. Et ce fichier étant
"master", il peut donc intégrer tout ce qui est commun et faire le
routage vers les bons contenus.
--
Tchattez en liberté: http://www.zeolia.net
Aide informatique: http://www.g33k-zone.org
Etienne
2010-07-07 09:45:25 UTC
Permalink
Post by CrazyCat
Je me permets de parler plutôt sur le principe général que ce cas
spécifique.
Ne serait-il pas plus judicieux d'avoir un index.php à la racine qui
gère toutes les pages et de l'url-rewriting pour accèder aux rubriques
et sous-rubriques ?
Cela permet de limiter la problématique du positionnement relatif en se
basant sur dirname(__FILE__) dans l'index.php. Et ce fichier étant
"master", il peut donc intégrer tout ce qui est commun et faire le
routage vers les bons contenus.
Heu tu veux dire un fichier a la racine qui inclu tout ce que tu as
besoin et tes script appelle ce fichier ???

si c'est bien ca, c'est plutot bof.
ca veut dire que toutes tes pages vont inclure toutes les lib de ton
site web sans distinction du besoin.

dans ce cas autant mettre tous tes include dans un meme fichier.
Etienne
CrazyCat
2010-07-12 19:37:16 UTC
Permalink
Post by Etienne
Heu tu veux dire un fichier a la racine qui inclu tout ce que tu as
besoin et tes script appelle ce fichier ???
Non, pas du tout, en gros:
index.php => la page principale, toujours appelée. Elle contient
l'initialisation générique, comme par exemple le répertoire de base du
site (dirname(__FILE__);) et les fonctions utiles comme celle d'autoload.
Elle contient de plus le système de routage pour inclure la page désirée.

C'est cette dernière qui fait ensuite les inclusions dont elle a besoin,
en se basant soit sur le répertoire de base (cas où l'on a besoin d'un
élément générique) soit sur son propre emplacement (utilisation d'un
élément propre au module).

Donc, c'est l'inverse de ce que tu as cru: les scripts n'appellent pas
le fichier à la racine, c'est lui qui les appelle et ils se débrouillent
"normalement" en utilisant des données "globales" fournies par l'index.
--
Tchattez en liberté: http://www.zeolia.net
Aide informatique: http://www.g33k-zone.org
Web Dreamer
2010-07-08 13:15:17 UTC
Permalink
jc a écrit ce samedi 3 juillet 2010 12:28 dans
Post by jc
Bonjour,
Je souhaiterai avoir un fichier menu.php que j'appel par un include(../ ou
../../ ou .../.../.../ ......) ou à différents endroits de l'arboresence
du site.
Le problème est que lorsque j'inclus le menu dans ces pages, les liens du
menu se font à partir de là où se situ menu.php mais pas de là où le
fichier menu.php est inclus.
dirname(__FILE__) est si tu veux le chemin "machine" complet vers le fichier
"inclus", ex:
si ton fichier inclus est /var/www/html/include/fichier.inc.php
dirname(__FILE__) donne : /var/www/html/include

dirname($_SERVER['PHP_SELF']) est si tu veux le chemin relatif à ton
DocumentRoot vers le fichier principal appelé.
ex.: si pour accéder à ton fichier dans l'URL du browser tu as
http://www.mndomaine.com/chemin/souschemin/index.php
dirname($_SERVER['PHP_SELF']) te donneras /chemin/souschemin (même s'il est
appelé depuis un fichier inclus).


J'ai dans mon cas créé un répertoire "include" et des sous reps "html" et
"classes". puis dedans un fichier 'conf.inc.php' avec:

<?php
// __DIR__ ne marche qu'avec PHP > 5.3 donc on utilise:
$working_dir = dirname(__FILE__) ;

//set the include path:
$system_include_path = get_include_path();.$system_include_path);
set_include_path($working_dir.PATH_SEPARATOR.
$working_dir."/classes".PATH_SEPARATOR.$working_dir."/html".PATH_SEPARATOR.
$system_include_path);

//configure __autoload to automaticaly include classes:
function my_autoload($class_name){
global $working_dir;
//require_once __DIR__.'/classes/'.$class_name.'.inc.php';
require_once $working_dir.'/classes/'.$class_name.'.inc.php';
}
spl_autoload_register('my_autoload');
?>

Ensuite, je fais un:
require_once('include/conf.inc.php');
dans chaque fichier, et c'est tout.

Un:
include('quelquechose');
recherchera 'quelquechose' dans le nouveau "include_path"

Un:
$object = new NomDeClasse();
Chargera automatiquement le fichier dans include/classes/NomDeClasse.inc.php

Un:
$contenu = file_get_contents ('NomFichier', TRUE);
cherchera NomFichier dans l'include path.

ATTENTION:
pour des "liens" (dans un contenu "html") j'utilise:
<a href="<?php echo dirname($_SERVER['PHP_SELF']).'/souschemin/fichier.php'
?>">NomDuLien</a>

Ou plus sécure:
<a href="<?php echo
htmlentities(dirname($_SERVER['PHP_SELF']).'/souschemin/fichier.php')
?>">NomDuLien</a>
Ainsi, le lien dépend du fichier qui "porte l'inclusion" (et non de là où le
fichier est inclus)

Voilà.
--
Web Dreamer
Continuer la lecture sur narkive:
Loading...