parameters.class.inc.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. class InvalidParameterException extends Exception
  3. {
  4. }
  5. abstract class Parameters
  6. {
  7. protected $aData = null;
  8. public function __construct()
  9. {
  10. $this->aData = null;
  11. }
  12. public function Get($sCode, $default = '')
  13. {
  14. if (array_key_exists($sCode, $this->aData))
  15. {
  16. return $this->aData[$sCode];
  17. }
  18. return $default;
  19. }
  20. public function ToXML(DOMNode $oRoot, $data = null, $sNodeName = null)
  21. {
  22. if ($data === null)
  23. {
  24. $data = $this->aData;
  25. }
  26. if (is_array($data))
  27. {
  28. if ($oRoot instanceof DOMDocument)
  29. {
  30. $oNode = $oRoot->createElement($sNodeName);
  31. }
  32. else
  33. {
  34. $oNode = $oRoot->ownerDocument->createElement($sNodeName);
  35. }
  36. $oRoot->appendChild($oNode);
  37. $aKeys = array_keys($data);
  38. $bNumericKeys = true;
  39. foreach($aKeys as $idx => $subkey)
  40. {
  41. if(((int)$subkey) !== $subkey)
  42. {
  43. $bNumericKeys = false;
  44. break;
  45. }
  46. }
  47. if ($bNumericKeys)
  48. {
  49. $oNode->setAttribute("type", "array");
  50. foreach($data as $key => $value)
  51. {
  52. $this->ToXML($oNode, $value , 'item');
  53. }
  54. }
  55. else
  56. {
  57. foreach($data as $key => $value)
  58. {
  59. $this->ToXML($oNode, $value , $key);
  60. }
  61. }
  62. }
  63. else
  64. {
  65. $oNode = $oRoot->ownerDocument->createElement($sNodeName);
  66. $oRoot->appendChild($oNode);
  67. $oTextNode = $oRoot->ownerDocument->createTextNode($data);
  68. $oNode->appendChild($oTextNode);
  69. }
  70. return $oNode;
  71. }
  72. }
  73. class PHPParameters extends Parameters
  74. {
  75. public function LoadFromHash($aData)
  76. {
  77. $this->aData = $aData;
  78. }
  79. public function LoadFromFile($sParametersFile)
  80. {
  81. if ($this->aData == null)
  82. {
  83. require_once($sParametersFile);
  84. $this->aData = $ITOP_PARAMS;
  85. }
  86. }
  87. }
  88. class XMLParameters extends Parameters
  89. {
  90. protected $sParametersFile;
  91. public function __construct($sParametersFile)
  92. {
  93. parent::__construct();
  94. $this->LoadFromFile($sParametersFile);
  95. }
  96. public function LoadFromFile($sParametersFile)
  97. {
  98. $this->sParametersFile = $sParametersFile;
  99. if ($this->aData == null)
  100. {
  101. libxml_use_internal_errors(true);
  102. $oXML = @simplexml_load_file($this->sParametersFile);
  103. if (!$oXML)
  104. {
  105. $aMessage = array();
  106. foreach(libxml_get_errors() as $oError)
  107. {
  108. $aMessage[] = "(line: {$oError->line}) ".$oError->message; // Beware: $oError->columns sometimes returns wrong (misleading) value
  109. }
  110. libxml_clear_errors();
  111. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': ".implode(' ', $aMessage));
  112. }
  113. $this->aData = array();
  114. foreach($oXML as $key => $oElement)
  115. {
  116. $this->aData[(string)$key] = $this->ReadElement($oElement);
  117. }
  118. }
  119. }
  120. protected function ReadElement(SimpleXMLElement $oElement)
  121. {
  122. $sDefaultNodeType = (count($oElement->children()) > 0) ? 'hash' : 'string';
  123. $sNodeType = $this->GetAttribute('type', $oElement, $sDefaultNodeType);
  124. switch($sNodeType)
  125. {
  126. case 'array':
  127. $value = array();
  128. // Treat the current element as zero based array, child tag names are NOT meaningful
  129. $sFirstTagName = null;
  130. foreach($oElement->children() as $oChildElement)
  131. {
  132. if ($sFirstTagName == null)
  133. {
  134. $sFirstTagName = $oChildElement->getName();
  135. }
  136. else if ($sFirstTagName != $oChildElement->getName())
  137. {
  138. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': mixed tags ('$sFirstTagName' and '".$oChildElement->getName()."') inside array '".$oElement->getName()."'");
  139. }
  140. $val = $this->ReadElement($oChildElement);
  141. $value[] = $val;
  142. }
  143. break;
  144. case 'hash':
  145. $value = array();
  146. // Treat the current element as a hash, child tag names are keys
  147. foreach($oElement->children() as $oChildElement)
  148. {
  149. if (array_key_exists($oChildElement->getName(), $value))
  150. {
  151. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': duplicate tags '".$oChildElement->getName()."' inside hash '".$oElement->getName()."'");
  152. }
  153. $val = $this->ReadElement($oChildElement);
  154. $value[$oChildElement->getName()] = $val;
  155. }
  156. break;
  157. case 'int':
  158. case 'integer':
  159. $value = (int)$oElement;
  160. break;
  161. case 'string':
  162. default:
  163. $value = (string)$oElement;
  164. }
  165. return $value;
  166. }
  167. protected function GetAttribute($sAttName, $oElement, $sDefaultValue)
  168. {
  169. $sRet = $sDefaultValue;
  170. foreach($oElement->attributes() as $sKey => $oChildElement)
  171. {
  172. if ((string)$sKey == $sAttName)
  173. {
  174. $sRet = (string)$oChildElement;
  175. break;
  176. }
  177. }
  178. return $sRet;
  179. }
  180. }