begin process at 2012 02 05 01:45:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] XML OBJECT SERIALIZER/UNSERIALIZER

[PHP5] XML OBJECT SERIALIZER/UNSERIALIZER


 Information sur la source

Note :
8,75 / 10 - par 4 personnes
8,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :objets, serialize, xml, unserialize, linéarisation Niveau :Initié Date de création :22/03/2006 Date de mise à jour :30/03/2006 13:53:53 Vu / téléchargé :9 281 / 436

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

 Description

Bon...je vais tenter d'expliquer le concept ;-)
Les adeptes de la POO PHP connaisse les fonctions serialize() et unserialize().
J'ai voulu, pour ma part, créer une classe générique permettant de linéariser un objet...en XML! Un peu comme XMLEncoder et XMLDecoder pour java.
Le but ? Obtenir des fichiers faciles à lire, voire à générer en php autrement qu'en créant un objet (cela peut servir de template), et contenant un objet déjà instancié.

Ce que fait cette classe : on lui passe un objet en paramètre. Elle récupère toutes les propriétés PUBLIQUES (j'y reviendrai) de cet objet, et créer une chaîne xml avec. Cette chaîne peut-être récupérée pour, par exemple, l'enregistrer dans un fichier.

Elle peut aussi, à partir d'une chaîne XML qu'elle a créée, qu'on lui passe en paramètre ou qu'elle va chercher dans ses propriétés, recréer une instance de cet objet.

Dans l'ordre, pour l'utilisation :
- on a besoin d'une instance d'une classe dont toutes les propriétés sont publiques. On modifie les propriétés etc...
- on instancie xmlSerialize :
$oxml = new xmlserialize ($oObj);
- on récupère les propriétés de l'objet :
$oxml -> getProps ();
- on sérialize l'objet :
$sXml = $oxml -> xmlToVars ();
- on fait ce qu'on veut avec $sXml...

Pour le unserialize : on lit le fichier dans lequel on a stocké le xml et on le met dans une chaine : $sXml par exemple, puis :
$newObjet = $oxml -> varsToXml ($sXml);

Et voilà :-)

Source

  • <?php
  • /**
  • * CLASS xmlSerializer
  • * object to xml serialization and unserialization
  • * @auteur : johan <barbier_johan@hotmail.com>
  • * @version : 1
  • * @date : 2006/03/22
  • *
  • * free to use, modify, please just tell me if you make any changes :-)
  • */
  • class xmlserialize {
  • /**
  • * private object oObj
  • * the object we work on
  • */
  • private $oObj = null;
  • /**
  • * private array of object oPropObj
  • * objects needed by the main object, because some of its properties are objects
  • */
  • private $oPropObj = array ();
  • /**
  • * private array aProps
  • * the PUBLIC properties of the object
  • */
  • private $aProps = array ();
  • /**
  • * private string xml
  • * the xml serailization of the object
  • */
  • private $xml = '';
  • /**
  • * public string node
  • * a fragment of the xml string
  • */
  • public $node = '';
  • /**
  • * public function __construct
  • * constructor
  • * @Param (object) $obj : the object we want to serialize/unserialize
  • * @Param (array) $oPropObj : array of objects needed by the main object
  • */
  • public function __construct ($obj, array $oPropObj = array ()) {
  • if (!is_object ($obj)) {
  • trigger_error ('The first argument given is not an object', E_USER_ERROR);
  • } else {
  • $this -> oObj = $obj;
  • }
  • if (!empty ($oPropObj)) {
  • foreach ($oPropObj as $clef => $oVal) {
  • if (is_object ($oVal)) {
  • $this -> oPropObj[$clef]['object'] = $oVal;
  • $this -> oPropObj[$clef]['class'] = get_class ($oVal);
  • }
  • }
  • }
  • }
  • /**
  • * public function getProps ()
  • * method used to get the public properties of the object
  • */
  • public function getProps () {
  • $this -> aProps = get_object_vars ($this -> oObj);
  • }
  • /**
  • * private function recVarsToXml
  • * method used to serialize the object, recursive
  • * @Params (DomDocument) & docXml : the DomDocument object
  • * @Params (DomElement) & xml : the current DomElement object
  • * @Params (array) & aProps : the array of properties we work on recursively
  • */
  • private function recVarsToXml (& $docXml, & $xml, & $aProps) {
  • foreach ($aProps as $clef => $val) {
  • if (empty ($clef) || is_numeric ($clef)) {
  • $clef = '_'.$clef;
  • }
  • $domClef = $docXml -> createElement ((string)$clef);
  • $domClef = $xml -> appendChild ($domClef);
  • if (is_scalar ($val)) {
  • $valClef = $docXml -> createTextNode ((string)$val);
  • $valClef = $domClef -> appendChild ($valClef);
  • } else {
  • if (is_array ($val)) {
  • $this -> recVarsToXml ($docXml, $domClef, $val);
  • }
  • if (is_object ($val)) {
  • $oXmlSerialize = new self ($val);
  • $oXmlSerialize -> getProps ();
  • $oXmlSerialize -> varsToXml ();
  • $objClef = $docXml -> importNode ($oXmlSerialize -> node, true);
  • $objClef = $domClef -> appendChild ($objClef);
  • }
  • }
  • }
  • }
  • /**
  • * public function varsToXml
  • * method used to serialize the object
  • * @Return (string) $xml : the xml string of the serialized object
  • */
  • public function varsToXml () {
  • $docXml = new DOMDocument ('1.0', 'utf-8');
  • $xml = $docXml -> createElement ('object_'.get_class ($this -> oObj));
  • $xml = $docXml -> appendChild ($xml);
  • $this -> recVarsToXml ($docXml, $xml, $this -> aProps);
  • $this -> node = $xml;
  • return $this -> xml = $docXml -> saveXML ();
  • }
  • /**
  • * private function recXmlToVars
  • * method used to unserialize the object, recursive
  • * @Param (array) aProps : the array we work on recursively
  • */
  • private function recXmlToVars ($aProps) {
  • foreach ($aProps as $clef => $val) {
  • $cpt = count ($val);
  • if ($cpt > 0) {
  • foreach ($val as $k => $v) {
  • $cpt2 = count ($v);
  • if ($cpt2 > 0) {
  • if (substr ($k, 0, 7) === 'object_') {
  • foreach ($this -> oPropObj as $kObj => $vObj) {
  • if ($this -> oPropObj[$kObj]['class'] === substr ($k, 7)) {
  • $oXmlSerializer = new self ($this -> oPropObj[$kObj]['object']);
  • $oXmlSerializer -> getProps ();
  • $sXml = $oXmlSerializer -> varsToXml ();
  • $oXmlSerializer -> xmlToVars ($sXml);
  • $this -> oObj -> {$clef}[substr ($k, 7)] = $oXmlSerializer -> getObj ();
  • }
  • }
  • } else {
  • $this -> recXmlToVars ($v);
  • }
  • } else {
  • if ($k{0} === '_') {
  • $k = substr ($k, 1, strlen($k) - 1);
  • }
  • $this -> oObj -> {$clef}[$k] = current ($v);
  • }
  • }
  • } elseif (!empty ($val)) {
  • $this -> oObj -> $clef = current ($val);
  • }
  • }
  • }
  • /**
  • * public function xmlToVars
  • * method used to unserialize the object
  • * @Param (string) xml : optional xml string (an already serialized object)
  • */
  • public function xmlToVars ($xml = '') {
  • if (empty ($xml)) {
  • $xml = simplexml_load_string ($this -> xml);
  • } else {
  • $xml = simplexml_load_string ($xml);
  • }
  • $this -> recXmlToVars ($xml);
  • }
  • /**
  • * public function getObj
  • * method used to get the unserialized object
  • * @Return (object) oObj : the unserialized object
  • */
  • public function getObj () {
  • return $this -> oObj;
  • }
  • /**
  • * public method __toString
  • * displays either the generated xml, or the object's properties to be serialized if the xml has not yet been generated
  • * This method requires the XSL extension to be set i
  • * Special thanks to Erwy, developpez.com XML forum administrator, who debugged my XSL :-), and to Tiscars, who tried to help too!
  • * @Returns (string) sString
  • */
  • public function __toString () {
  • $sString = '';
  • if (isset ($this -> xml) && !empty ($this -> xml)) {
  • if (class_exists ('XSLTProcessor')) {
  • $sString = '<br /><br /><span style="background-color: #ffcc33;">XML DISPLAY</span><br />';
  • $sXsl = <<<XSL
  • <?xml version ="1.0" encoding ="utf-8" ?>
  • <xsl:stylesheet version="1.0"
  • xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  • xmlns:php="http://php.net/xsl"
  • extension-element-prefixes="php">
  • <xsl:output method="xml" indent="yes" encoding="utf-8" />
  • <xsl:namespace-alias stylesheet-prefix="php" result-prefix="xsl" />
  • <xsl:template match="/">
  • <ul>
  • <xsl:apply-templates select="*"/>
  • </ul>
  • </xsl:template>
  • <xsl:template match="*">
  • <li>
  • <xsl:value-of select="local-name ()"/><xsl:apply-templates select="text()"/>
  • <xsl:if test="*"><ul>
  • <xsl:apply-templates select="*"/>
  • </ul></xsl:if>
  • </li>
  • </xsl:template>
  • <xsl:template match="text()">
  • <xsl:value-of select="concat('=&gt;',.)"/>
  • </xsl:template>
  • </xsl:stylesheet>
  • XSL;
  • $xsl = new XSLTProcessor();
  • $xsl->importStyleSheet(DOMDocument::loadXML($sXsl));
  • $sString .= $xsl->transformToXML(DOMDocument::loadXML($this -> xml));
  • } else {
  • $sString = '<br /><br /><span style="background-color: #ffcc33;">XSL EXTENSION NOT SET IN YOUR PHP.INI</span><br /><br />';
  • }
  • } else {
  • $sString = '<br /><br /><span style="background-color: #ffcc33;">OBJECT PROPERTIES DISPLAY</span><br /><br />';
  • $sString .= '<pre>'.var_export ($this -> aProps, true).'</pre>';
  • }
  • return $sString;
  • }
  • }
  • ?>
<?php
/**
* CLASS xmlSerializer
* object to xml serialization and unserialization
* @auteur : johan <barbier_johan@hotmail.com>
* @version : 1
* @date : 2006/03/22
*
* free to use, modify, please just tell me if you make any changes :-)
*/
class xmlserialize {

	/**
	* private object oObj
	* the object we work on
	*/
	private $oObj = null;
	/**
	* private array of object oPropObj
	* objects needed by the main object, because some of its properties are objects
	*/
	private $oPropObj = array ();
	/**
	* private array aProps
	* the PUBLIC properties of the object
	*/
	private $aProps = array ();
	/**
	* private string xml
	* the xml serailization of the object
	*/
	private $xml = '';
	/**
	* public string node
	* a fragment of the xml string
	*/
	public $node = '';

	/**
	* public function __construct
	* constructor
	* @Param (object) $obj : the object we want to serialize/unserialize
	* @Param (array) $oPropObj : array of objects needed by the main object
	*/
	public function __construct ($obj, array $oPropObj = array ()) {
		if (!is_object ($obj)) {
			trigger_error ('The first argument given is not an object', E_USER_ERROR);
		} else {
			$this -> oObj = $obj;
		}
		if (!empty ($oPropObj)) {
			foreach ($oPropObj as $clef => $oVal) {
		    	if (is_object ($oVal)) {
				  $this -> oPropObj[$clef]['object'] = $oVal;
				  $this -> oPropObj[$clef]['class'] = get_class ($oVal);
				}
			}
		}
	}

	/**
	* public function getProps ()
	* method used to get the public properties of the object
	*/
	public function getProps () {
		$this -> aProps = get_object_vars ($this -> oObj);
	}

	/**
	* private function recVarsToXml
	* method used to serialize the object, recursive
	* @Params (DomDocument) & docXml : the DomDocument object
	* @Params (DomElement) & xml : the current DomElement object
	* @Params (array) & aProps : the array of properties we work on recursively
	*/
	private function recVarsToXml (& $docXml, & $xml, & $aProps) {
		foreach ($aProps as $clef => $val) {
			if (empty ($clef) || is_numeric ($clef)) {
				$clef = '_'.$clef;
			}
			$domClef = $docXml -> createElement ((string)$clef);
			$domClef = $xml -> appendChild ($domClef);
			if (is_scalar ($val)) {
				$valClef = $docXml -> createTextNode ((string)$val);
				$valClef = $domClef -> appendChild ($valClef);
			} else {
				if (is_array ($val)) {
					$this -> recVarsToXml ($docXml, $domClef, $val);
				}
				if (is_object ($val)) {
					$oXmlSerialize = new self ($val);
					$oXmlSerialize -> getProps ();
					$oXmlSerialize -> varsToXml ();
					$objClef = $docXml -> importNode ($oXmlSerialize -> node, true);
					$objClef = $domClef -> appendChild ($objClef);
				}
			}
		}
	}

	/**
	* public function varsToXml
	* method used to serialize the object
	* @Return (string) $xml : the xml string of the serialized object
	*/
	public function varsToXml () {
		$docXml = new DOMDocument ('1.0', 'utf-8');
		$xml = $docXml -> createElement ('object_'.get_class ($this -> oObj));
		$xml = $docXml -> appendChild ($xml);
		$this -> recVarsToXml ($docXml, $xml, $this -> aProps);
		$this -> node = $xml;
		return $this -> xml = $docXml -> saveXML ();
	}

	/**
	* private function recXmlToVars
	* method used to unserialize the object, recursive
	* @Param (array) aProps : the array we work on recursively
	*/
	private function recXmlToVars ($aProps) {
		foreach ($aProps as $clef => $val) {
			$cpt = count ($val);
			if ($cpt > 0) {
				foreach ($val as $k => $v) {
					$cpt2 = count ($v);
					if ($cpt2 > 0) {
					  	if (substr ($k, 0, 7) === 'object_') {
						    foreach ($this -> oPropObj as $kObj => $vObj) {
						        if ($this -> oPropObj[$kObj]['class'] === substr ($k, 7)) {
                                    $oXmlSerializer = new self ($this -> oPropObj[$kObj]['object']);
                                    $oXmlSerializer -> getProps ();
                                    $sXml = $oXmlSerializer -> varsToXml ();
                                    $oXmlSerializer -> xmlToVars ($sXml);
                                    $this -> oObj -> {$clef}[substr ($k, 7)] = $oXmlSerializer -> getObj ();
                                }
							}
						} else {
							$this -> recXmlToVars ($v);
						}
					} else {
						if ($k{0} === '_') {
							$k = substr ($k, 1, strlen($k) - 1);
						}
						$this -> oObj -> {$clef}[$k] = current ($v);
					}
				}
			} elseif (!empty ($val)) {
				$this -> oObj -> $clef = current ($val);
			}
		}
	}

	/**
	* public function xmlToVars
	* method used to unserialize the object
	* @Param (string) xml : optional xml string (an already serialized object)
	*/
	public function xmlToVars ($xml = '') {
		if (empty ($xml)) {
			$xml = simplexml_load_string ($this -> xml);
		} else {
			$xml = simplexml_load_string ($xml);
		}
		$this -> recXmlToVars ($xml);
	}

	/**
	* public function getObj
	* method used to get the unserialized object
	* @Return (object) oObj : the unserialized object
	*/
	public function getObj () {
		return $this -> oObj;
	}
	
	/**
	* public method __toString
	* displays either the generated xml, or the object's properties to be serialized if the xml has not yet been 		generated
	* This method requires the XSL extension to be set i
	* Special thanks to Erwy, developpez.com XML forum administrator, who debugged my XSL :-), and to Tiscars, who tried to help too!
	* @Returns (string) sString 
	*/
	public function __toString () {
		$sString = '';
	  	if (isset ($this -> xml) && !empty ($this -> xml)) {
			if (class_exists ('XSLTProcessor')) {
		  		$sString = '<br /><br /><span style="background-color: #ffcc33;">XML DISPLAY</span><br />';
				$sXsl = <<<XSL
<?xml version ="1.0" encoding ="utf-8" ?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:php="http://php.net/xsl"
	extension-element-prefixes="php">
	<xsl:output method="xml" indent="yes" encoding="utf-8" />
	<xsl:namespace-alias stylesheet-prefix="php" result-prefix="xsl" />
   <xsl:template match="/">
      <ul>
         <xsl:apply-templates select="*"/>
      </ul>
   </xsl:template>
   <xsl:template match="*">
      <li>
         <xsl:value-of select="local-name ()"/><xsl:apply-templates select="text()"/>         
      <xsl:if test="*"><ul>
            <xsl:apply-templates select="*"/>
         </ul></xsl:if>
      </li>
   </xsl:template>
   <xsl:template match="text()">
      <xsl:value-of select="concat('=&gt;',.)"/>
   </xsl:template>
</xsl:stylesheet> 
XSL;
			  	$xsl = new XSLTProcessor();
			  	$xsl->importStyleSheet(DOMDocument::loadXML($sXsl));
				$sString .= $xsl->transformToXML(DOMDocument::loadXML($this -> xml));
			} else {
				$sString = '<br /><br /><span style="background-color: #ffcc33;">XSL EXTENSION NOT SET IN YOUR PHP.INI</span><br /><br />';
			}
		} else {
			$sString = '<br /><br /><span style="background-color: #ffcc33;">OBJECT PROPERTIES DISPLAY</span><br /><br />';
			$sString .= '<pre>'.var_export ($this -> aProps, true).'</pre>';
		}
		return $sString;
	}

}
?>


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 mars 2006 11:10:49 :
bugfixing
23 mars 2006 16:13:07 :
Gros bug fixing
23 mars 2006 16:48:15 :
modif du descriptif
23 mars 2006 17:19:00 :
bug fixing
27 mars 2006 10:44:23 :
Correction mineure concernant les tableaux indexés numériquement
27 mars 2006 11:14:53 :
correction d'un bug sur les propriétés étant elles-mêmes des objets.
27 mars 2006 15:44:58 :
return false viré du constructeur... ;-)
29 mars 2006 10:53:37 :
j'ai mis en place une première version d'affichage du xml généré. Pour l'utiliset il suffit de faire un echo de l'objet xmlserialize: $oxml = new xmlserialize ($obj); echo $oxml; // par exemple Si le xml a été généré via la méthode varsToXml-), le xml sera affiché grâce à l'utilisation de l'extension XSL de php. IL va sans dire qu'il faut l'activer (elle l'est rarement par défaut) dans le php.ini : avec l'objet XSLTProcessor. Sinon, un export des propriétés de l'objet pouvant être linéarisées est affiché. Je précise que ce n'est qu'une première version parce que la mise en forme du XML via des listes est un peu buggy ;-) Je rencontre un petit problème dans la génération de ma XSL. Problème que je cerne très bien, lol, mais je n'ai pas encore trouvé le moyen de le règler.
29 mars 2006 11:41:02 :
Commentaires ajoutés
30 mars 2006 13:53:56 :
version débuggée de ma XSL, grâce à Erwy et Tiscars (voir les credits dans les commentaires de la méthode __toString). L'affichage est maintenant parfait :-)

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
UNSERIALIZE ERROR par abdoulax
Source avec Zip DÉBOGAGE D'UN CODE PHP (SUIVIT DES VARIABLES) par originalcompo
Source avec Zip AFFICHER LES FILM EN SALLE par slhuilli
GARDER LES PARAMÈTRES D'UNE CLASS À TRAVERS PLUSIEURS PAGES. par massacr

Commentaires et avis

Commentaire de Skaaar le 24/03/2006 15:43:26

Niquel ! Code très propre et très pratique !

Merci !

Commentaire de malalam le 24/03/2006 17:15:06 administrateur CS

Merci :-)
Une réaction lol...(je savais que ce code n'intéresserait que TRES sporadiquement ;-).
Il subsiste un bug, néanmoins, que je n'ai pas eu le temps de corriger (2 en fait) :
- tableaux multidimensionnels non pris en compte (mais je le ferai bientôt)
- propriétés contenant des objets non prises en compte (pareil, je ferai ça bientôt).

Commentaire de malalam le 24/03/2006 17:22:52 administrateur CS

Enfin, plus exactement... : le xml généré est correct, toutes les infos y sont.
C'est dans la régénération de l'objet que j'ai buggé quand ujne propriété est elle-même un objet, ou un tableau multidimensionnel.
Ceci dit, ce n'est pas grand chose, il faut juste que je trouve un peu de temps pour corriger ça.

Commentaire de kankrelune le 25/03/2006 15:46:35

Je ne dirais qu'un mot... bravo... .. .

L'idée est plus que bonne et commençant à connaitre tes connaissances en la matière je ne doute pas du résultat... .. . :o)

Je test et je noterais dans la foulée... .. . ;o)

@ tchaOo°

Commentaire de malalam le 25/03/2006 19:40:31 administrateur CS

Merci kankrelune, c'est flatteur venant d'un codeur comme toi :-)

Commentaire de FhX le 27/03/2006 14:43:44

"quand ujne propriété est elle-même un objet, ou un tableau multidimensionnel. " Serialise ta propriété en premier. Puis sérialise le reste :)

Commentaire de malalam le 27/03/2006 14:48:38 administrateur CS

La sérialisation ne pose pas de problème, à vrai dire :-) Le xml généré contient tout.
C'était à la désérialisation que ça posait problème.

C'est réglé, mais il manque encore 2- 3 trucs...
Mais en l'état je ne peux rien faire de plus, je vais réécrire cette classe pour qu'elle soit un peu plus malléable.

Mais bon, là, c'est fonctionnel déjà :-) : les tableaux multi sont pris en compte, ça va, idem pour les propriétés qui sont elles-mêmes des objets, depuis ce matin :-)

mais je pense qu'en cas de gros tableau avec une profondeur...heu...profonde ;-) ça doit poser problème quand même (je me suis embrouillé dans ma récursivité lors de la délinéarization lol, je crois). Pour les tableaux d'objets, par contre, ça devrait aller.

Commentaire de FhX le 27/03/2006 15:12:20

Rhooo j'avais pas vu !! Y'a un truc qui vient tout juste de me chiffoner :D

"# public function __construct ($obj, array $oPropObj = array ()) {
#         if (!is_object ($obj)) {
#              return false;


Rhoo depuis quand un constructeur retourne quelque chose ???
Un ptit coup d'exception ou un trigger_error, y'a que ca qui fonctionne dans un constructeur :D

Bon moi niveau XML c'est pas encore tout à fait ca, je suis en train de m'y pencher donc je vais pas regarder en profondeur non plus tout de suite :)

Commentaire de malalam le 27/03/2006 15:28:49 administrateur CS

Bah disons que c'est un snippet ;-) Je ne veux pas que l'exécution s'interrompe si on a pas d'objet.
Après, le codeur qui utilisera cette classe, lui, est libre de retourner une erreur.

Commentaire de malalam le 27/03/2006 15:46:28 administrateur CS

Mais bon, ok, c'est quand même pas joli , donc je le vire ;-)

Commentaire de Skaaar le 28/03/2006 01:00:57

Petites remarques après un peu d'utilisation :
- Un pti peu de mise en forme dans le code xml ça serait pas mal, genre avec des retours chariot :p (quoi que je crois que c'est plus à moi de le rajouter ça)
- Ca peut paraitre bête, mais pour ceux qui débute en POO php il faut préciser que ça ne marche qu'avec des attributs public :)

Sinon personnellement ça m'est pratique pour charger la config de mon site web et la langue de l'utilisateur.

Commentaire de malalam le 28/03/2006 08:11:11 administrateur CS

Hello Skaaar :-)

- la mise en forme : hors de question! Lol... ;-) Non, je ne mettrai pas en forme le xml dans cette classe, ce n'est pas le but. Et il est hors de question que j'ajoute des retours chariots dans mon flux xml, en plus! Par contre...je peux ajouter une petite xls au zip...ou fournir un script php qui génère du xls, pour visualisation, pourquoi pas!

- je pensais avoir été clair sur les propriétés publiques, apparemment pas : donc oui, tu as raison, cette classe ne peut linéariser (et à fortiori, délinéariser) que les propriété publiques d'une classe. Pour le moment! Je pense aujourd'hui donner la possibilité d'ajouter aux classes qu'on veut linéariser, un getter et un setter particuliers, dédiés à cette linéarisation (sans que ce soit obligatoire, évidemment : sans, c'est comme aujourd'hui. Avec, cela permettra de linéariser/délinéariser les propriétés privées, protégées aussi).

Sinon, heureux que ça te serve :-) Je joindrai bientôt un exemple concret d'utilisation, à vrai dire. Je pense que ce serair utile.

Commentaire de malalam le 28/03/2006 08:14:36 administrateur CS

Après une très courte réflexion, lol, je vais peut-être ajouter une méthode affichant le xml de plus jolie façon...ça ne peut pas faire de mal après tout. Et ce ne serait pas illogique.

Commentaire de malalam le 29/03/2006 10:52:08 administrateur CS

Update spécial SKAAAR =>
j'ai mis en place une première version d'affichage du xml généré. Pour l'utiliset il suffit de faire un echo de l'objet xmlserialize:
$oxml = new xmlserialize ($obj);
echo $oxml; // par exemple

Si le xml a été généré via la méthode varsToXml-), le xml sera affiché grâce à l'utilisation de l'extension XSL de php. IL va sans dire qu'il faut l'activer (elle l'est rarement par défaut) dans le php.ini : avec l'objet XSLTProcessor.

Sinon, un export des propriétés de l'objet pouvant être linéarisées est affiché.

Je précise que ce n'est qu'une première version parce que la mise en forme du XML via des listes est un peu buggy ;-) Je rencontre un petit problème dans la génération de ma XSL. Problème que je cerne très bien, lol, mais je n'ai pas encore trouvé le moyen de le règler.

Commentaire de Skaaar le 31/03/2006 02:29:10

Yes ! Merci ça gère :)

Commentaire de malalam le 31/03/2006 07:30:48 administrateur CS

De rien :-) En plus, t'as dû prendre la 2de version, qui elle, n'est plus buggée : l'affichage devrait toujours être ok.

Commentaire de kankrelune le 31/03/2006 07:45:14

" Merci kankrelune, c'est flatteur venant d'un codeur comme toi :-)"

Ah non... c'est toi qui me flatte là... je me débrouille certe mais ça s'arrête là... .. . ;o)

Bon et bien sérialiseur testé... et approuvé... .. . :oD

Je met 9 parce que bien que le code demande quelques améliorations il tourne bien en l'état et surtout l'idée est très bonne et mérite bien ça... .. . :o)

@ tchaOo°

Commentaire de malalam le 31/03/2006 07:49:40 administrateur CS

Yep, merci encore Kankrelune :-)

Si t'as des idées d'améliorations, n'hésites pas :-)

Je pense sous peu (bien qu'en l'état il me suffise pour le moment, pour mon utilisation) ajouter la possibilité de linéariser aussi les propriétés protégées et privées (avec comme condition l'ajout dans la classe à linéariser d'un setter et d'un getter spéciaux, c'est le seul moyen viable). Et je dois aussi me pencher sur les constantes et les statiques...que je ne prends pas en compte, là.

Commentaire de Skaaar le 21/04/2006 11:30:30

Malalam > Quelle version de php et des librairie utilises tu ? J'ai perdu le numéro de la version de php avec lequel j'avais testé, et là ya plus rien qui marche :(
J'ai des méthodes qui n'existe pas (entres autres : DomDocument::load(), DomDocument::loadXML(), domxml_xslt*(), ...) Ce qui est génant pour adapté un XSLT au XML et afficher le tout.
J'ai essayé de aussi de passer par :

<?php

  $xml = domxml_open_file('aze.xml');
  $xsl = domxml_open_file('aze.xslt');

  $proc = new XSLTProcessor;
  $proc->importStyleSheet($xsl);
?>
Qui a mon sens devrait reprendre l'exemple qui est là : http://www.php.net/manual/en/function.xsl-xsltprocessor-transform-to-doc.php#AEN200744 sans utilisé la méthode load(). Mais j'ai une erreur à la ligne 7 (importStyleSheet($xsl)) : 'Warning: Invalid Document in g:\SambaMod\www\aze.php on line 7'.

Je me suis aperçu également que certaine méthodes que tu utilisais était 'deprecated' : http://www.php.net/manual/en/ref.domxml.php#domxml.deprecated

Voici un extrait de mon phpinfo validant le bon chargement de mes librairies :

xml

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.6.22

xsl

XSL => enabled
libxslt Version => 1.1.15
libxslt compiled against libxml Version => 2.6.22
EXSLT => enabled
libexslt Version => 0.8.12

Existe-t'il des nouveaux noms pour les méthodes ? est-ce que les docs sont à jour ? Est-ce que j'utilise une version de PHP trop 'beta' (PHP5.1.2 pour windows) ? Est-ce que c'est parceque j'utilise PHP en ligne de comande ? Tant de question que je me pose et qui n'aboutissent à rien :'(
Si tu as quelquechose qui pourrait m'éclairer (autre qu'une source lumineuse ;) ), je t'en remercie.

Cordialement,

Scar.

PS : Ton script ne fonctionne pas avec EasyPHP1.8 (PHP4.3.10)

Commentaire de malalam le 05/07/2006 14:10:45 administrateur CS

SKAAR => désolé, je n'avais pas vu ce message!! Je viens de le voir...donc, je réponds :
je suis en php 5.1.4 je crois (enfin, la dernière).
Pour ce qui est des extensions, attention...je n'utilise pas DOMXML, mais DOM (la version php5). Ce qui est très différent. A mon avis tes problèmes viennent de là. Tu montres la librairie XML, que je n'utilise pas ici. Vérifie que DOM soit installée correctement.
Et effectivement, mon script ne fonctionne pas en PHP4.3.10 puisqu'il utilise la syntaxe PHP5 exclusivement (notamment côté POO).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Probleme avec serialize et unserialize [ par matou82 ] J'ai un objet que je serialize et passe en paramètre dans l'url d'un popup.Dans ce popup je le unserialize. Il s'agit d'un objet possédant une fonctio PHP / NuSOAP : Xml parsing error [ par pete87150 ] Bonjour,J'ai créé un service web tout simple pour tester : [WebService(Description="Bienvenue sur le service Web de démo",Namespace="WordGeneration")] Pb de récupéationde données XML en PHP [ par baka72 ] Salut,J ai un pb en php qd je veu récupérer mes données XML. en effet, si le contenu de la donnée est assez long PHP me la met en plusieurs morceaux e Besoin d'aide Php/Xml [ par bipbipbip ] Bonjour à tousJe cherche a modifier un xml sans passer par des fonctions compliqués que je ne maitrise pas. Je voudrais que mon script php ouvre mon f Récupérer les données d'un fichier xml [ par iomega ] Bonjour à tousJe voudrai récupérer la valeur qui se trouvent dans une sous catégorie de la balise &lt;RECORD&gt;&lt;ARTICLE&gt; ET ENFIN LA VALEUR QUE probleme avec xml : à l'aide!! [ par jed35 ] bonjour,j'explique mon probleme :j'ai le code suivant en php$graph_title = 'Titre de mon diagramme';$graph_desc = 'mon super graphe';$graph_data = arr xml dans un tableau php! SVG à la clé :) [ par jed35 ] Bonjour je débute en php et évidemment j'ai un probleme. Je cherche à placer des données (qui se trouvent dans un fichier xml) dans un tableau php.voi parser xml [ par Nebraska ] bonjour,bon je débute salement en php; et j'ai besoin d'un parser xml. J'ai essayé ça mais bon ça marche pas :(Une bonne âme prèt a me dire ou je me s Pb avec XML !!! [ par renaud1102 ] Salut,J'utilise un fichier XML comme base de données, je sais afficher cette base, je sais ajouter un element mais je ne sais point comment modifier u ecrir dans un fichier xml déjà existant [ par BirD ] hello,ca fait un moment que je cherche une astuce qui me permetterais d'écrir dans un document XML (sans passer par la meme méthode que pour écrir dan


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales