Aller au contenu

PHP - POO - XML


Guest Hellway

Sujets conseillés

Guest Hellway
Posté

Pour XCMS, j'ai envie d'utiliser, dans les futures versions, la POO. Je me fais donc quelques griffes sur le sujet avant de me lancer dans l'aventure.

Ainsi, je me suis mis à créer un objet qui parse une feuille XML et qui en retire la configuration du script, environement ou module concerné. Voilà le script en procédural :

<?
 $xml_file='Config.xml';
 function open_markup($parser, $markup, $attributes)
 {
 global $current_vargroup, $xml_tree;
 if($markup=='VARGROUP')
   {
   $current_vargroup=$attributes['NAME'];
   $xml_tree[$current_vargroup] = array();
   }
 if(($current_vargroup)&&($markup=='VAR'))
   {
   $xml_tree[$current_vargroup][$attributes['NAME']]=$attributes['VALUE'];
   echo $xml_tree[$current_vargroup][$attributes['NAME']] .' ';
   }
 }
 function close_markup($parser, $markup)
 {
 if($markup=='VARGROUP')
   {
   global $current_vargroup;
   $current_vargroup=false;
   }
 }
 $xml_tree = array();
 $current_vargroup=false;
 $parser = xml_parser_create();
 xml_set_element_handler($parser, 'open_markup', 'close_markup');
 //xml_set_character_data_handler($parser, 'Texte');
 $f = fopen($xml_file, 'r');
 while ($line = fgets($f, 1024))
 {
         xml_parse($parser, $line, feof($f));
 }
 xml_parser_free($parser);
 fclose($f);
 echo '<dl>';
 foreach($xml_tree as $key=>$value)
 {
 echo '<dt>' . $key . '</dt>';
 foreach($value as $key2=>$value2)
   {
   echo '<dd>' . $key2 . ' = ' . $value2 . '</dd>';
   }
 }
 echo '</dl>';
?>

Ceci fonctionne correctement, le but étant, de récupérer des paramètres et de les intégrer au tableau nommé $xml_tree. Je souhaite intégrer ce script à une méthode d'un objet nommé configuration, mais le problème est que celui-ci ne fonctionne plus, enfin, celui-ci ne passe pas le tableau $xml_tree à l'objet qui possède pourtant un attribut $Config. La méthode constructeur est censée parser le fichier à l'aide de ce script et retourner le tableau $xml_tree dans l'attribut $Config... Mais ça marche pô... Que faire ?

Annexes :

Fichier XML :

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE confml  PUBLIC "-//XCMS//DTD CONFML 1.0 //EN" "http://groupeclan.free.fr/DTD/confml.dtd">
<confml>
<vargroup name="properties">
<var name="errorlog" value="false" />
<var name="actionlog" value="false" />
</vargroup>

<vargroup name="settings">
<var name="datasource" value="" />
<var name="display" value="" />
<var name="selection" value="" />
</vargroup>

<vargroup name="constants">
<var name="location" value="http://127.0.0.1/XCMS2/" />
</vargroup>

<vargroup name="parameters">
<var name="id" value="" />
<var name="lang" value="fr" />
<var name="stylesheet" value="basic" />
<var name="doctype" value="xhtml" />
</vargroup>

<vargroup name="rights">
<var name="access" value="5" />
</vargroup>
</confml>

Classe configuration :

<?
class Configuration
{
function Configuration()
 {
 $this->Report($this->getConfig('Config.xml'));
 }

// Get the configuration's files
function getConfig($xml_file)
 {
 function open_markup($parser, $markup, $attributes)
 {
 global $current_vargroup, $xml_tree;
 if($markup=='VARGROUP')
   {
   $current_vargroup=$attributes['NAME'];
   $xml_tree[$current_vargroup] = array();
   }
 if(($current_vargroup)&&($markup=='VAR'))
   {
   $xml_tree[$current_vargroup][$attributes['NAME']]=$attributes['VALUE'];
   echo $xml_tree[$current_vargroup][$attributes['NAME']] .' ';
   }
 }
 function close_markup($parser, $markup)
 {
 if($markup=='VARGROUP')
   {
   global $current_vargroup;
   $current_vargroup=false;
   }
 }
 $xml_tree = array();
 $current_vargroup=false;
 $parser = xml_parser_create();
 xml_set_element_handler($parser, 'open_markup', 'close_markup');
 $f = fopen($xml_file, 'r');
 while ($line = fgets($f, 1024))
 {
         xml_parse($parser, $line, feof($f));
 }
 xml_parser_free($parser);
 fclose($f);
 return $xml_tree;
 }
function Report($xml_tree)
 {
 echo '<dl>';
 foreach($xml_tree as $key=>$value)
 {
 echo '<dt>' . $key . '</dt>';
 foreach($value as $key2=>$value2)
   {
   echo '<dd>' . $key2 . ' = ' . $value2 . '</dd>';
   }
 }
 echo '</dl>';
 }
}

$hohop = new Page();
?>

Guest Hellway
Posté (modifié)

Désolé du dérangement, mais je viens d'obtenir la solution à mon problème :

<?
class configuration
{
var $xml_parser;
var $xml_tree = array();
var $current_vargroup=false;
function configuration($xml_file)
 {
 $this->get_xml_config($xml_file);
 $this->Report();
 }
function get_xml_config($xml_file)
 {
 $this->xml_parser = xml_parser_create();
 xml_set_object($this->xml_parser, $this);
 xml_set_element_handler($this->xml_parser, 'xml_open_markup', 'xml_close_markup');
 $f = fopen($xml_file, 'r');
 while ($line = fgets($f, 1024))
 {
         xml_parse($this->xml_parser, $line, feof($f));
 }
 xml_parser_free($this->xml_parser);
 fclose($f);
 $this->get_parameters();
 }
function xml_open_markup($parser, $markup, $attributes)
 {
 if($markup=='VARGROUP')
 {
 $this->current_vargroup=$attributes['NAME'];
 $this->xml_tree[$this->current_vargroup] = array();
 }
 if(($this->current_vargroup)&&($markup=='VAR'))
 {
 $this->xml_tree[$this->current_vargroup][$attributes['NAME']]=$attributes['VALUE'];
 }
 }
function xml_close_markup($parser, $markup)
 {
 if($markup=='VARGROUP')
 {
 $this->current_vargroup=false;
 }
 }
function get_parameters()
 {
 if(isset($this->xml_tree['parameters']))
 {
 foreach($this->xml_tree['parameters'] as $key=>$value)
   {
   if((isset($_REQUEST[$key]))&&($_REQUEST[$key]==$this->filter_parameters($_REQUEST[$key])))
   {
   $this->xml_tree['parameters'][$key]=$_REQUEST[$key];
   }
   }
 }
 }
function filter_parameters($parameter)
{
return eregi_replace('[^a-z0-9]', '', $parameter);
}
function Report()
 {
 echo '<dl>';
 foreach($this->xml_tree as $key=>$value)
 {
 echo '<dt>' . $key . '</dt>';
 foreach($value as $key2=>$value2)
   {
   echo '<dd>' . $key2 . ' = ' . $value2 . '</dd>';
   }
 }
 echo '</dl>';
 }
}
$hohop = new configuration('Config.xml');
?>

Si ça vous interesse de l'utiliser, pas de problème. Sinon, vous retrouverez sa version finale dans XCMS :).

Modifié par Hellway
Posté

n'utilise pas les smart-tags si ton code est destiné à être distribué. C'est comme pour register-globals: ils ne sont pas activés chez tous les hébergeurs. Utilise plutôt <?php.

Voilà, c'était la remarque hors-sujet du sieur moi

Guest Hellway
Posté

Oki, je suivrai ton conseil, même si je pense que c'est un peu idiot de ne pas les activer...

Posté
Oki, je suivrai ton conseil, même si je pense que c'est un peu idiot de ne pas les activer...

c'est pas idiot, bien au contraire, ca s'appelle la sécurité :D

Posté (modifié)

Et ca éviter de se prendre la tête quand on stocke des documents XML sur le même serveur ...

<?xml ...>

C'est la même chose ... avec les smart tags, pondre du XML en PHP devient vite prise de tête

Modifié par Findel
Guest Hellway
Posté

Au fait, Findel, j'ai lu ton petit article sur la sécurité des scripts PHP et les variables venant de l'extérieur. Je pense que l'objet que j'ai créé peut-être une solution, à condition que les paramètres CGI ne soient que des caractères alpha-numériques (ce qui est le plus probable).

A l'avenir, je souhaite créer de nouveau groupe de variables de configuration tels que :

- cookie :

Qui récupérera les variable définies dans le fichier Config.xml comme étant des variables à récupérer via les cookies (et qui créera le cookie quand ils seront définis via "_GET"

- parameters :

variable à récupérer via CGI

- server :

variables à récupérer via la méthode _SERVER

- request :

...

Mais aussi, comme pour le fichier de langue, je pense que je ferai des groupes de valeurs possibles. Par exemple, la langue, devra être une valeur possible pour qu'il n'y ai pas d'erreur du style lang=fsdff et que les fichiers de langue correspondants n'existent pas. Je pourrais utiliser la DTD pour ça, mais l'idée de parser aussi celle-ci me paraît assez décourageante, que me proposes-tu ?

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...