Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
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 13/02/2011, 00h43   #1
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Par défaut Insérer des variables php dans un fichier xml

Bonjour à tous.
Je débute en xml et n'est que peu d'expérience en php.

Je souhaite changer dynamiquement l'intitulé des continents d'une carte intéractive codée en xml.

Voici le fichier xml de départ

Code :
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<map map_file="maps/continents.swf" zoom_x="0%" zoom_y="0%" zoom="100%" tl_long="-168.49" tl_lat="83.63" br_long="190.3" br_lat="-55.58" >
  <areas>
    <area mc_name="africa" title="Africa" color="#7F7F65" zoom="250%" zoom_x="-84.94%" zoom_y="-118.95%" url="!ammap/ammap_data_africa.xml"/>
    <area mc_name="australia" title="Australia and Oceania" color="#B8183E" zoom="400%" zoom_x="-294.35%" zoom_y="-280.58%" url="!ammap/ammap_data_australia.xml"/>
    <area mc_name="europe" title="Europe" color="#BC2737" zoom="310%" zoom_x="-116.92%" zoom_y="-80.99%" url="!ammap/ammap_data_europe.xml"/>
    <area mc_name="asia" title="Asia" color="#CDC9AC"  zoom="240%" zoom_x="-125.46%" zoom_y="-78.18%" url="!ammap/ammap_data_asia.xml"/>
    <area mc_name="north_america" title="North America" color="#313326" zoom="270%" zoom_x="-9.51%" zoom_y="-74.75%" url="!ammap/ammap_data_namerica.xml"/>
    <area mc_name="south_america" title="South America" color="#A14F4F" zoom="250%" zoom_x="-32.36%" zoom_y="-151.95%" url="!ammap/ammap_data_samerica.xml"/>
  </areas>
</map>
N'étant qu'en phase de "prise en main", je ne cherche qu'à faire changer le title en fonction d'une base de données toute bêbête. J'ai donc (peut-être un peu naïvement) fait une connection à une db ainsi qu'un query, mis le code xml dans des echo, en le concaténant avec les variables contenant les valeurs de la base de données. Evidemment ça ne marche pas, et pour ne rien arranger, la carte ne me permet pas de savoir de quel type d'erreur il s'agit. Bref, voici mon code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
	header('Content-Type: text/xml');
	try
	{
		mysql_connect('localhost', 'root', '');
		mysql_select_db('panjiia');
		$requete = mysql_query('select * from test');
		$arr = array();
		while ($obj = mysql_fetch_object($requete))
		{
			$arr[]= $obj;
		}
		echo '<?xml version="1.0" encoding="UTF-8"?>';
		echo '<map map_file="maps/continents.swf" zoom_x="0%" zoom_y="0%" zoom="100%" tl_long="-168.49" tl_lat="83.63" br_long="190.3" br_lat="-55.58" >';
		echo '<areas>';
		$texte = $arr[0]->valeur_continent;
		echo '<area mc_name="africa" title="'.$texte.'" color="#006A6A" zoom="250%" zoom_x="-84.94%" zoom_y="-118.95%" url="!ammap/ammap_data_africa.xml"/>';
		$texte = $arr[1]->valeur_continent;
		echo '<area mc_name="australia" title="'.$texte.'" color="#55604F" zoom="400%" zoom_x="-294.35%" zoom_y="-280.58%" url="!ammap/ammap_data_australia.xml"/>';
		$texte = $arr[2]->valeur_continent;
		echo '<area mc_name="europe" title="'.$texte.'" color="#55604F" zoom="310%" zoom_x="-116.92%" zoom_y="-80.99%" url="!ammap/ammap_data_europe.xml"/>';
		$texte = $arr[3]->valeur_continent;
		echo '<area mc_name="asia" title="'.$texte.'" color="#70A184" zoom="240%" zoom_x="-125.46%" zoom_y="-78.18%" url="!ammap/ammap_data_asia.xml"/>';
		$texte = $arr[4]->valeur_continent;
		echo '<area mc_name="north_america" title="'.$texte.'" color="#337D63" zoom="270%" zoom_x="-9.51%" zoom_y="-74.75%" url="!ammap/ammap_data_namerica.xml"/>';
		$texte = $arr[5]->valeur_continent;
		echo '<area mc_name="south_america" title="'.$texte.'" color="#8CA19A" zoom="250%" zoom_x="-32.36%" zoom_y="-151.95%" url="!ammap/ammap_data_samerica.xml"/>';
		echo '</areas>';
		echo '</map>';
	}
	catch (exception $e)
	{
		die('Erreur : '.$e->getmessage());
	}
?>
Voilà, merci d'avance.
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 11h39   #2
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Marrant, j'ai déjà du générer des fichiers xml pour AMMAP.

Qu'est ce qui ne fonctionne pas exactement?
As-tu essayé d'afficher ton fichier xml simplement dans ton navigateur?
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 11h57   #3
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 015
Points : 5 015
Hello

Tu sais que tu peux toujours faire ça en PHP:
Code :
1
2
3
4
5
 
<?=$xml_header;?>
<root>
  <node value="<?=$value?>"><?=$content?></node>
</root>
Tu mets ça dans un fichier que tu appelles par exemple test.xml.php
et tu l'appelles comme ça:
Code :
1
2
3
4
5
6
7
8
 
<?php
$value = 1;
$content = "Lorem ipsum sit amet...";
$xml_header = '<?xml version="1.0" encoding="UTF-8"?>';
 
header('Content-Type: text/xml');
include 'test.xml.php';
et c'est dans la boite.
__________________
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 15/02/2011, 00h13   #4
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
J'étais sur le point de vous répondre (un truc incompréhensible et incompris) quand quelquechose a fait tilt. Le fichier text.XML.php dont parle Benjamin Delespierres. Je n'avais mis le .xml.

Merci à vous deux en tout cas, et restez à l'écoute, je risque d'avoir besoin de vous rapidement et intensivement
Merci encore !
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 02h37   #5
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Dolu02 j'aurais encore une question pour toi (tu n'aurais jamais dû dire que tu connaissias ammap ). Comment fait-on pour envoyer des variables php dans les fichiers amma_data_africa, amma_data_europe...? D'ailleurs, ces fichiers sont quasiment identiques, et listent les pays de tous les continents, ça ne fait pas un peu double (enfin sextuple) emploi ? Il n'ya pas moyen de simplifier tout ça avec du php ? Ca fait beaucoup de questions désolé ^^
Merci d'avance.
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 12h36   #6
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Moi je n'ai travaillé qu'avec une seule carte du monde.
Mais à mon avis, tu peux travailler avec un seul fichier de données qui sera utilisé par toutes tes cartes. Lors de l'appel de tes cartes tu peux spécifier le fichier de settings et le fichier data :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
	<script type="text/javascript">
		// <![CDATA[		
		var so = new SWFObject("/dossier-de-la-carte/ammap.swf", "ammap", "910", "400", "8", "#FFFFFF");
		so.addVariable("path", "/ton/chemin/");
		so.addVariable("settings_file", escape("/ton-dossier/ton-fichier-settings.xml"));
		so.addVariable("data_file", escape("/ton-dossier/ton-fichier-data.xml"));
		so.addParam("scale", "noscale"); 
   		so.addParam("salign", "lt");
		so.addParam("wmode", "transparent");
		so.write("flashcontent");
		// ]]>
	</script>
Je parle donc des variables settings_file et data_file.

Ensuite la carte de chaque continent ira piocher dans les pays qui le concernent.

J'espère que ça pourra t'aider pour la suite!
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 18h04   #7
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Merci de ta réponse.
Ca en fait je l'avais déjà fait. Mais un truc me titille, les fichiers de chaque continent sont en tous points identiques, à l'exception du zoom.
Bref, la solution que j'ai retenue est la suivante.
Je crée des fichiers ammap_data_africa.xml.php etc... qui appellent le fichier xml de départ ainsi qu'une fonction de parsage qui cherche chaque title pour le modifier en fonction d'une bas de données. Dans le code ci dessous j'ai zappé la base de données pour faire un truc statique, histoire de simplifier, mais l'erreur reste la même, j'en déduis qu'a priori, mon fichier php est correct.

Donc, voici ammap_data_africa.xml.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
	session_start();
	header('Content-Type: text/xml');
	require ('parsage.php');
	//$i = 1;
	//while (isset($_SESSION[$i]))
	//{
		echo parsage('ammap_data_africa.xml', 'plop', 'FRANCE');
		//echo parsage('ammap_data_africa.xml', $_SESSION[$i], $_SESSION['pays']);
		//$i++;
	//}
?>
et la fonction de parsage (pour laquelle j'ai de sérieux doutes) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
	function parsage ($document, $newtitle, $pays_actuel)
	{
		$doc_xml = new DomDocument();
		$doc_xml->load($document);
		$elements = $doc_xml->getElementsByTagName('map');
		foreach ($elements as $element);
		{
			if ($element->node_Value == $pays_actuel)
			{
				$element->node_Value = $newtitle;
			}
		}
		return $doc_xml;
	}
?>
D'ailleurs, je ne suis même pas sûr que ce soit à proprement parlé une fonction de parsage, je débute réellement alors cette map que m'a donné mon patron est un vrai calvaire.
Merci d'avance pour ta (ou vos) réponse.
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 18h23   #8
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Chez moi, dans le(s) fichier(s) data, l'élément <map> est la racine du document et dans lequel se trouvent des <area> pour chaque pays.

Si je comprends bien tu essaie de changer le nom du pays?

Sinon, il y a plus simple :
Dans le dossier ammap_data_africa.xml, tu insères des "tokens", par exemple [MNO-PAYS-1], [MON-PAYS-2] etc...

Ensuite au lieu de jouer avec simplexml, tu fais un str_replace sur tes toeks et tu renvoies le tout.
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 19h47   #9
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Hmm Hmm, mais euh, c'est quoi un token exactement ? Et le str_replace s'utilise en php ? Dans le parsage ? OMG je vais jamais m'en sortir :/

Hmm ok je crois que je vois le genre.
Le problème, c'est que cdata est une balise, si je me trompe pas.
Or le truc que je veux changer est uniquement le title d'une autre balise, et il ne semble pas apprécier une balise cdata à l'intérieur d'une autre (les balises <area> en l'occurence). Je pourrais mettre celle-ci entière dans cdata, mais après il faudrait ne changer que le title... En utilisant les expréssions régulières en php peut-être...
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 12h36   #10
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Disons que tu pars de ce fichier
Code :
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<map map_file="maps/continents.swf" zoom_x="0%" zoom_y="0%" zoom="100%" tl_long="-168.49" tl_lat="83.63" br_long="190.3" br_lat="-55.58" >
  <areas>
    <area mc_name="africa" title="[TITLE-1]" color="#7F7F65" zoom="250%" zoom_x="-84.94%" zoom_y="-118.95%" url="!ammap/ammap_data_africa.xml"/>
    <area mc_name="australia" title="[TITLE-2]" color="#B8183E" zoom="400%" zoom_x="-294.35%" zoom_y="-280.58%" url="!ammap/ammap_data_australia.xml"/>
    <area mc_name="europe" title="[TITLE-3]" color="#BC2737" zoom="310%" zoom_x="-116.92%" zoom_y="-80.99%" url="!ammap/ammap_data_europe.xml"/>
    <area mc_name="asia" title="[TITLE-4]" color="#CDC9AC"  zoom="240%" zoom_x="-125.46%" zoom_y="-78.18%" url="!ammap/ammap_data_asia.xml"/>
    <area mc_name="north_america" title="[TITLE-5]" color="#313326" zoom="270%" zoom_x="-9.51%" zoom_y="-74.75%" url="!ammap/ammap_data_namerica.xml"/>
    <area mc_name="south_america" title="[TITLE-6]" color="#A14F4F" zoom="250%" zoom_x="-32.36%" zoom_y="-151.95%" url="!ammap/ammap_data_samerica.xml"/>
  </areas>
</map>
D'abord, tu récupères le contenu du fichier dans une variable, ensuite tu remplaces tes "tokens" par tes variables.
Donc quelquechose du genre :
Code :
1
2
3
4
5
6
7
8
//Récupération du contenu du fichier xml
$xml = file_get_contents('ton-dossier/ton-fichier.xml');
//Insertion de tes variables
while($row = myqsl_fetch_object($ton_result_sql)) {
	$xml = str_replace('TITLE-'.$row->ton_ID, $row->ton_champs, $xml);
}
//Output de ton fichier final
echo $xml;
Ici, la variable $row->ton_ID, doit bien entedu correspondre avec les variables que tu as définie dans le fichier xml.
C'est juste une idée, c'est à adapter en focntion de tes besoins.

Les CDATA servent à mettre du texte dans le fichier xml :
Code :
1
2
3
4
5
6
<root>
	<item1>
		<id>123</id>
		<description><![CDATA[Ici je mets le texte dont j'ai envie, avec de la poncutation; un peu d'accents éàç aussi, des apostrophes ' " ' et des caractères spéciaux & @ $.]]></description>
	</item1>
</root>
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 16h44   #11
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
OK j'ai fait un truc dans le genre, sans utiliser des pseudo-variables du genre TITLE-1. Donc maintenant, si je lance mon fichier ammap_data_africa.xml.php seul, il fonctionne. Si je l'appelle via ammap_data.xml.php, là il boude.
Ca me sort "Un seul élément de niveau supérieur est autorisé dans un document XML." j'en conclut donc qu'il y a plusieurs balises <map> en sortie.

Là où je ne comprends pas, c'est que le fichier ammap_data_africa est appelé par ammap_data, auquel je n'ai pas touché ! Le php que j'utilise dans ammap_data.xml.php n'influe pas directement sur ammap_data, il calcule juste des variables de sorties utilisées dans ammap_data_africa.xml.php.

Y a-t-il un moyen de voir le xml généré par php ? Le source de la page (qui bug, donc) n'est pas disponible.
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 16h47   #12
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Citation:
Envoyé par Aezerium Voir le message
Y a-t-il un moyen de voir le xml généré par php ? Le source de la page (qui bug, donc) n'est pas disponible.
A priori (je peux me tromper), on peut toujours voir la source d'un document, même quand il est mal formé. Quel navigateur utilise-tu?

Sinon il est possible de voir ça en utilisant un webdebugger de type Fiddler lorsque tu lance ta map, ou alors HttpFox (ou autre) dans Firefox.
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 17h01   #13
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
Ah bah oui, je vois le code de ma page. Y'a dû y avoir un bug la dernière fois.
Mais bon, j'utilise des frames (mouais, mes profs datent de la guerre de 14) donc en source je vois que le frameset. Je bidouille mes fichiers pour faire correler tout ça, et je re-post

PS : Avant de continuer, faudra m'indiquer le montant de tes honoraires xD
En tout cas merci beaucoup pour ton aide.
Aezerium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 10h30   #14
Membre régulier
 
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 91
Points : 91
Avec le module Webdevelopper de Firefox, tu peux afficher la source d'une frame :

Click droit -> Webdevelopper -> voir source -> voir code source du cadre.

Pour les honoraires, je suis peut-être un peu cher alors un fera l'affaire!
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 11h24   #15
Invité de passage
 
Inscription : février 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 8
Points : 0
Points : 0
C'est bon ! J'ai réussi à modifier l'intitulé des pays dans ammap. Bon, mon sql foire et mes title affichent tous 0%. Pour un site de statistiques, c'est dommage :p. Mais ça c'est une autre histoire...
Donc voilà, merci bien pour ton aide précieuse !
Aezerium 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 10h07.


 
 
 
 
Partenaires

Hébergement Web