Modifier XML avec PHP

Fermé
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 - 14 avril 2011 à 13:16
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 - 15 avril 2011 à 14:36
Bonjour,

Je suis actuellement en stage, et j'ai pour mission d'améliorer leur site web.
Il on quelques images à afficher j'ai donc mit un slideshow/diaporama. Celui ci fonctionne avec un fichier XML. Pour rendre plus simple l'ajout de photos, j'ai mit un formulaire d'upload en php. J'aimerai que ce formulaire, a chaque fois qu'on upload une photo, qu'il ajoute les ligne nécessaire dans le XML pour que le slideshow prenne en compte la nouvelle photo fraîchement uploader.

Voici le XML:

<?xml version="1.0" encoding="UTF-8"?>
<gallery>
<folder path="Gallery_images" category="General Category" >
<folder path="Gallery_images/img1" category="Category 1" >
<image thumbnail="thumb_image1.jpg" large_image="image1.jpg" date="01.05.2009" link="http://webstunning.com" target="" caption="Image 1 caption" transition="random">
<description><![CDATA[<P ALIGN='CENTER'><FONT FACE='_sans' SIZE='12' COLOR='#FF0000'>Test HTML format</FONT></P>]]></description>
</image>
</folder>
</folder>
</gallery>

J'ai chercher sur le net, ça parle du DOM, mais je ne sais pas coder en PHP, et tout ce que j'ai pu essayer, me retournai des erreurs, donc si une âme charitable pourrai me donner un coup de mains... J'ai jusqu'à demain soir pour finir.
A voir également:

4 réponses

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
14 avril 2011 à 14:41
Bonjour,

Le moyen le plus simple: gérer les références de photos en base de données, puis générer le XML entièrement après chaque validation de photo.

En PHP5, il a la classe simpleXml, assez facile à utiliser, exemple:


    function genereFichierXmlAiresDuPays($codePays) {
        $sql = "...ici la requête qui récupère mes données....";
        $listeAires = $this->fetch($sql);

        $airesXml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><aires pays="' . $codePays . '"></aires>');

        $codeProvince = 'XXX';
        $nomVille = 'XXX';
        foreach ($listeAires AS $key => $row) {
            // on crée le noeud province à chaque changement de province
            if ($codeProvince != $row['province']) {
                $codeProvince = $row['province'];
                $province = $airesXml->addChild('province');
                if (!empty($row['province'])) {
                    // on récupère le nom de la province à partir de son code
                    $resultat = $this->getProvince($codePays, $codeProvince);
                    $province->addAttribute('nom', $resultat[0]['nom_province']);
                    $province->addAttribute('code', $codeProvince);
                } else {
                    $province->addAttribute('nom', $codePays);
                }
            }
            // on crée le noeud ville à chaque changement de ville, ce dans le noeud province
            if ($nomVille != $row['ville']) {
                $nomVille = $row['ville'];
                $ville = $province->addChild('ville');
                $ville->addAttribute('nom', $row['ville']);
                if (!empty($row['ville_vo'])) {
                    $ville->addAttribute('ville_vo', $row['ville_vo']);
                }
            }
            $aire = $ville->addChild('aire');
            $aire->addAttribute('num_fiche', $row['num_fiche']);
            $aire->addAttribute('type_aire', $row['type_aire']);
            $aire->addChild('adresse', str_replace('&', '&amp;', $row['adresse']));
            $aire->addChild('longitude', $row['longitude']);
            $aire->addChild('latitude', $row['latitude']);
            if ($row['photo'] == 'O') {
                $aire->addChild('photo', $row['photo']);
            }
            if (!empty($row['elevation'])) {
                $aire->addChild('elevation', $row['elevation']);
            }
            if (!empty($row['commentaire'])) {
                $aire->addChild('commentaire','OK');
            }
            if (!empty($row['parametres'])) {
                $aire->addChild('parametres');
                $parametres = simplexml_load_string(str_replace("&","&amp;",$row['parametres']));
                foreach ($parametres AS $val) {
                    // echo $val->getName(); die;
                    $aire->parametres->addChild($val->getName(), $val);
                }
            }
        }
        return $airesXml;
    }


Avec ça, je construit un XML de ce genre:

<?xml version="1.0" encoding="UTF-8"?>
<aires pays="LT">
  <province nom="LT">
    <ville nom="KAUNAS">
      <aire num_fiche="100012" type_aire="Camping">
      <adresse>CP Jonavos g. 51A</adresse>
      <longitude>23.91778</longitude>
      <latitude>54.93424</latitude>
      <elevation>27</elevation>
      <parametres>
        <telephoneFixe>+370 618 09407</telephoneFixe>
        <nuiteePossible>oui</nuiteePossible>
      </parametres>
    </aire>
  </ville>
</aire>
</ville>
</province>
</aires>


A+
0
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 302
14 avril 2011 à 14:42
J'ai réussi à écrire, mais il m'efface tout plutôt que d'écrire a la suite.

<?php
//ouverture du XML
$f='............................/image_list.xml';
//lecture du XML
$contents = file_get_contents("$f");
//texte ajouter
$text = "Mon texte a ajouter";
//droits E/L
$handle = fopen($f,"w+");
//ecriture du XML
if (is_writable($f)) {

if (fwrite($handle, $text) === FALSE) {
echo 'Impossible d\'écrire dans le fichier '.$f.'';
exit;
}

echo 'Ecriture terminé';

fclose($handle);

}
else {
echo 'Impossible d\'écrire dans le fichier '.$f.'';
}
?>
0
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
14 avril 2011 à 17:22
je vous ai dit de regarder du cote de la classe simpleXml.

On charge une structure xml comme suit:

$xml = simple_xml_loadfile(....mon fichier xml à charger....);

....ici le bout de code qui va bien pour rajouter une structure.... -> voir les fonctions addChild et addAttribute

ensuite, on réécrit dans le fichier:

$xml->asXml('....mon fichier à qsauvegarder....');

je vous donne une piste, ensuite prenez un peu de temps pour lire la doc en ligne. Goggle et chercher:

php simpleXml

Il y a beaucoup d'exemples.

Votre problème est réglé en 2 heures chrono.

A+
0
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 302
14 avril 2011 à 18:09
Déjà merci d'avoir répondu et désolé, je n'avais pas vu votre premier post. Du coup j'ai réussi à faire ce que je voulais, a quelque choses près.

Voici tout mon code:

<?php
//----------------------------
// DEFINITION DES VARIABLES
//----------------------------

$target = 'Gallery_images/bus/Gallery_images/'; // Repertoire cible
$f='Gallery_images/bus/Gallery_files/image_list.xml'; // Fichier XML
$files = $_FILES['fichier']['name'];
//----------------------
// SCRIPT D'UPLOAD
//----------------------
?>
<html>
<head>
<title>Bus - Upload</title>
</head>
<body>
<?php
if(!empty($_POST['posted'])) {
// On vérifie si le champ est rempli




if(move_uploaded_file($_FILES['fichier']['tmp_name'],$target.$_FILES['fichier']['name'])) {
$contents = file_get_contents("$f");
$text = "<image thumbnail="$_FILES['fichier']['name']" large_image="$_FILES['fichier']['name']" caption="Image 1 caption" transition="random"></image>";
$handle = fopen($f,"a+");
if (is_writable($f)) {
if (fwrite($handle, $text) === FALSE) {
echo 'Impossible d\'écrire dans le fichier '.$f.'';
exit;
}

echo '<b>XML Mis a jour avec succes !</b>';
echo '<hr />';

fclose($handle);

}
else {
echo 'Impossible d\'écrire dans le fichier '.$f.'';
}
// Si upload OK alors on affiche le message de réussite
echo '<b>Fichier uploader avec succes !</b>';
echo '<hr />';
echo '<b>Fichier uploader :</b> ', $_FILES['fichier']['name'], '<br />';
echo '<hr />';
echo '<br /><br />';



} else {
// Sinon on affiche une erreur pour le champ vide
echo '<b>Le champ du formulaire est vide !</b><br /><br />';
}
}
?> <form enctype="multipart/form-data" action="<?php echo $PHP_SELF; ?>" method="POST">
<b>Envoyer le fichier :</b><br /><br />
<input type="hidden" name="posted" value="1" />
<input name="fichier" type="file" />
<input type="submit" value="Uploader" />
</form>
</body>
</html>


Le formulaire d'upload est couplé avec le code qui modifie le XML. Avec ce code, je reçois ce message:

Parse error: syntax error, unexpected T_VARIABLE in /homez.41/publibus/www/admin_upload/upload_bus.php on line 27

J'ai modif un peux, avant il éditait bien mon XML, mais écrivais "$files" plustôt que le nom de l'image uploadé. L'entriprise ou je suis en stage ne savent pas si il on une BDD, donc pour votre méthode ça va être difficile.
0
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 302
14 avril 2011 à 18:10
Ps: il y a surement plein de choses à optimiser, des erreurs... Je ne sais pas codé en php, donc j'ai pris quelque bouts de code du net, codé quelques lignes, ce qui a donné ça.
0
dj-postka Messages postés 2305 Date d'inscription dimanche 11 mai 2008 Statut Membre Dernière intervention 11 février 2019 302
15 avril 2011 à 14:36
Bon je vais essayer votre solution, j'ai eu plus de temps pour réaliser tout ça. Le pb, c'est que je n'ai pas de BDD, faut que j'en trouve une.
0