Ajout d'une balise à la fin dun fichier xml en php

Résolu/Fermé
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 - 6 mars 2018 à 23:59
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 - 18 avril 2018 à 14:36
Bonjour à tous,

Alors voila j'ai quasiment terminé un petit projet de calendrier avec ajout d’événements mais je bloque sur un point.

Voila comment fonctionne mon projet :
Un formulaire envoi à une page cible.php les événements qui sont travaillés pour être ajoutés dans un fichier.xml qui contient donc l'ensemble des événements du calendrier, l'ajout se fait parfaitement mais à la fin du fichier.
Le problème est que pour rendre fonctionnel le calendrier j'ai besoin de fermer la balise </agenda> qui se trouve à la fin de mon fichier xml

Voici mon code php qui écrit les événements à la fin de mon fichier xml (voir ligne 21) :
<?php 

$datedelevenemententimestamp=$_POST['datetime'];
$datecreationevenement = date('d-m-Y H:i:s') . "\n"; //création de la variable de date de création de l'evenemennt
$datedelevenemententimestamp2 = strtotime($datedelevenemententimestamp); //création de la variable de date de l'evenemennt en timestamp
$datedelevenementenformatdate = date("d-m-Y H:i:s",strtotime($datedelevenemententimestamp)); //création de la variable de date de l'evenemennt en date normale
$textevenement = $_POST['texteevt'];

echo '<br>';

 // <!-- debut mise a jout du fichier evenement --> //
 
 
$filename = 'ZAgenda.xml';
$somecontent = '<Evennement><date>'."".$datedelevenemententimestamp2."".'</date><contenu>'."".$textevenement."".'</contenu></Evennement><!-- creation '."".$datedelevenementenformatdate."".'-->
'."";

// Assurons nous que le fichier est accessible en écriture
if (is_writable($filename)) {

  // Dans notre exemple, nous ouvrons le fichier $filename en mode d'ajout
    // Le pointeur de fichier est placé à la fin du fichier
    // c'est là que $somecontent sera placé
    if (!$handle = fopen($filename, 'a')) {
         echo "Impossible d'ouvrir le fichier ($filename)";
         exit;
    }

    // Ecrivons quelque chose dans notre fichier.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Impossible d'écrire dans le fichier ($filename)";
        exit;
    }

    echo "L'écriture de ($somecontent) dans le fichier ($filename) a réussi";

    fclose($handle);

} else {
    echo "Le fichier $filename n'est pas accessible en écriture.";
}
?>


J'ai essayé plusieurs choses mais en particulier :
La fonction fseek() et SEEK_END qui me semble la plus adaptée mais je n'arrive pas à l'adapter à mon besoin

Actuellement voila comment est construit le fichier.xml
<agenda>
<Evennement><date>1519902000</date><contenu>erdgvfdgdfgfd</contenu></Evennement><!-- creation 01-03-2018 12:00:00-->
<Evennement><date>1519902000</date><contenu>erdgvfdgdfgfd</contenu></Evennement><!-- creation 01-03-2018 12:00:00-->
<Evennement><date>1519902000</date><contenu>erdgvfdgdfgfd</contenu></Evennement><!-- creation 01-03-2018 12:00:00-->
</agenda>

Je voudrais donc placer mes nouveaux événements avant la balise </agenda> afin de permettre de conserver le </agenda> à la fin du fichier

Ou peut être est-il possible de faire plus simple, comme contrôler si le fichier xml possede une balise </agenda> si non alors ont en place une en bas du fichier ?
Je suis ouvert à tout avis pour avancer :D
A voir également:

1 réponse

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
7 mars 2018 à 09:25
Bonjour,

Je pense que le mieux serait :
- parser le XML existant et stocker dans un array
- Manipuler l'array pour y ajouter/supprimer/modifier les données
- Réécrire l'intégralité du xml.


1
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 8
7 mars 2018 à 10:20
Merci pour ta reponse
0
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 8
Modifié le 17 mars 2018 à 00:32
Bon je n'y arrive pas avec le peu de compétences que j'ai en php et ça malgré beaucoup de recherches sur plusieurs forums .... (depuis 18h je suis dessus ce soir)
Et serait s'il possible de m'aider ?

Voila ou j'en suis :
En premier : j'ajoute juste l’événement sans la balise de fermeture "</agenda>"
En deuxième j'ajoute la balise "</agenda>"
Entre ces deux actions je voudrais supprimer ou remplacer la dernière ligne du fichier XML qui est "</agenda>" par un blanc ... cela afin d’éviter que la balise "</agenda>" ne se répète à chaque ajout d’événements

mon code actuel :
<?php 
 // <!-- creation de l'evenement --> //
$datedelevenemententimestamp=$_POST['datetime'];
$datecreationevenement = date('d-m-Y H:i:s'); //création de la variable de date de création de l'evenemennt
$datedelevenemententimestamp2 = strtotime($datedelevenemententimestamp); //création de la variable de date de l'evenemennt en timestamp
$datedelevenementenformatdate = date("d-m-Y H:i:s",strtotime($datedelevenemententimestamp)); //création de la variable de date de l'evenemennt en date normale
$textevenement = $_POST['texteevt'];

echo '<br>';
echo '<br>';

$filename = 'ZAgenda.xml';
$somecontent = '<Evennement><date>'."".$datedelevenemententimestamp2."".'</date><contenu>'."".$textevenement."".'</contenu></Evennement><!-- creation '."".$datecreationevenement."".'-->
'."";

// fichier accessible en écriture ?
if (is_writable($filename)) {

    // Le pointeur de fichier est placé à la fin du fichier
    // c'est là que $somecontent sera placé
    if (!$handle = fopen($filename, 'a')) {
         echo "Impossible d'ouvrir le fichier ($filename)";
         exit;
    }


 
    // Ecriture du fichier
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Impossible d'écrire dans le fichier ($filename)";
        exit;
    }

    echo "L'evenement à bien été ajouté au calendrier";

    fclose($handle);

} else {
    echo "Le fichier $filename n'est pas accessible en écriture.";
}
?>


 
<!-- ici je voudrais soit : 
supprimer ou remplacer la derniere ligne de mon fichier XML (qui est la fermeture de la balise "</agenda>")
Soit dans l'ajout de mon evenement deplacer l'ajout une ligne avant la fin du fichier --> 
<!--



<?php // ici j'ajoute la fermeture de la balise agenda //
$file = 'ZAgenda.xml';
// Ouvre un fichier pour lire un contenu existant
$current = file_get_contents($file);
// Ajoute la fermeture de la balise
$current .= "</agenda>\n";
// Écrit le résultat dans le fichier
file_put_contents($file, $current);
?>



Le fichier XML :
<agenda>
<Evennement><date>1521972000</date><contenu> ccccccggggggggggc</contenu></Evennement><!-- creation 17-03-2018 00:17:35-->
</agenda>
0
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 8
22 mars 2018 à 18:46
Up ?
J'ai bien réfléchis je pense qu'ajouter un fseek pour écrire 9 caractères avant la fin de mon fichier XML serait parfait mais je n'y arrive pas, je pense que c'est la ou je le met à chaque fois que ce n'est pas bon (pas pris en compte, j'ai toujours l’événement à la fin de mon fichier)
fseek($handle, -9, SEEK_END ); 


Code complet :
<?php 
 // <!-- creation de l'evenement --> //
$datedelevenemententimestamp=$_POST['datetime'];
$datecreationevenement = date('d-m-Y H:i:s'); //création de la variable de date de création de l'evenemennt
$datedelevenemententimestamp2 = strtotime($datedelevenemententimestamp); //création de la variable de date de l'evenemennt en timestamp
$datedelevenementenformatdate = date("d-m-Y H:i:s",strtotime($datedelevenemententimestamp)); //création de la variable de date de l'evenemennt en date normale
$textevenement = $_POST['texteevt'];

echo '<br>';
echo '<br>';

$filename = 'ZAgenda.xml';
$somecontent = '<Evennement><date>'."".$datedelevenemententimestamp2."".'</date><contenu>'."".$textevenement."".'</contenu></Evennement><!-- creation '."".$datecreationevenement."".'-->
'."";

// fichier accessible en écriture ?
if (is_writable($filename)) {

    // Le pointeur de fichier est placé à la fin du fichier
    // c'est là que $somecontent sera placé
    if (!$handle = fopen($filename, 'a')) {
         echo "Impossible d'ouvrir le fichier ($filename)";
         exit;
    }


	
    // Ecriture du fichier
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Impossible d'écrire dans le fichier ($filename)";
        exit;
    }

    echo "L'evenement à bien été ajouté au calendrier";

    fclose($handle);

} else {
    echo "Le fichier $filename n'est pas accessible en écriture.";
}
?>
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
22 mars 2018 à 20:00
Relis ma reponse et Regarde donc ceci
https://www.php.net/manual/fr/simplexml.examples-basic.php
0
Coukies94 Messages postés 40 Date d'inscription jeudi 3 septembre 2015 Statut Membre Dernière intervention 25 avril 2018 8
23 mars 2018 à 16:19
Je l'ai lu en long en large ta réponse mais je ne parviens pas a appliquer dans mon cas les exemples, j'ai donc essayé d'autres pistes comme le fseek .... et bien d'autres c'est pour cela que j'essai de trouver de l'aide, je t'assure que si je savais trouver les informations même si ça me prendrais encore plus d'heures je le ferais ....
0