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

[Résolu/Fermé]
Signaler
Messages postés
39
Date d'inscription
jeudi 3 septembre 2015
Statut
Membre
Dernière intervention
25 avril 2018
-
Messages postés
39
Date d'inscription
jeudi 3 septembre 2015
Statut
Membre
Dernière intervention
25 avril 2018
-
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 dont voici le code html complet :

<!-- début calendrier --> 
   
<script src="css/jquery-3.1.1.min.js"></script>
<script>
$(document).ready(function(){
    $("#inci23").click(function(){
        $("#incid23").slideToggle("slow");
    });
});
</script>
 
<style>
#incid23, #inci23 {
    padding: 2px;
    text-align: center;
}
 
#incid23 {
    padding: 2px;
   display: none;
}
</style>
<div id="inci23">
<button id="calendrier" onclick="calendrier">Calendrier</button><br>
</div>
<div id="incid23" style="display: none;">
 
<?php
function object_to_array($object) {
       $_array = (is_object($object)) ? get_object_vars($object) : $object;
       foreach ($_array as $clef => $valeur) {
               $valeur = (is_array($valeur) OR is_object($valeur)) ? object_to_array($valeur) : $valeur;
               $array[$clef] = $valeur;
       }
       return $array;
}
 
function array_to_agenda($time, $jours) {
        global $xml, $xml_date;
        if (empty($time)) return '> </td>';
        $num_array = explode(' ',$xml_date[$time]);
        if (!is_numeric($num_array[0])) return ">$jours</td>";
        $return = ' style="background-color:rgb(171, 183, 201);" onmouseover="javascript:this.childNodes[1].style.visibility = \'visible\';" onmouseout="javascript:this.childNodes[1].style.visibility = \'hidden\';">'. $jours .'<div class="Agenda_event">';
        foreach ($num_array as $value) {
                $return = $return . '<h1>'. date('H:i', $xml[$value]['date']) .'</h1><p>'. $xml[$value]['contenu'] .'</p>';
        }
        return $return . '</div></td>';
}
 
$xml = (file_exists('./Calendrier/ZAgenda.xml')) ? simplexml_load_file('./Calendrier/ZAgenda.xml') : simplexml_load_string("<?xml version='1.0' standalone='yes'?>\n<Agenda>\n</Agenda>");
$xml = object_to_array($xml);
$xml = (isset($xml['Evennement'][0])) ? $xml['Evennement'] : array($xml['Evennement']);
$xml_date = NULL;
 
foreach($xml as $key => $value) {
        $date = $value['date'];
        $mktime = mktime(0, 0, 0, date('n', $date), date('j', $date), date('Y', $date));
 
        $xml_date[$mktime] = trim($xml_date[$mktime] .' '. $key) ;
}
 
?>
 
<style>
body {color:#555; font-family:'Trebuchet MS',serif; }
.Agenda_table { padding:10px; border-collapse:separate; text-align:center; color:#555; border:1px solid #999; background-color:rgb(221, 233, 251); }
.Agenda_table thead { font-weight:bold; }
.Agenda_table thead th a { color:#707680; text-decoration:none; }
.Agenda_table td, .Agenda_table th { margin:0; padding:0; height:30px; width:30px; background-color:rgb(230, 236, 245); border:1px solid #DDD; }
.Agenda_table .Agenda_mois { width:auto; }
.Agenda_table .Agenda_Aujourdh_ui { font-weight:bold; }
.Agenda_event { font-weight:normal; visibility:hidden; position:absolute; border:1px solid #999; background-color:rgb(243, 246, 250); padding:2px;  width:200px; font-size:0.9em; }
.Agenda_event h1 { font-size:1.1em; padding:2px; margin:0; background:rgb(171, 183, 201); }
.Agenda_event p { padding:0; margin:0; margin-top:2px; margin-bottom:2px; }
</style>
 
 
 
<?php
 
$time = (empty($_GET['ZA_Mois']) OR empty($_GET['ZA_Annee']) OR $_GET['ZA_Mois'] > 12 OR $_GET['ZA_Mois'] < 1 ) ? time() : mktime(1, 1, 1, $_GET['ZA_Mois'], date('j'), $_GET['ZA_Annee']);
$Nb_Jours = date('t', $time);
$Jours_Actuelle = date('j', $time);
$Mois_Acctuelle = date('n', $time);
$Annee_Actuelle = date('Y', $time);
$Mois_Lettre = array(1 => 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
$Mois_Actuelle_Lettre = $Mois_Lettre[$Mois_Acctuelle];
$Time_Premier_Du_Mois = mktime(1, 1, 1, $Mois_Acctuelle, 1, $Annee_Actuelle);
$Time_Dernier_Du_Mois = mktime(1, 1, 1, $Mois_Acctuelle, $Nb_Jours, $Annee_Actuelle);
$Premier_Jours = date('N', $Time_Premier_Du_Mois);
//$Nb_Semaines = 1 + (int)(date('W', $Time_Dernier_Du_Mois)) - (int)(date('W', $Time_Premier_Du_Mois));
$Nb_Semaines = ceil((($Nb_Jours - (8 - $Premier_Jours)) / 7)) + 1;
$Time_Mois_Avant = $Time_Premier_Du_Mois - 100000;
$Time_Mois_Apres = $Time_Dernier_Du_Mois + 100000;
 
 
?>
<center>
<table cellspacing="2" class="Agenda_table" >
        <thead>
                <tr><th colspan="7" class="Agenda_mois"><a href="?<?php echo 'ZA_Mois='. date('n', $Time_Mois_Avant) .'&ZA_Annee='. date('y', $Time_Mois_Avant); ?>"><-</a> <?php echo $Mois_Actuelle_Lettre .' '. $Annee_Actuelle; ?> <a href="?<?php echo 'ZA_Mois='. date('n', $Time_Mois_Apres) .'&ZA_Annee='. date('y', $Time_Mois_Apres); ?>">-></a></th></tr>
                <tr><th>Lu</th>
                        <th>Ma</th>
                        <th>Me</th>
                        <th>Je</th>
                        <th>Ve</th>
                        <th>Sa</th>
                        <th>Di</th>
                </tr>
        </thead>
        <tbody>
</center>
<?php
 
 
$Jours = 2 - $Premier_Jours;
$Semaine = 1;
 
while ($Semaine <= $Nb_Semaines) {
        echo "\t\t<tr>\n";
        while ((($Jours + $Premier_Jours - 1) / $Semaine)  <= 7) {
                echo "\t\t\t<td";
                echo ($Mois_Acctuelle == date('n') AND $Annee_Actuelle == date('Y') AND $Jours == $Jours_Actuelle) ? ' class="Agenda_Aujourdh_ui"' : '';
                $ar2ag_jours = ($Jours >= 1 AND $Jours <= $Nb_Jours ) ? $Jours : ' ';
                $ar2ag_time = ($ar2ag_jours == ' ') ? NULL : mktime(0,0,0,$Mois_Acctuelle,$ar2ag_jours,$Annee_Actuelle);
                echo array_to_agenda($ar2ag_time, $ar2ag_jours);
 
                echo "\n";
                $Jours++;
        }
        echo "\t\t</tr>\n";
        $Semaine++;
}
 
?>
        </tbody>
</table>
 
 
 
<!-- debut formulaire pour calendrier -->
 
<form action="./Calendrier/cible.php" method="post">
Date de l'evenement :
<br>
    <input name="datetime" type="datetime-local" value="2018-03-01T12:00">
     
<br>
Texte de l'evenement :
<br>
    <input type="text" name="texteevt" required />
<br>
    <input type="submit" value="Valider" />
 
</form>
 
</div>
<!-- fin formulaire pour calendrier -->


le formulaire ci dessus envoi à une la page cible.php les événements saisie pour être ajoutés dans un fichier.xml "ZAgenda.xml" qui contient l'ensemble des événements du calendrier, l'ajout se fait parfaitement à la fin du fichier.

Voici un exemple d’événement :
<Evennement><date>1519902000</date><contenu>erdgvfdgdfgfd</contenu></Evennement><!-- creation 01-03-2018 12:00:00-->


Le problème est que pour rendre fonctionnel l'ajout de plusieurs evenement et les afficher sur le calendrier il faut absolument fermer la balise </agenda> qui se trouve à la fin de mon fichier xml, le probleme est que si elle est deja présente et que je la re-referme, l'affichage des evenements ne se fait plus

Voila l'exemple KO :

<agenda>
<Evennement><date>1519902000</date><contenu>cec4b</contenu></Evennement><!-- creation 22-03-2018 17:30:33-->
<Evennement><date>1522490400</date><contenu>test</contenu></Evennement><!-- creation 31-03-2018 19:27:32-->
</agenda>
<Evennement><date>1522490400</date><contenu>test</contenu></Evennement><!-- creation 31-03-2018 19:47:32-->
<strong></agenda></strong>


Voici mon code php complet qui écrit les événements à la fin de mon fichier xml :
<?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
    fseek($handle, -11, SEEK_END );
    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.";
}
?>


Voila comment est actuellement le fichier.xml complet :
<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-->



La meilleurs idée que j'ai trouvé serait d'appliquer un fseek() et SEEK_END en ayant au préalable mis une balise "</agenda>" en fin de fichier et de placer donc mes nouveaux événements avant la balise </agenda> afin de permettre de conserver le </agenda> à la fin du fichier ... mais je ne sais pas comment m'y prendre

Si vous avez d'autres idées je suis preneur (mais je ne suis pas très calé en php)
Peut être est-il possible de faire "plus simple", comme contrôler si le fichier xml possede une balise </agenda> si oui on la supprime et ont ajoute l'evenement, si non alors ont en place une en bas du fichier ?

1 réponse

Messages postés
33723
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2021
3 770
Bonjour,

J'en reviens à ma réponse précédente (de ton doublon de question.....A l'avenir... evite !! )

Bref... au lieu de faire de l'écriture de fichier comme tu le fais.....
Il faut :
- Récupérer le contenu de ton xml dans un array
- Manipuler ton array pour en faire ce que tu veux
- recreer le fichier XML à partir de l'array

Je pense que les fonctions suivantes devraient t'y aider :
//function convert xml File to Array
function xml_to_array($xmlFilePath){
  $xmlfile = file_get_contents($xmlFilePath);
  $ob= simplexml_load_string($xmlfile);
  $json  = json_encode($ob);
  return json_decode($json, true);
}


/**
* Create XML File from Array DATAS
*/
function createXmlFromArrayDatas($xmlFilePath,$data = array()){
 
 // creating object of SimpleXMLElement
 $xml_data = new SimpleXMLElement('<?xml version="1.0"?><agenda></agenda>');

 // function call to convert array to xml
 array_to_xml($data,$xml_data);

 //saving generated xml file; 
 $result = $xml_data->asXML($xmlFilePath);
}

// function defination to convert array to xml
function array_to_xml( $data, &$xml_data ) {
    foreach( $data as $key => $value ) {
        if( is_numeric($key) ){
            $key = 'item'.$key; //dealing with <0/>..<n/> issues
        }
        if( is_array($value) ) {
            $subnode = $xml_data->addChild($key);
            array_to_xml($value, $subnode);
        } else {
            $xml_data->addChild("$key",htmlspecialchars("$value"));
        }
     }
}



Cordialement, 
Jordane                                                                 
Messages postés
39
Date d'inscription
jeudi 3 septembre 2015
Statut
Membre
Dernière intervention
25 avril 2018
7
Bonjour, merci j'ai donc modifié mon fichier php en intégrant le code que tu as fait, désolé mais c'est vraiment le dernier point pour terminer mon projet c'est ce pourquoi j'insiste un peut =) :

Le voici en complet mon code php qui génère mon événement :

<?php 
//function convert xml File to Array
function xml_to_array($xmlFilePath){
  $xmlfile = file_get_contents($xmlFilePath);
  $ob= simplexml_load_string($xmlfile);
  $json  = json_encode($ob);
  return json_decode($json, true);
}


/**
* Create XML File from Array DATAS
*/

 // <!-- 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
	fseek($handle, -11, SEEK_END );
    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.";
}


function createXmlFromArrayDatas($xmlFilePath,$data = array()){
 
 // creating object of SimpleXMLElement
 $xml_data = new SimpleXMLElement('<?xml version="1.0"?><agenda></agenda>');

 // function call to convert array to xml
 array_to_xml($data,$xml_data);

 //saving generated xml file; 
 $result = $xml_data->asXML($xmlFilePath);
}

// function defination to convert array to xml
function array_to_xml( $data, &$xml_data ) {
    foreach( $data as $key => $value ) {
        if( is_numeric($key) ){
            $key = 'item'.$key; //dealing with <0/>..<n/> issues
        }
        if( is_array($value) ) {
            $subnode = $xml_data->addChild($key);
            array_to_xml($value, $subnode);
        } else {
            $xml_data->addChild("$key",htmlspecialchars("$value"));
        }
     }
}
?>



Voila le fichier XML, l’événement vient toujours s’écrire après la balise </agenda> :
<agenda>
<Evennement><date>1524132000</date><contenu>fffffff</contenu></Evennement><!-- creation 19-04-2018 14:30:49-->
</agenda>
<Evennement><date>1524132000</date><contenu>fffffff222222222</contenu></Evennement><!-- creation 19-04-2018 14:32:14-->
Messages postés
33723
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2021
3 770
Tu as collé bêtement le code que je t'ai donné... sans chercher à comprendre ce qu'il fait ni comment il fonctionne....
Pour preuve... le code que je t'ai donné... ce sont des FONCTIONS; .... il faut les appeler pour s'en servir !
Toi tu les a juste mis à la suite de ton code....
Fais un effort...
Messages postés
39
Date d'inscription
jeudi 3 septembre 2015
Statut
Membre
Dernière intervention
25 avril 2018
7
Oui et j'en suis désolé, comme je le dit dans mon message je ne suis pas du tout compétent en PHP, je viens donc chercher une aide au seul endroit que je puisse demander j'ai essayé de comprendre mais de 0 difficile de comprendre ce code ...

Je sais que je prend de ton temps et que tu as l'impression que je ne veux pas trouver tout seul mais il n'en est rien j'ai passé énormément de temps a tenter de trouver une solution a ce problème ....
Messages postés
39
Date d'inscription
jeudi 3 septembre 2015
Statut
Membre
Dernière intervention
25 avril 2018
7
Voila j'ai réussi en faisant ça si ça sert a quelqu'un =)


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