Page 1 sur 1

Générer un formulaire complet avec XML ?

Posté : 03 sept. 2005, 20:45
par lemoineo
Les exemples autres que simplistes ne semblent pas courir les forums :wink:
Chargeant un résultat XML depuis PHP, j'ai donc une liste complète :

Code : Tout sélectionner

<personne> <nom>DUJNOUX</nom> <prenom>Paul</prenom> <age>18</age> </personne> <personne> <nom>BATTONDHCAISE</nom> <prenom>Jérôme</prenom> <age>34</age> </personne>
En mettant en forme cette liste par du XSL basique, j'arrive à fabriquer un bon vieux select des familles avec ses options sur le NOM mais ...
Comment afficher l'AGE et le PRENOM de celui qui est sélectionné sans se repastiller une autre requête vers mon PHP favori ?
Les as du XSL, vous savez ?

Posté : 04 sept. 2005, 11:59
par h2o
Montre nous ton document xsl basique, cela nous indiquera également comment tu veux afficher les données.

Posté : 04 sept. 2005, 13:10
par h2o
Le document xml (pour faire le test, j'ai ajouté un élément racine "carnet") :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <carnet> <personne> <nom>DUJNOUX</nom> <prenom>Paul</prenom> <age>18</age> </personne> <personne> <nom>BATTONDHCAISE</nom> <prenom>Jérôme</prenom> <age>34</age> </personne> </carnet>
Le résultat souhaité (exemple très simple) :

Code : Tout sélectionner

DUJNOUX - âge : 18<br/>BATTONDHCAISE - âge : 34<br/>
Le document xsl :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:template match="carnet"> <xsl:for-each select="personne"> <xsl:value-of select="nom"/> <xsl:text> - âge : </xsl:text> <xsl:value-of select="age"/> <br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Commentaire :
1. je veux créer un document xml, sans la déclaration <?xml ... ?> (output)
2. Je me positionne au niveau de la racine (template match="racine")
3. Je fais un traitement en boucle pour chaque personne (for-each)
4. Pour chaque personne, je sélectionne son nom (value-of select="nom")
5. Je sépare le nom et l'âge par un court texte.
6. Je sélectionne l'âge
7. je passe à la ligne (<br/>)

Voilà.
J'espère avoir été compréhensible.

Remarque pour le point 1. La librairie de transformation utilisée par php semble avoir un bug : la déclaration n'est pas omise.

Reste à demander à php d'appeler le document xml, le document xsl, à effectuer la transformation et à afficher le résultat.

Précisions sur ma demande :-)

Posté : 04 sept. 2005, 13:48
par lemoineo
Le fichier XSL envisagé donne une bonne idée du résultat espéré

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <span> Nom <br /> <select name="nom"> <xsl:for-each select="personnes/personne"> <option><xsl:value-of select="nom" /></option> </xsl:for-each> </select> <br /> Prénom : <br /> <input name="prénom " type="text" value="inconnu" /> <br /> Age : <br /> <input name="age" type="text" value="inconnu" /> </span> </xsl:template> </xsl:stylesheet>
en bref, chaque fois que je change de NOM, le prénom et l'age correspondent au nom sélectionné
(je n'ai pas fait figurer le Onchange )

Et le code XML pour mieux préciser (exemple)

Posté : 04 sept. 2005, 14:01
par lemoineo
Et le code XML pour mieux préciser (exemple)

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1" ?> <personnes> <personne> <nom>DUJNOUX</nom> <prenom>Paul</prenom> <age>18</age> </personne> <personne> <nom>BATTONDCHAISE</nom> <prenom>Jérôme</prenom> <age>34</age> </personne> </personnes>

Posté : 05 sept. 2005, 09:46
par h2o
J'ai compris.

Tu veux faire, à partir d'une "base de données" xml, ce dont parle le tutoriel suivant : http://www.phpfrance.com/forums/voir_sujet-4562.php :
Compléter une rubrique d'un formulaire en fonction du contenu d'une autre.

Pour le php, inspire toi de la version 100% php. Sauf que les requêtes sql deviennent des fonctions DOM.

Une seule variable : nom.
Tu envoies cette variable vers ton binôme xml-xsl et tu obtiens en retour l'extrait de ton formulaire complété ou non en fonction du fait qu'un nom ai été sélectionné au nom.

Attention : le danger de cette méthode tient à l'unicité des noms ! Si tu as des homonymes, mieux vaux recourir à un identifiant unique autre que le nom.

Le document xsl (j'ai pris ton document comme point de départ) :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="nom"/> <xsl:template match="/"> <span> Nom <br/> <select size="1" name="nom"> <xsl:attribute name="value"> <xsl:value-of select="personnes/personne[nom = $nom]/nom"/> </xsl:attribute> <xsl:apply-templates select="personnes/personne"/> </select> <br/> Prénom : <br/> <input name="prénom " type="text"> <xsl:attribute name="value"> <xsl:value-of select="personnes/personne[nom = $nom]/prenom"/> </xsl:attribute> </input> <br/> Age : <br/> <input name="age" type="text"> <xsl:attribute name="value"> <xsl:value-of select="personnes/personne[nom = $nom]/age"/> </xsl:attribute> </input> </span> </xsl:template> <xsl:template match="personne"> <option> <xsl:value-of select="nom"/> </option> </xsl:template> </xsl:stylesheet>

Posté : 05 sept. 2005, 11:42
par h2o
Voici le document xsl légèrement remanié (j'ai fais cette correction, car je vais utiliser une solution semblable) :

xml :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1" ?> <personnes> <personne id="1"> <nom>DUJNOUX</nom> <prenom>Paul</prenom> <age>18</age> </personne> <personne id="2"> <nom>BATTONDCHAISE</nom> <prenom>Jérôme</prenom> <age>34</age> </personne> </personnes>
xsl :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="id"/> <xsl:template match="/" <span> Nom <br/> <select size="1" name="nom" onchange="document.forms[&apos;chgnom&apos;].submit();"> <option> <xsl:if test="$id = &apos;&apos;"> <xsl:attribute name="selected">selected</xsl:attribute> </xsl:if> </option> <xsl:apply-templates select="personnes/personne"/> </select> <xsl:if test="$id != &apos;&apos;"> <br/> Prénom : <br/> <input name="prénom " type="text"> <xsl:attribute name="value"> <xsl:value-of select="personnes/personne[@id = $id]/prenom"/> </xsl:attribute> </input> <br/> Age : <br/> <input name="age" type="text"> <xsl:attribute name="value"> <xsl:value-of select="personnes/personne[@id = $id]/age"/> </xsl:attribute> </input> </xsl:if> </span> </xsl:template> <xsl:template match="personne"> <option> <xsl:if test="@id = $id"> <xsl:attribute name="selected">selected</xsl:attribute> </xsl:if> <xsl:attribute name="value"> <xsl:value-of select="@id"/> </xsl:attribute> <xsl:value-of select="nom"/> </option> </xsl:template> </xsl:stylesheet>
et la partie php (version 5) :
print "<form action=\"" ;
print($_SERVER['PHP_SELF']) ;
print "\" method=\"post\" id=\"chgnom\">" ;
				
$id = $_POST['nom'];
/* load the xml file and stylesheet as domdocuments */ 
$xsl = new DomDocument(); 
$xsl->load('personnes.xsl'); 
$inputdom = new DomDocument(); 
$inputdom->load('personnes.xml'); 
/* create the processor and import the stylesheet */ 
$proc = new XsltProcessor(); 
$xsl = $proc->importStylesheet($xsl); 
/* create param */
$proc->setParameter(null, "id", $id);
/* transform and output the xml document */ 
$newdom = $proc->transformToDoc($inputdom); 
print $newdom->saveXML(); 

print "</form>" ;

Super , t'es le roi du XSL :-)

Posté : 05 sept. 2005, 18:26
par lemoineo
Merci , je vais tester tes propositions !!

Côté PHP , no problemo , je maitrise (un peu)
c'est côté Javascript que cela se corse dès qu'il s'agit de reprendre une sortie XML !

Code : Tout sélectionner

<html> <header> <script type="text/javascript"> function AfficheXml(FormeXSL,Cible,Entrée) { // chargement du fichier XML var xmlObj = new ActiveXObject("Microsoft.XMLDOM"); xmlObj.async = false; xmlObj.load("phpfrance.xml"); // chargement du fichier XSL var xslObj = new ActiveXObject("Microsoft.XMLDOM"); xslObj.async = false; xslObj.load(FormeXSL); // transformation en Html var htmObj = xmlObj.transformNode(xslObj); document.getElementById(Cible).innerHTML = htmObj; } function EffaceXml() { document.getElementById('Cible').innerHTML = "<div id='Cible' style:'background-color:#00EEFF;'>Cible<br><input name='Cible' value='Cible' size=10></div>"; } </script> </header> <body> <div id='Début' onclick="AfficheXml('phpfrance2.xsl','Cible','Classe=Coucou')">Début Affichage<br> <input name='Début' value='Début' size=10> </div> <div id='Cible' style:'background-color:#00EEFF;'>Milieu Affichage (Cible)<br> <input name='Cible' value='Cible' size=10> </div> <div id='Suite' style:'background-color:#FF00FF;' onclick="EffaceXml()">Fin Affichage<br> <input name='Suite' value='Suite' size=10> </div> </body> </html>
Pour finir cet article, voici le code HTML qui relie le XSL, le XML
le PHP remplacera le XML et affichera les données issues de la requête en XML !

Merci encore

Bon cela devient coton ! Je vais rouvrir un nouvel article !

Posté : 05 sept. 2005, 19:01
par lemoineo
Comme dès le début, la question n'est pas apparue claire,
je reprends tout à zéro !