Parser un xml pour un plugin

flipflipflipflip Member
août 2011 modifié dans Entraide
Bonjour,

Pour plxcoinslider j'ai besoin de créer depuis le fichier admin.php du plugin différent fichier xml de configuration pour chaque slideshow. J'ai deux solutions, faire ma popote ou alors utiliser les fonctions natives de pluxml pour gérer les fichiers xml. Je pense que la deuxième solution est la mieux et surtout mieux intégré à pluxml.

On commence. J'ai créé un fichier class.admin.plxcoinslider.php qui est une class avec comme parent PlxMotor :
<?php
class AdminPlxCoinslider extends plxMotor {

    public $aSlideshow = array();

    public function __construct() {

        $this->getSlideshow(PLX_ROOT.$this->aSlideshow['slideshow_id']);
    }

    public function getSlideshow($filename) {

        if(!is_file($filename)) return;

        $data = implode('',file($filename));
        $parser = xml_parser_create(PLX_CHARSET);
        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
        xml_parse_into_struct($parser,$data,$values,$iTags);
        xml_parser_free($parser);
        if(isset($iTags['name'])) {
            $nb = sizeof($iTags['name']);
            $size = ceil(sizeof($iTags['name'])/$nb);
            # On boucle sur $nb
            for($i = 0; $i < $nb; $i++) {
                $attributes = $values[$iTags['number'][$i*$size]]['attributes'];
                $number = $attributes['number'];
                $this->aSlideshow[$number]['name'] = isset($iTags['name'][$i])?$values[$iTags['name'][$i]]['value']:'';
            }
        }
    }

    public function editSlideshow($slideshow) {
        if (empty($slideshow['name'])) {
            return plxMsg::Error('Nom du slideshow obligatoire');
        } else {
            $xml = "<?xml version=\"1.0\" encoding=\"".PLX_CHARSET."\"?>\n";
            $xml .= "<document>\n";
            $xml .= "\t<slideshow number=\"".$slideshow['slideshow_id']."\">\n";
            $xml .= "\t\t<name><![CDATA[".plxUtils::cdataCheck($slideshow['name'])."]]></name>\n";
            $xml .= "\t\t<width><![CDATA[".plxUtils::cdataCheck($slideshow['width'])."]]></width>\n";
            $xml .= "\t\t<height><![CDATA[".plxUtils::cdataCheck($slideshow['height'])."]]></height>\n";
            $xml .= "\t\t<spw><![CDATA[".plxUtils::cdataCheck($slideshow['spw'])."]]></spw>\n";
            $xml .= "\t\t<sph><![CDATA[".plxUtils::cdataCheck($slideshow['sph'])."]]></sph>\n";
            $xml .= "\t\t<delay><![CDATA[".plxUtils::cdataCheck($slideshow['delay'])."]]></delay>\n";
            $xml .= "\t\t<sdelay><![CDATA[".plxUtils::cdataCheck($slideshow['sdelay'])."]]></sdelay>\n";
            $xml .= "\t\t<opacity><![CDATA[".plxUtils::cdataCheck($slideshow['opacity'])."]]></opacity>\n";
            $xml .= "\t\t<effet><![CDATA[".plxUtils::cdataCheck($slideshow['effet'])."]]></effet>\n";
            $xml .= "\t\t<navigation><![CDATA[".plxUtils::cdataCheck($slideshow['navigation'])."]]></navigation>\n";
            $xml .= "\t\t<links><![CDATA[".plxUtils::cdataCheck($slideshow['links'])."]]></links>\n";
            $xml .= "\t\t<hoverPause><![CDATA[".plxUtils::cdataCheck($slideshow['hoverPause'])."]]></hoverPause>\n";
            $xml .= "\t</slideshow>\n";
            $xml .= "</document>";

            # On écrit le fichier
            $filename = $_SESSION['user'].'.'.$slideshow['slideshow_id'].'.'.$slideshow['name'].'.xml';
            if(plxUtils::write($xml, PLX_ROOT.'plugins/plxcoinslider/slideshow/'.$filename)) {
                return plxMsg::Info(L_SAVE_SUCCESSFUL);
            } else {
                return plxMsg::Error(L_SAVE_ERR.' '.PLX_ROOT.'plugins/plxcoinslider/slideshow/'.$filename);
            }
        }
    }
}
?>
Dans le fichier admin.php contient toute la gestion et formulaire :
<?php
if(!defined('PLX_ROOT')) exit;

require_once('class.plxcoinslider.admin.php');
$AdminCoinslider = new AdminPlxCoinslider();

if(!empty($_GET['slideshow'])) {
    $id = $_SESSION['user'].'.'.plxUtils::strCheck($_GET['slideshow']).'.xml';
    if(!isset($AdminCoinslider->aSlideshow[ $id ])) {
        plxMsg::Error('Pas de fichier');
        header('Location: plugin.php?p=plxcoinslider');
        exit;
    }
}

if($_POST['btn_settings']) {
    $AdminCoinslider->editSlideshow($_POST);
}

?>
<h2><?php echo $plxPlugin->getInfo('title') ?></h2>
<form action="plugin.php?p=plxcoinslider" method="post" id="form_slideshow">
<table class="table">
    <thead>
        <tr>
            <th class="checkbox"><input type="checkbox" onclick="checkAll(this.form, 'idSlideShow[]')" /></th>
            <th class="title"><?php echo L_CONFIG_USERS_ID ?></th>
            <th><?php echo $plxPlugin->getLang('L_SLIDESHOW_NAME') ?></th>
            <th><?php echo $plxPlugin->getLang('L_ACTION') ?></th>
        </tr>
    </thead>
    <tbody>
    <?php
    # Initialisation de l'ordre
    $num = 0;
    $dir = opendir(PLX_PLUGINS.'plxcoinslider/slideshow/');
    while($files = readdir($dir)) {
        if($files != '..' && $files != '.' && $files != '/') {
            $file = explode('.', $files);
            echo '<tr class="line-'.$file[0].'">';
            echo '<td><input type="checkbox" name="idSlideShow[]" value="'.$file[1].'" /><input type="hidden" name="idSlideShow[]" value="'.$file[1].'" /></td>';
            echo '<td>'.$file[0].'</td>';
            echo '<td>'.$file[2].'</td>';
            echo '<td><a href="plugin.php?p=plxcoinslider&slideshow='.$file[1].'" title="Editer">Editer</a></td>';
            echo '</tr>';
        }
    }
    ?>
    </tbody>
</table>
</form>
<?php if(!empty($_GET['slideshow'])) { ?>
<form action="plugin.php?p=plxcoinslider" method="post">
    <fieldset class="withlabel">
        <?php
            foreach($AdminCoinslider->aSlideshow as $k=>$v) {
                $ordre = ++$num;
                echo '<p>'.$plxPlugin->getLang('L_NAME').'</p>';
                plxUtils::printInput('name', plxUtils::strCheck($v['name']), 'text', '15-50');
            }
    ?>
</form>
<?php } ?>
L'écriture du fichier xml ne pose pas de problème mais c'est la lecture. Lorsque j'essaie de charger un fichier depuis admin.php j'ai le message suivant :
Pas de fichier
J'avoue être un peu larguer sur la partie
public $aSlideshow = array();

    public function __construct() {

        $this->getSlideshow(PLX_ROOT.$this->aSlideshow['slideshow_id']);
    }
J'ai fouillé un peu de partout dans pluxml sans en comprendre le sens :(
Si vous avez une idée ça serait sympa.

J'ai un string de l'array

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    1ere question: pourquoi faire une classe AdminPlxCoinslider dérivée de plxMotor (à éviter à mon avis)

    2: dans le fichier admin.php, affiche le contenu de la variable $id et vérifie son contenu. n'oublie pas d'indiquer le chemin complet pour accèder au répertoire où tu stockes tes fichiers xml.

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • flipflipflipflip Member
    août 2011 modifié
    1ere question: pourquoi faire une classe AdminPlxCoinslider dérivée de plxMotor (à éviter à mon avis)
    Je ne sais pas trop, j'ai essayé de reproduire le fonctionnement de la class plxAdmin.
    2: dans le fichier admin.php, affiche le contenu de la variable $id et vérifie son contenu. n'oublie pas d'indiquer le chemin complet pour accèder au répertoire où tu stockes tes fichiers xml.
    J'ai modifié $id
    $id = PLX_ROOT.'plugins/plxcoinslider/slideshow/'.$_SESSION['user'].'.'.plxUtils::strCheck($_GET['slideshow']).'.xml';
    
    le résultat donne : ../../plugins/plxcoinslider/slideshow/001.0001.xml ce qui correspond bien au chemin d'accès jusqu'au fichier xm mais j'ai toujours le message comme quoi il trouve pas le fichier. Et c'est le message qui vient plxMsq::Error car c'est un jquery.

    J'ai un string de l'array

  • StéphaneStéphane Member, Former PluXml Project Manager
    Afficher le contenu du tableau $AdminCoinslider->aSlideshow avec un print_r($AdminCoinslider->aSlideshow)
    pour voir si tu as bien un index de tableau correspondant à la valeur de $id

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Dans admin.php
    if(!isset($AdminCoinslider->aSlideshow[ $id ])) {
            print_r($AdminCoinslider->aSlideshow);
    
    Ca donne Array() :(

    J'ai un string de l'array

  • StéphaneStéphane Member, Former PluXml Project Manager
    tu as bien utilisé l'instuction print_r et pas print ?
    echo "<pre>";
    print_r($AdminCoinslider->aSlideshow);
    echo "</pre>";
    

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • flipflipflipflip Member
    août 2011 modifié
    oui bien print_r et non print
    <pre>Array
    (
    )
    </pre>
    

    J'ai un string de l'array

  • StéphaneStéphane Member, Former PluXml Project Manager
    alors c'est que ton tableau est vide. vérifie la fonction getSlideshow

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • En plus je viens de percuter passer par aSlideshow ça irait si j'avais qu'un seul fichier de configuration. Dans l'admin je vais en gérer un seul à la fois mais côté visiteur il est tout à fait possible qu'il y ai plusieurs fichiers de configuration. Donc je vais plutôt me baser sur la fonction qui récupère le chapo d'un article.

    J'ai un string de l'array

Connectez-vous ou Inscrivez-vous pour répondre.