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 16/03/2011, 15h14   #1
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 100
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : octobre 2009
Messages : 100
Points : 27
Points : 27
Par défaut DOMDocument avec code source navigateur ?

Bonjour,

Je développe actuellement un petit site perso, et je souhaite mettre en place un fil d'ariane. Je ne veux pas m'embêter à gérer ça via BDD, donc je me fais une petite classe avec une fonction qui me permet à partir de l'emplacement d'une page, de retracer tout le chemin vers elle.

Sur ce point aucun problème, le chemin est correctement retracé. Ce que je souhaite c'est à chaque bout de chemin, retrouver le titre de la page. Pour cela, j'ai fait quelque recherche sur le net et suis tombé sur DOMDocument. J'ai fait quelque test et cela semble bien fonctionné pour ce qui est la récupération des balises title.

Mais dans mon cas, mon problème est que quand je lui fournis un lien, DOMDocument fait son boulot et parcourir le fichier appelé par défaut (index.php). Mais moi, je souhaiterai qu'il analyse ce que retourne le navigateur plutôt que le fichier qui se trouve à l'adresse indiqué. Car en effet, le fonctionnement de mes pages se base sur le principe suivant : j'ai une page type dans un dossier include, et la majorité de mes autres pages sont des index.php, qui possède des variables de configuration style $title pour le titre de la page, $page pour la page à inclure, etc... puis qui inclue cette page type. Dans ce cas, DOMDocument ne trouvera jamais de balise title s'il analyse le code car elle n'y sera pas présente.

Ma question : y-a-t-il un moyen de faire la même chose mais avec le code retourné par le navigateur ? J'ai bien peur que cela passe du serveur au client et qu'au lieu de faire mon fil d'ariane avec php je doivent le faire avec javascript, mais je demande confirmation.

Merci d'avance pour vos réponse.
neo18045 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h00   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Ce n'est pas le chemin vers ton fichier que tu dois donner à DOMDocument mais son url d'accès normal.

A savoir si tu as des includes de la sorte :
Code :
1
2
3
4
5
// index.php
 
//... code ....
include('page.php');
//... code ...
Et que tu souhaites cibler page.php il ne faut pas envoyer page.php mais bel et bien index.php (avec à la rigueur les variables GET nécessaires à valider des conditions.

Ainsi DOMDocument se comportera comme ton navigateur puisqu'il accèdera à la même url.

Si par contre tu as une modification du code affiché grâce à du javascript c'est en effet impossible de tomber sur le même résultat que le navigateur (car le code JS ne sera pas interprété).
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 17h01   #3
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 100
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : octobre 2009
Messages : 100
Points : 27
Points : 27
C'est bien ce que je fais. Pour info je fais mes test sous IIS et en local.

Voilà un peu tous mes codes de test histoire de voir où peut-être le problème (pour info il y a plein de donnée test donc il ne fonctionne pas encore comme il devrait fonctionné) :

Ma classe Navigation
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
	class Navigation{
		public static function getTitle($path){
			//$path = "http://".$_SERVER["HTTP_HOST"].$path;
			$doc = new DOMDocument();
			$doc->loadHTMLFile($path);
			$title = $doc->getElementsByTagName("title")->item(0)->nodeValue;
			return $title;
		}
		public static function breadcrumb(){
			$path = explode("/",$_SERVER["PHP_SELF"]);
			$newPath = $path[0]."/";
			$breadcrumb = array();
			$breadcrumb[0] = array("TITLE" => Navigation::getTitle($newPath), "PATH" => $newPath);
			for($i=1;$i<count($path)-1;$i++){
				$newPath = $newPath.$path[$i]."/";
				$breadcrumb[] = array("TITLE" => Navigation::getTitle($newPath."index.php"), "PATH" => $newPath);
			}
			return $breadcrumb;
		}
	}
?>
Ma page type
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!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>
		<title><?php echo $title; ?></title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	</head>
	<body>
	<?php
			require_once($_SERVER["DOCUMENT_ROOT"]."/_breadcrumb/libs/class.navigation.php");
			echo Navigation::getTitle("http://localhost/_breadcrumb/index.php");
			/*
			$breadcrumb = Navigation::breadcrumb();
			for($i=0;$i < count($breadcrumb);$i++){
	?>
				<a href="<?php echo $breadcrumb[$i]["PATH"]; ?>"><?php echo $breadcrumb[$i]["TITLE"]; ?></a>
	<?php
			}
			*/
	?>
	</body>
</html>
Une page de test
Code :
1
2
3
4
<?php
	$title = "Accueil";
	require_once($_SERVER["DOCUMENT_ROOT"]."/_breadcrumb/include/inc.template.php");
?>
Là, j'ai fais un accès direct à la page que je souhaite et il me retourne des erreurs :
Citation:
Warning: DOMDocument::loadHTMLFile(http://localhost/_breadcrumb/index.php) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! in C:\inetpub\wwwroot\_breadcrumb\libs\class.navigation.php on line 6

Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: I/O warning : failed to load external entity "http://localhost/_breadcrumb/index.php" in C:\inetpub\wwwroot\_breadcrumb\libs\class.navigation.php on line 6

Notice: Trying to get property of non-object in C:\inetpub\wwwroot\_breadcrumb\libs\class.navigation.php on line 7
Pour info, en usage normale, quand il cherche le tout premier titre, l'url passer est "http://localhost/" et la il trouve bien le titre de la page racine dont le nom est "iisstart.htm" et qui possède bien des balise title dans sont code, d'où mon questionnement si DOMDocument consulte le code du fichier et non celui retourné par le navigateur.
neo18045 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h20   #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
Citation:
Warning: DOMDocument::loadHTMLFile(http://localhost/_breadcrumb/index.php) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! in C:\inetpub\wwwroot\_breadcrumb\libs\class.navigation.php on line 6
ça ça veut dire qu'il n'arrive pas à trouver 'http://localhost/_breadcrumb/index.php'. Donc, on n'en est même pas à l'étape où se demander s'il interprète le php ou le html généré ici.

Et je spoile un peu mais c'est le html généré
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h39   #5
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 100
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : octobre 2009
Messages : 100
Points : 27
Points : 27
Si c'est sur le HTML généré alors c'est parfait. Reste juste à savoir pourquoi il ne me trouve pas la page avec cette URL qui est pourtant la bonne. Question peut-être bête mais peut-il accéder la page sur laquelle on est ?
neo18045 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h12   #6
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
Peux-tu accéder à http://localhost/_breadcrumb/index.php ? (question bête mais bon, au cas où )

Apparemment, ça peut arriver avec serveur IIS ou serveur avec vérification.

Il faut passer par http://php.net/manual/fr/function.li...ms-context.php pour rajouter des éléments selon configuration.
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h43   #7
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 100
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : octobre 2009
Messages : 100
Points : 27
Points : 27
Citation:
Envoyé par Shikiryu Voir le message
Peux-tu accéder à http://localhost/_breadcrumb/index.php ? (question bête mais bon, au cas où )
Oui testé et re-testé, d'où mon étonnement que DOMDocument n'arrive pas à accéder à la page.

Citation:
Envoyé par Shikiryu Voir le message
Apparemment, ça peut arriver avec serveur IIS ou serveur avec vérification.

Il faut passer par http://php.net/manual/fr/function.li...ms-context.php pour rajouter des éléments selon configuration.
lbxml ça me dit quelque... je me souviens que dans l'exemple que j'ai vu, la personne faisait ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$url = 'http://www.google.fr';
 
libxml_use_internal_errors(true);
 
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
 
libxml_clear_errors();
 
$title = $doc->getElementsByTagName('title')->item(0);
 
echo $title->nodeValue;
Mais je veux toujours testé de tout faire en un minimum de code en enlevant ce qui peut être inutile donc j'avais testé sans ça pour voir et je l'ai oublié. Je vais me renseigner dessus.
neo18045 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h06.


 
 
 
 
Partenaires

Hébergement Web