JeuWeb - Crée ton jeu par navigateur
Chemin absolu, mais pas tout à fait * pas taper * - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Chemin absolu, mais pas tout à fait * pas taper * (/showthread.php?tid=2274)



Chemin absolu, mais pas tout à fait * pas taper * - Plume - 13-01-2008

Bonsoir !

Bon, je vais être essayé d'être aussi clair que possible.

Je développe un site dans lequel j'utilise les méthodes AJAT { Asynchronous Javascript And Text }. Seulement, dans un modèle MVC, les inclusions de pages posent un conflit.
Par exemple, en gros, j'ai une page à la racine de mon site index.php qui inclue la page controller/index.php. Cette inclusion a lieu dans le bloc qui est mis à jour par la méthode AJAT.
Ce qui donne ceci à peu près : [ index.php ]
Code PHP :
<?php
ob_start
();
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<script type="text/javascript" src="controller/javascript.js"></script>
</head>

<body>
<div id="contenu">
<?php include 'controller/connexion.php'; ?>

<div id="dyn">
<?php include 'controller/index.php'; ?>
</div>
</div>
</body>
</html>
<?php ob_end_flush(); ?>
C'est le bloc dyn qui est modifié via la méthode AJAX. Dans notre fichier index.php, rien de bien intéressant pour le moment. Un simple texte suffirait à montrer que ça marche.

Jusque là, tout va bien.

Maintenant, si on entre un peu plus profondément dans l'inclusion, on commence à être en conflit.
Par exemple, en gros toujours, dans la page controller/index.php, j'inclue la page controller/news.php.
Ce qui nous donne : [ controller/index.php ]
Code PHP :
<?php
if( isSet( $_GET[ 'page' ] ) AND !empty( $_GET[ 'page' ] ) )
{
$pageOK = $_GET[ 'page' ];
if(
is_file( 'controller/' . $pageOK . '.php' ) )
{
include
'controller/' . $pageOK . '.php';
}
else
{
include
'controller/news.php';
}
}
else
{
include
'controller/news.php';
}
?>
Nous conservons le fichier index.php sus-cité.
Concernant controller/news.php, on se fiche de son contenu.

Là, on trouve des soucis.

Sans AJAT, l'inclusion d'inclusion se fait parfaitement.

Avec la méthode AJAT, on a un conflit avec les chemins vers le fichier controller/news.php.
AJAT, va chercher le fichier controller/news.php dans le dossier controller/. Conclusion, on cherche le fichier controller/controller/news.php qui n'existe évidemment pas.

J'ai donc pensé à mettre les chemins absolus, mais l'inclusion ne marche pas. Cette fois-ci, je ne pense pas que ce soit à cause de AJAT, mais ne trouvant pas, je vous consulte.

Quand je fais :
Code PHP :
<?php 
require_once '/someone_test/controller/news.php';
Il ne trouve pas le fichier ..

J'suis sur le cul, j'ai même fait ce petit test :
Code PHP :
<?php 
$documentRoot
= '/someone_test';

echo
$_SERVER['PHP_SELF'];

require_once(
$documentRoot . '/class/MySQLResult.class.php' );
Et il me retourne le message suivant :
Code :
/someone_test/class/MySQLDatabase.class.php
Warning: require_once(/someone_test/class/MySQLResult.class.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\someone_test\class\MySQLDatabase.class.php on line 12

Fatal error: require_once() [function.require]: Failed opening required '/someone_test/class/MySQLResult.class.php' (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\someone_test\class\MySQLDatabase.class.php on line 12

Si on lit la première ligne qui correspond à l'appel à PHP_SELF, on voit bien que le chemin existe. Et MySQLResult.class.php est bel & bien dans le même dossier que MySQLDatabase.class.php, je peux vous l'assurer :]

Merci par avance de l'aide que vous pourrez me donner. Moi, j'sais plus quoi faire ..

Lex, faut aller dormir main'nant !


RE: Chemin absolu, mais pas tout à fait * pas taper * - naholyr - 13-01-2008

J'ai pas tout bien lu et il est tard, mais je crois avoir cerné un problème de dossier courant.

J'utilise toujours
Code PHP :
<?php 
include dirname(__FILE__) . '/path/relative/to/current/file.php'
Ainsi je n'ai cure du "current working directory", j'inclus toujours des fichiers par leur emplacement par rapport au script dans lequel je fais l'include. Cela permet :
- de ne pas avoir de problème si ledit script est inclus dans un script qui a fait un vilain chdir()
- de ne pas avoir de problème d'include_path et autre (des fois, il n'y a pas "." dans l'include_path, balot)
- de ne pas avoir de problème de configuration quand je passe d'un DOCUMENT_ROOT à un autre

En revanche, j'ai peur que dans ton souci il y ait des histoires d'url-rewriting ou de path_info (courant quand on applique le modèle MVC) et là ce serait une autre histoire.


RE: Chemin absolu, mais pas tout à fait * pas taper * - NicoMSEvent - 13-01-2008

[mode ironique ON]
Bon ben, mon petit, as-tu déjà visité le site du zéro? ^^
[mode ironique OFF]


Il me semble que tu utilises un serveur windows, or, les chemins absolus que tu utilises sont pour UNIX!

Utilises plutot
Code :
$path='C:/xampp/htdocs';
include $path.'/path/relative/to/current/file.php';

Edit : C'est le matin, j'ai pas encore pris mon café... je peux me tromper Wink


RE: Chemin absolu, mais pas tout à fait * pas taper * - Plume - 13-01-2008

NicoMSEvent, tu as raison. J'ai repensé à mon problème quand je me suis levé, et c'était ma conclusion. J'aurais dû aller dormir avant de vous ennuyer Smile

Naholyr, j'avais oublié dirname(__FILE__), j'ai utilisé $_SERVER[ 'DOCUMENT_ROOT' ] à la place.

Le problème que tu soulèves concernant l'url-rewriting .. Uh ! J'préfère pas y penser tout de suite ..

Merci pour votre participation & encore désolé pour le dérangement :oops:


RE: Chemin absolu, mais pas tout à fait * pas taper * - naholyr - 13-01-2008

LexLxUs a écrit :Naholyr, j'avais oublié dirname(__FILE__), j'ai utilisé $_SERVER[ 'DOCUMENT_ROOT' ] à la place.
Rien à voir hein Wink
Avec dirname(__FILE__) tu n'es dépendant de rien, avec DOCUMENT_ROOT tu es dépendant de la configuration du serveur (par exemple le jour où tu veux déplacer ton application dans un sous-dossier, ça marche plus).


RE: [ Réglé ] Chemin absolu, mais pas tout à fait * pas taper * - Zamentur - 14-01-2008

et ben j'ai bien fait de lire ce topic j'avais pas pensé à dirname(_FILE_) jusqu'ici!


RE: [ Réglé ] Chemin absolu, mais pas tout à fait * pas taper * - Plume - 15-01-2008

Merci Nah', je note. J'avais oublié Smile

Lex.