Afficher dans un formulaire des élément d'un xml

Eléphanteau du PHP | 13 Messages

26 avr. 2013, 09:12

Bonjour,
ce n'est peut être pas bien dit dans le titre alors je vous explique plus clairement ce que j'essaye de faire.

Je suis entrain de générer des xml via des formulaire traité en php avec dom php.
Dans une de mes étapes j'ai besoin :
1 - choisir dans quel fichier xml déjà créer je veux ajouter des noeuds via un champ select ( ça j'ai réussi )
2 - par rapport au fichier choisit juste avant généré des valeurs d'attribut qu'il y a dans ce fichier xml ( c'est là que je bloque )

Je suppose que j'ai besoin d'ajax, mais je n'en ai encore jamais fait. Je ne sais pas très bien par ou commencer.

Voilà un de mes fichier xml :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?> <QuestionnaireConfiguration> <Title text="Liste de personne"/> <Page legend="identite" description="qui sont-ils ?"> <Line type="QUESTION" text="votre nom ?"> <input type="text" name="nom" value="nom"/> </Line> <Line type="QUESTION" text="votre prenom ?"> <input type="text" name="prenom" value="prennom"/> </Line> </Page> <Page legend="profession" description="qui font-ils ?"> <Line type="QUESTION" text="votre profession ?"> <input type="text" name="profession" value="profession"/> </Line> </Page> </QuestionnaireConfiguration>
Voici comment je récupère tous les nom des fichiers xml :
$dirname = 'C:/xampp/htdocs/XML/questionnaires/';
                        $dir = opendir($dirname); 

                        while($file = readdir($dir)) {
                            if($file != '.' && $file != '..' && !is_dir($dirname.$file))
                            {   
                                $file = str_replace('.xml', '', $file);
                                $file = str_replace('_', ' ', $file);
                                echo '<option>'.$file.'</option>';
                            }
                        }

                        closedir($dir);
Et ce que j'aimerai pouvoir récupérer dans le fichier xml choisit c'est la legend des noeuds Page, pour les mettre dans un champ select

Merci d'avance pour votre aide, dont j'ai vraiment besoin.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 avr. 2013, 10:56

salut,


as tu essayé simplexml ? (avec une requête xpath).


@+


Modération :
Afin d'obtenir plus de réponses, le sujet a été déplacé dans un forum plus approprié.
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 13 Messages

28 avr. 2013, 11:07

Je ne connait pas du tout le simpleXml, jusqu'à maintenant j'ai tout fait en dom php.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 avr. 2013, 11:22

Même combat :) , montre nous ton code si tu souhaite que l'on t'aide.

dans les deux cas tu devras demander la liste des noeuds et afficher l'attribut. une requête xpath peux t'y aider


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 13 Messages

29 avr. 2013, 09:28

En faite j'arrive à récupérer les informations dans un fichier xml.
Le seul truc qui me manque, c'est pour voir prendre les infos dans le fichier qui est séléctionné dans le select du dessus.

En claire ça ferai.

Etape 1 :
Je rempli une première fois le formulaire et je l'enregistre dans un fichier xml -> test1.xml. (pas de problème, là tous la bien)

Etape 2 :
Je rempli une deuxième fois le formulaire qui s’enregistre dans un nouveau xml -> text2.xml

Etape 3:
Je veux modifier test1.xml
J'ai un deuxième formulaire qui me propose dans un champs select les fichier que je peux modifier.
Puis un deuxième champs select qui me propose différents nœuds (différencier par leurs attributs) dans lesquels je peux ajouter ou modifier d'autre nœud.

Retrouver les attribut d'un fichier xml ne me pose pas de problème.
C'est juste de retrouver dynamiquement les attribut du fichier xml sélectionner et ensuite enregistrer dans le bon noeud.

Voilà ce que j'ai commencer à faire :

etape 1 et 2 :
Je créer mon fichier :
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <title>Questionnaire</title>
        <link rel="stylesheet" media="all" href="includes/styles.css" />
        <!--[if lt IE 9]>
        <script src="includes/html5ie.js"></script>
        <![endif]-->
    </head>
    <body>
        <form method="POST" action="ajoutquestionnaire.php">
            <fieldset>
                <legend>Création d'un questionnaire</legend>
                <p>
                    <label for="text_titre">Nom du questionnaire :</label>
                    <input type="text" id="text_titre" name="text_titre"/>
                </p>    
                <p>
                    <input type="submit" value="Enregistrer et créer une page"/>
                </p>

            </fieldset>
        </form>
    </body>
</html>
Je l'enregistre :

Code : Tout sélectionner

<?php $dom = new DOMDocument('1.0', 'utf-8'); $racine = $dom->createElement('QuestionnaireConfiguration'); $dom->appendChild($racine); /********AJOUT TITLE****************/ $titre = $dom->createElement('Title'); $textTitre = $dom->createAttribute('text'); $textTitre->value = $_POST['text_titre']; $titre->appendChild($textTitre); $racine->appendChild($titre); /**********************************/ $nomfichier = $_POST['text_titre']; $nomfichier = str_replace(' ', '_', $nomfichier); $filename = 'C:/xampp/htdocs/XML/questionnaires/' . $nomfichier . ".xml"; $dom->formatOutput = true; $dom->normalizeDocument(); $dom->save($filename); ?>
Je créer un premier champ dans mon formulaire et demandant dans quel fichier je veux enregistrer :
<form method="POST" action="ajoutpage.php">
            <label for="choixquestionnaire">Choix du questionnaire où ajouter la page :</label>
            <select id="choixquestionnaire" name="choixquestionnaire">
                <?php
                    $dirname = 'C:/xampp/htdocs/XML/questionnaires/';
                    $dir = opendir($dirname); 

                    while($file = readdir($dir)) {
                        if($file != '.' && $file != '..' && !is_dir($dirname.$file))
                        {   
                            $file = str_replace('.xml', '', $file);
                            $file = str_replace('_', ' ', $file);
                            echo '<option>'.$file.'</option>';
                        }
                    }

                    closedir($dir);
                 ?>
            </select>
                <p>
                    <label for="legend_page">Nom de la page :</label>
                    <input type="text" id="legend_page" name="legend_page"/>
                </p>
                <p>
                    <label for="description_page">Description de la page :</label>
                    <textarea id="description_page" name="description_page"></textarea>
                </p>
                <fieldset>
                    <legend>Création d'une question</legend>
                    <p>
                        <label for="type_line">Type de la ligne :</label>
                        <select name="type_line">
                            <option>QUESTION</option>
                            <option>NEXT_PAGE_BTN</option>
                            <option>FINISH_BTN</option>
                        </select>
                    </p>

                    <p>
                        <label for="text_line">Question :</label>
                        <input type="text" id="text_line" name="text_line"/>
                    </p>

                    <div id="saisies">
                    </div>

                    <Input Type="Button" Value="Ajouter une réponse" OnClick="Ajouter()">


                </fieldset>
                <p>
                    <input type="submit" name="action" value="Ajouter une autre question" />
                    <input type="submit" name="action" value="Ajouter une autre page" />
                    <input type="button" value="Finir le questionnaire" onclick="location.href='index.php';"/>
                </p>
        </form>
        <script type="text/javascript">
            var nlignes = 1;
            function Ajouter(){
                nlignes++;
                saisies.insertAdjacentHTML('BeforeEnd','<p><label for="type_input">Type de réponse :</label><select name="type_input_'+nlignes+'"><option> </option><option>text</option><option>textarea</option><option>radio</option><option>checkbox</option></select></p><p><label for="name_input_'+nlignes+'">Nom de la réponse :</label><input type=text name="name_input_'+nlignes+'" id="name_input_'+nlignes+'"/></p><p><label for="value_input_'+nlignes+'">Valeur de la réponse :</label><input type=text name="value_input_'+nlignes+'" id="value_input_'+nlignes+'"/></p>');
            };
        </script>
J'enregistre :

Code : Tout sélectionner

$dom = new DOMDocument(); $load = $_POST['choixquestionnaire']; $load = str_replace(' ', '_', $load); $dom->preserveWhiteSpace = false; $dom->load('C:/xampp/htdocs/XML/questionnaires/'.$load.'.xml'); $racine = $dom->getElementsByTagName('QuestionnaireConfiguration'); foreach ($racine as $racine) { echo $racine->nodeValue; } /*********AJOUT DE LA PAGE*****************/ $page = $dom->createElement('Page'); $legendPage = $dom->createAttribute('legend'); $legendPage->value = $_POST['legend_page']; $page->appendChild($legendPage); $descriptionPage = $dom->createAttribute('description'); $descriptionPage->value = $_POST['description_page']; $page->appendChild($descriptionPage); $racine->appendChild($page); /**************************/ /********AJOUT LINE****************/ $line = $dom->createElement('Line'); $typeLine = $dom->createAttribute('type'); $typeLine->value = $_POST['type_line']; $line->appendChild($typeLine); if (!empty($_POST['text_line'])){ $textLine = $dom->createAttribute('text'); $textLine->value = $_POST['text_line']; $line->appendChild($textLine); } $page->appendChild($line); /**********************************/ /********AJOUT INPUT****************/ for($i=1; $i<100; $i++){ if (!empty($_POST['type_input_'.$i]) && !empty($_POST['name_input_'.$i]) && !empty($_POST['value_input_'.$i])){ $input = $dom->createElement('input'); $typeInput = $dom->createAttribute('type'); $typeInput->value = $_POST['type_input_'.$i]; $input->appendChild($typeInput); $nameInput = $dom->createAttribute('name'); $nameInput->value = $_POST['name_input_'.$i]; $input->appendChild($nameInput); $valueInput = $dom->createAttribute('value'); $valueInput->value = $_POST['value_input_'.$i]; $input->appendChild($valueInput); $line->appendChild($input); } } /***********************************/ $dom->formatOutput = true; $dom->normalizeDocument(); $dom->save('C:/xampp/htdocs/XML/questionnaires/'.$load.'.xml');

Etape 3 :
Je veux rajouter un noeud dans un noeud "Page"
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <title>Questionnaire</title>
        <link rel="stylesheet" media="all" href="includes/styles.css" />
        <!--[if lt IE 9]>
        <script src="includes/html5ie.js"></script>
        <![endif]-->
        <style>

        </style>
    </head>
    <body>
        <form method="POST" action="ajoutquestion.php">
            <p>
                <label for="choixquestionnaire">Choix du questionnaire où ajouter la page :</label>
                <select id="choixquestionnaire" name="choixquestionnaire">
                    <?php
                        $dirname = 'C:/xampp/htdocs/XML/questionnaires/';
                        $dir = opendir($dirname); 

                        while($file = readdir($dir)) {
                            if($file != '.' && $file != '..' && !is_dir($dirname.$file))
                            {   
                                $file = str_replace('.xml', '', $file);
                                $file = str_replace('_', ' ', $file);
                                echo '<option>'.$file.'</option>';
                            }
                        }

                        closedir($dir);
                     ?>
                </select>
            </p>

            <p>
                <label for="choixpage">Choix de la page :</label>
                <select id="choixpage" name="choixpage">
                    <?php
                        $dom = new DOMDocument();
                        $dom -> load('C:/xampp/htdocs/XML/questionnaires/test.xml');

                        $searchNode = $dom->getElementsByTagName( "Page" ); 

                        foreach( $searchNode as $searchNode )
                        { 
                            $legendPage = $searchNode->getAttribute('legend');
                            echo '<option>'.$legendPage.'</option>';
                        }
                     ?>
                </select>
            </p>

                <fieldset>
                    <legend>Création d'une question</legend>
                    <p>
                        <label for="type_line">Type de la ligne :</label>
                        <select name="type_line">
                            <option>QUESTION</option>
                            <option>NEXT_PAGE_BTN</option>
                            <option>FINISH_BTN</option>
                        </select>
                    </p>

                    <p>
                        <label for="text_line">Question :</label>
                        <input type="text" id="text_line" name="text_line"/>
                    </p>

                    <div id="saisies">
                    </div>

                    <Input Type="Button" Value="Ajouter une réponse" OnClick="Ajouter()">


                </fieldset>
                <p>
                    <input type="submit" name="action" value="Ajouter une autre question" />
                    <input type="submit" name="action" value="Ajouter une autre page" />
                    <input type="submit" name="action" value="Finir le questionnaire" />
                </p>
        </form>
        <script type="text/javascript">
            var nlignes = 1;
            function Ajouter(){
                nlignes++;
                saisies.insertAdjacentHTML('BeforeEnd','<p><label for="type_input">Type de réponse :</label><select name="type_input_'+nlignes+'"><option> </option><option>text</option><option>textarea</option><option>radio</option><option>checkbox</option></select></p><p><label for="name_input_'+nlignes+'">Nom de la réponse :</label><input type=text name="name_input_'+nlignes+'" id="name_input_'+nlignes+'"/></p><p><label for="value_input_'+nlignes+'">Valeur de la réponse :</label><input type=text name="value_input_'+nlignes+'" id="value_input_'+nlignes+'"/></p>');
            };
        </script>
Ici j'ai mit que c'était dans le fichier test.xml, mais il faudrait donc que ça change en fonction de celui qu'on à choisit dans le select au dessus.
Et ensuite je doit enregistrer cet élément dans le bon nœud, ca aussi je ne sais pas comment dire "tu enregistre dans le nœud qui à l'attribut X"

Pour le moment j'ai ça pour l'enregistrement :

Code : Tout sélectionner

<?php $dom = new DOMDocument(); $load = $_POST['choixquestionnaire']; $load = str_replace(' ', '_', $load); $dom->preserveWhiteSpace = false; $dom->load('C:/xampp/htdocs/XML/questionnaires/'.$load.'.xml'); $racine = $dom->getElementsByTagName('QuestionnaireConfiguration'); foreach ($racine as $racine) { echo $racine->nodeValue; } /********AJOUT LINE****************/ $page = ??? $line = $dom->createElement('Line'); $typeLine = $dom->createAttribute('type'); $typeLine->value = $_POST['type_line']; $line->appendChild($typeLine); if (!empty($_POST['text_line'])){ $textLine = $dom->createAttribute('text'); $textLine->value = $_POST['text_line']; $line->appendChild($textLine); } $page->appendChild($line); /**********************************/ /********AJOUT INPUT****************/ for($i=1; $i<100; $i++){ if (!empty($_POST['type_input_'.$i]) && !empty($_POST['name_input_'.$i]) && !empty($_POST['value_input_'.$i])){ $input = $dom->createElement('input'); $typeInput = $dom->createAttribute('type'); $typeInput->value = $_POST['type_input_'.$i]; $input->appendChild($typeInput); $nameInput = $dom->createAttribute('name'); $nameInput->value = $_POST['name_input_'.$i]; $input->appendChild($nameInput); $valueInput = $dom->createAttribute('value'); $valueInput->value = $_POST['value_input_'.$i]; $input->appendChild($valueInput); $line->appendChild($input); } } /***********************************/ $dom->formatOutput = true; $dom->normalizeDocument(); $dom->save('C:/xampp/htdocs/XML/questionnaires/'.$load.'.xml'); ?>

Voilà j'espere vous avoir donner assez d'informations pour que vous puissiez m'aider :)




EDIT :
Bon j'ai essayer enregistrer dans le noeud Page en retrouve l'attribut avec xpath

Code : Tout sélectionner

/********AJOUT LINE****************/ $pageAttribute = $_POST['choixpage']; $xpath = new DomXPath($dom); $parent = $xpath->query("//Page[@legend=$pageAttribute]"); $line = $dom->createElement('Line'); $typeLine = $dom->createAttribute('type'); $typeLine->value = $_POST['type_line']; $line->appendChild($typeLine); if (!empty($_POST['text_line'])){ $textLine = $dom->createAttribute('text'); $textLine->value = $_POST['text_line']; $line->appendChild($textLine); } $parent->item(0)->appendChild($line); /**********************************/
Et j'ai une bonne grosse erreur :

Fatal error: Call to a member function appendChild() on a non-object in


J'avance, j'avance, mais j'avoue que je commence à craquer lol