| 
<?php
/**
 * CLASS xmlSerializer
 * object to xml serialization and unserialization
 * @auteur : johan <[email protected]>
 * @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)) {
 return false;
 } 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', 'iso-8859-1');
 $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;
 }
 
 }
 ?>
 |