parameters.class.inc.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. }
  21. class PHPParameters extends Parameters
  22. {
  23. public function LoadFromHash($aData)
  24. {
  25. $this->aData = $aData;
  26. }
  27. public function LoadFromFile($sParametersFile)
  28. {
  29. if ($this->aData == null)
  30. {
  31. require_once($sParametersFile);
  32. $this->aData = $ITOP_PARAMS;
  33. }
  34. }
  35. }
  36. class XMLParameters extends Parameters
  37. {
  38. protected $sParametersFile;
  39. public function __construct($sParametersFile)
  40. {
  41. parent::__construct();
  42. $this->LoadFromFile($sParametersFile);
  43. }
  44. public function LoadFromFile($sParametersFile)
  45. {
  46. $this->sParametersFile = $sParametersFile;
  47. if ($this->aData == null)
  48. {
  49. libxml_use_internal_errors(true);
  50. $oXML = @simplexml_load_file($this->sParametersFile);
  51. if (!$oXML)
  52. {
  53. $aMessage = array();
  54. foreach(libxml_get_errors() as $oError)
  55. {
  56. $aMessage[] = "(line: {$oError->line}) ".$oError->message; // Beware: $oError->columns sometimes returns wrong (misleading) value
  57. }
  58. libxml_clear_errors();
  59. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': ".implode(' ', $aMessage));
  60. }
  61. $this->aData = array();
  62. foreach($oXML as $key => $oElement)
  63. {
  64. $this->aData[(string)$key] = $this->ReadElement($oElement);
  65. }
  66. }
  67. }
  68. protected function ReadElement(SimpleXMLElement $oElement)
  69. {
  70. $sDefaultNodeType = (count($oElement->children()) > 0) ? 'hash' : 'string';
  71. $sNodeType = $this->GetAttribute('type', $oElement, $sDefaultNodeType);
  72. switch($sNodeType)
  73. {
  74. case 'array':
  75. $value = array();
  76. // Treat the current element as zero based array, child tag names are NOT meaningful
  77. $sFirstTagName = null;
  78. foreach($oElement->children() as $oChildElement)
  79. {
  80. if ($sFirstTagName == null)
  81. {
  82. $sFirstTagName = $oChildElement->getName();
  83. }
  84. else if ($sFirstTagName != $oChildElement->getName())
  85. {
  86. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': mixed tags ('$sFirstTagName' and '".$oChildElement->getName()."') inside array '".$oElement->getName()."'");
  87. }
  88. $val = $this->ReadElement($oChildElement);
  89. $value[] = $val;
  90. }
  91. break;
  92. case 'hash':
  93. $value = array();
  94. // Treat the current element as a hash, child tag names are keys
  95. foreach($oElement->children() as $oChildElement)
  96. {
  97. if (array_key_exists($oChildElement->getName(), $value))
  98. {
  99. throw new InvalidParameterException("Invalid Parameters file '{$this->sParametersFile}': duplicate tags '".$oChildElement->getName()."' inside hash '".$oElement->getName()."'");
  100. }
  101. $val = $this->ReadElement($oChildElement);
  102. $value[$oChildElement->getName()] = $val;
  103. }
  104. break;
  105. case 'int':
  106. case 'integer':
  107. $value = (int)$oElement;
  108. break;
  109. case 'string':
  110. default:
  111. $value = (string)$oElement;
  112. }
  113. return $value;
  114. }
  115. protected function GetAttribute($sAttName, $oElement, $sDefaultValue)
  116. {
  117. $sRet = $sDefaultValue;
  118. foreach($oElement->attributes() as $sKey => $oChildElement)
  119. {
  120. if ((string)$sKey == $sAttName)
  121. {
  122. $sRet = (string)$oChildElement;
  123. break;
  124. }
  125. }
  126. return $sRet;
  127. }
  128. }