Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 11h22   #1
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
Par défaut Chemin relatif d'un 'include' dans une arborescence différente

Bonjour,

Je me retrouve avec un problème avec mon Head qui est inclus dans toute mes pages, seulement j'ai structuré pour plus de clarté mon site avec en racine les élément de base
-Head
-pied
-menu
Ainsi que les premières page tel que accueil, etc... cependant j'ai un dossier candidat ou les éléments pour le candidat sont mit dedans tel que l'inscription par exemple, idem avec un dossier administrateur et ses pages.

Je me retrouve donc avec un problème de CSS, j'ai une page CSS pour tout le site situé dans un dossier design, qui est appelé en chemin relatif par accueil a la racine, mais aussi par mes pages dans administrateur ou dans candidat.
Vous comprendrez que le chemin n'est pas le même a chaque fois et donc mon css ne s'applique pas.

Je sais que je pourrait créer un deuxième Head avec l'autre chemin et hop c'est réglé mais c'est a mes yeux pas propre. Je désirerai créer une fonction qui me permet de gérer cela que je pourrai réutiliser plus tard ailleurs.

Mais je ne sais pas trop comment m'y prendre.
Apres quelque recherche je suis tomber sur les fonction serveur tel que $_SERVER[''DOCUMENT_ROOT''], je pensait fait une comparaison avec les chemin possible entre mes dossier et faire un switch pour définir si le chemin sera ../design/ ou design/

Quand pensez vous? connaissez vous quelque chose de plus efficace mise a part le chemin absolu?

Merci d'avance pour vos lumières.
merci d'avance
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 11h29   #2
Membre régulier
 
Homme
Chef de projet NTIC
Inscription : juin 2007
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2007
Messages : 69
Points : 70
Points : 70
Salut,

En fonction de ta conception tu peux soit utiliser un chemin absolue retrouvé par
Code :
$_SERVER['SERVER_NAME']/tondossierdecss/toncss.css
ou soit utiliser la fonction autoload de php 5 si ton Head est mis sous forme de classe.
Cobalt59 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/04/2011, 11h45   #3
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
merci pour votre réponse

je n'utilise aucunement de chemin absolu
et mon Head n'est pas sous forme de classe je l'ai juste isolé dans une autre page web en faisant des include sur mes autre page pour n'avoir qu'un seul Head a modifier.
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 11h46   #4
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
ou implanter un dossier d'include grâce à set_include_path ou directement dans le PHP.ini
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 12h10   #5
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
Intéressant je ne savais pas que l'on pouvais modifier le php.init pour y placer des include mais en y réfléchissant c'est logique mais c'est valable quand ont créer des fonction ou de l'objet non ?

Pour moi j'ai juste un Head avec du html est ce vraiment la meilleur solution ? et ce, même si je développe plusieurs site différent ?
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 12h35   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Je pense que tu devrais utiliser un front-controller qui est à la racine de ton site et qui ne change jamais de répertoire afin de t'affranchir de cette contrainte de localisation. L'exemple fourni est pour Java, je le mets quand même pour que tu aies une idée de la logique à implémenter.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h10   #7
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
Oui je voit cela réglerai mon problème mais c'est un modèle MVC basé sur une programmation objet, malheureusement si j'adopte ce mode je devrai re coder tout mon site dans l'immédiat ce n'est pas prévu bien que je le reconnais j'aurai du commencer en objet cela aurai été bien plus intelligent.
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h24   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Tu n'as pas forcément besoin de refaire ton site en MVC, tu peux te servir de l'URL rewriting pour tout faire passer par un index unique qui lui fera le dispatching dans les bonne vues (ou script je sais pas comment tu as fait ton truc) sans changer le répertoire de travail. ça reste un front-controller en quelque sorte.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h27   #9
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Citation:
Envoyé par darkterreur Voir le message
Intéressant je ne savais pas que l'on pouvais modifier le php.init pour y placer des include mais en y réfléchissant c'est logique mais c'est valable quand ont créer des fonction ou de l'objet non ?

Pour moi j'ai juste un Head avec du html est ce vraiment la meilleur solution ? et ce, même si je développe plusieurs site différent ?
Attention, set_include_path n'agit que sur les include et require, pas sur les appels de fonction ou d'objet. Pour l'inclusion automatique des objets, il est préférable d'utiliser un front-controller ou/et un autoload.

exemple :
Code :
1
2
3
4
5
6
7
.
|-- index.php
|-- t1
|   |-- a
`-- t2
    |-- b
    `-- c
Code :
1
2
3
4
5
6
7
<?php
 
set_include_path('t1'.PATH_SEPARATOR.'t2');
 
include 'a';  // venant du dossier t1
include 'b';  // venant du dossier t2
include 'c';  // venant du dossier t2
C'est un choix facile et rapide mais sur la durée et sur de nombreux projets, c'est bof bof.
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h53   #10
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
Attention, set_include_path n'agit que sur les include et require, pas sur les appels de fonction ou d'objet. Pour l'inclusion automatique des objets, il est préférable d'utiliser un front-controller ou/et un autoload.
si, l'include path à un effet sur l'autoloader natif de PHP (enregistré par défaut par l'appel de spl_autoload_register). Il va chercher des fichiers correspondant à <nom_class>.php dans l'include path à chaque rencontre d'une classe inconnue. Il est possible de setter manuellement l'extension des classes à rechercher avec spl_autoload_extensions.

En tout cas, ce n'est jamais le rôle d'un front-controller de charger les classes d'un système. C'est tout au plus le rôle du bootstraper.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h50   #11
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
l'autoload de php utilise l'include_path, pas l'inverse. C'est ce que j'ai dit (il me semble, même si c'était pas les même mots).

Par contre, oui, j'ai écrit sans réfléchir pour l'inclusion d'objet et le front-controller. C'est ça de faire 10 trucs en même temps
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 17h43   #12
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
mhh d'accord

Donc si je comprend bien je dois utiliser 'set_include_path', c'est bien cela ?

Je vais faire quelque recherche la dessus.
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h46   #13
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
dois ? Non.

Rien ne t'y oblige.

Clairement, le mieux serait de tout basculer en objet et si possible avec MVC. Mais bon, c'est sûr, c'est chronophage (j'en sais quelque chose, j'y suis passé et dans un cadre professionnel)

Après, c'est à toi de voir selon le temps que tu as maintenant et le temps que tu veux y passer plus tard (en cas de bug ou d'évolution future, le paradigme objet c'est toujours mieux)
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 11h01   #14
Membre du Club
 
Inscription : septembre 2009
Messages : 314
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 314
Points : 46
Points : 46
Bonjour,
Je tiens a vous remercier tous pour vos informations précieuses.

Je poste la solution que j'ai adopté afin d'aider d'autre personnes.
voici une fonction php qui permet de modifier le chemin d'un fichier afin de pouvoir l’appeler depuis plusieurs endroit d'une arborescence.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function docRoot() 
{
	$dossier = $_SERVER['SCRIPT_NAME'];
	$compteur = substr_count($dossier, '/');
	$compteur2 = substr_count(__FILE__,'C:\wamp');
		if(($compteur == 2) && ($compteur2 != 0)) { // =2 slashs ET localhost
		$docRoot = './';
		} elseif(($compteur > 2) && ($compteur2 != 0)) { // >2 slashs ET localhost
		$docRoot = '../';
		} elseif(($compteur >= 2) && ($compteur2 == 0)) { // >=2 slashs ET online
		$docRoot = '../';
		} elseif(($compteur < 2) && ($compteur2 != 0)) { // <2 slash ET localhost
		$docRoot = '../';
		} elseif(($compteur < 2) && ($compteur2 == 0)) { // <2 slash ET online
		$docRoot = './';
		}
		if ($docRoot =="../") $docRoot ="./../";
	return $docRoot;
}
 
?>
Et voila un exemple pour l’appeler.
Code :
1
2
3
4
5
6
<head>
	<title>Formation</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<?php include('Fonction.php');	?>
	<link rel="stylesheet" media="screen" type="text/css" title="Design" href="<?php  echo docRoot(); ?>design/design.css" />
</head>
Au revoir et a bientôt.
darkterreur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h48.


 
 
 
 
Partenaires

Hébergement Web