/libs/core/Open/Config.php

https://github.com/paveli/OpenStructPHP · PHP · 259 lines · 100 code · 29 blank · 130 comment · 15 complexity · d6187bcf400265aeadd96f5cd299c90a MD5 · raw file

  1. <?php
  2. /**
  3. * Работа с конфигами - класс Open_Config
  4. * @package OpenStruct
  5. */
  6. /**
  7. * Подключаем необходимые файлы
  8. */
  9. require_once CORE_PATH .'Open/Benchmark'. EXT;
  10. require_once CORE_PATH .'Open/Singleton'. EXT;
  11. /**
  12. * Работа с конфигами
  13. */
  14. class Open_Config extends Open_Singleton
  15. {
  16. /*************
  17. * Константы *
  18. *************/
  19. /**
  20. * Конфиг по умолчанию с базовыми параметрами
  21. *
  22. */
  23. const DEFAULT_CONFIG = 'config';
  24. /************
  25. * Свойства *
  26. ************/
  27. /**
  28. * Здесь хранятся все конфиги
  29. *
  30. * @var array
  31. */
  32. private $config = array();
  33. /**********
  34. * Методы *
  35. **********/
  36. /**
  37. * Конструктор
  38. *
  39. */
  40. protected function __construct()
  41. {
  42. parent::__construct();
  43. if(DEBUG) Open_Benchmark::getInstance()->mark(__CLASS__ .'_start');
  44. }
  45. /**
  46. * Деструктор
  47. *
  48. */
  49. function __destruct()
  50. {
  51. if(DEBUG) Open_Benchmark::getInstance()->mark(__CLASS__ .'_end');
  52. parent::__destruct();
  53. }
  54. /**
  55. * Получить ссылку на единственный объект этого класса
  56. * Переопределяем метод унаследованный от синглтона
  57. * Необходимо для корректного создания объекта потомка
  58. *
  59. * @param string $c Имя класса создаваемого объекта
  60. * @return object Ссылка на объект
  61. */
  62. static public function getInstance($c=__CLASS__)
  63. {
  64. return parent::getInstance($c);
  65. }
  66. /**
  67. * Загрузить
  68. * Формируется в виде ассоциативного массива с ключами - названиями секций
  69. * Файл с загружаемым конфигом должен возвращать массив
  70. * Аргуметы взяты с подчёркиванием для избежания пересечения имён в методе с именами в файле конфига
  71. *
  72. * @param string $_name Имя файла конфига без расширения
  73. * @param bool $_trigger Выдать ошибку в случае неудачи?
  74. * @return bool Успех операции
  75. */
  76. public function load($_name=self::DEFAULT_CONFIG, $_trigger=TRUE)
  77. {
  78. /**
  79. * Загружали уже конфиг?
  80. */
  81. if( isset($this->config[$_name]) )
  82. { return TRUE;
  83. }
  84. /**
  85. * А файл с конфигом существует? Если нет, показываем предупреждение
  86. */
  87. if( !file_exists($_path = CONFIGS_PATH . $_name . EXT) )
  88. {
  89. if($_trigger)
  90. { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Config file <b>%s</b> does not exist'), $_name . EXT), E_USER_WARNING);
  91. }
  92. return FALSE;
  93. }
  94. $this->config[$_name] = include $_path;
  95. return TRUE;
  96. }
  97. /**
  98. * Получить параметр из конфига по имени и секции
  99. *
  100. * @param string $section Имя секции. Если секция не указана, берётся секция по умолчанию
  101. * @param string $name Имя параметра либо массив имён параметров. Если не указано, значит имя секции - это имя параметра
  102. * @return mixed
  103. */
  104. public function get($section, $name=NULL)
  105. {
  106. /**
  107. * Если второй параметр не указан при вызове, значит первый это имя, а не секция
  108. * Чтобы при вызове с двумя параметрами сначала была секция, а потом имя параметра, по логике вещей
  109. */
  110. if( !isset($name) )
  111. { $name = $section;
  112. $section = self::DEFAULT_CONFIG;
  113. }
  114. /**
  115. * Если такой секции не существует
  116. * То пытаемся подгрузить
  117. */
  118. if( !isset($this->config[$section]) )
  119. { $this->load($section, FALSE);
  120. }
  121. /**
  122. * Если запрашивается массив значений из конфига
  123. * Выбираем все по очереди, если чего-то нет, выдаётся ошибка
  124. */
  125. if( is_array($name) )
  126. {
  127. $result = array();
  128. foreach($name as $value)
  129. {
  130. if( isset($this->config[$section][$value]) )
  131. { $result[$value] = $this->config[$section][$value];
  132. }
  133. else
  134. { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Config item <b>%s[%s]</b> does not exist'), $section, $name), E_USER_NOTICE);
  135. return FALSE;
  136. }
  137. }
  138. return $result;
  139. }
  140. /**
  141. * Если указанный пункт в секции существует, возвращаем
  142. */
  143. if( isset($this->config[$section][$name]) )
  144. {
  145. return $this->config[$section][$name];
  146. }
  147. /**
  148. * Если ничего не найдено, то выдаём ошибку
  149. */
  150. trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Config item <b>%s[%s]</b> does not exist'), $section, $name), E_USER_NOTICE);
  151. return FALSE;
  152. }
  153. /**
  154. * Получить все параметры из секции
  155. *
  156. * @param string $section Имя секции. Если секция не указана, берётся секция по умолчанию
  157. * @return mixed
  158. */
  159. public function getAll($section=NULL)
  160. {
  161. /**
  162. * Если секция не указана, берём секцию по умолчанию
  163. */
  164. if( !isset($section) )
  165. {
  166. $section = self::DEFAULT_CONFIG;
  167. }
  168. /**
  169. * Если такой секции не существует
  170. * То пытаемся подгрузить
  171. */
  172. if( !isset($this->config[$section]) )
  173. {
  174. $this->load($section, FALSE);
  175. }
  176. /**
  177. * Если секция существует после попытки загрузить, то возвращаем её целиком
  178. */
  179. if( isset($this->config[$section]) )
  180. {
  181. return $this->config[$section];
  182. }
  183. /**
  184. * Если ничего не найдено, то выдаём ошибку
  185. */
  186. trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Config section <b>%s</b> does not exist'), $section), E_USER_NOTICE);
  187. return FALSE;
  188. }
  189. /**
  190. * Проверить существование параметра по имени и секции в конфиге
  191. *
  192. * @param string $section Имя секции. Если секция не указана, берётся секция по умолчанию
  193. * @param string $name Имя параметра. Если не указано, значит имя секции - это имя параметра
  194. * @return bool
  195. */
  196. public function exists($section, $name=NULL)
  197. {
  198. /**
  199. * Если второй параметр не указан при вызове, значит первый это имя, а не секция
  200. * Чтобы при вызове с двумя параметрами сначала была секция, а потом имя параметра, по логике вещей
  201. */
  202. if( !isset($name) )
  203. { $name = $section;
  204. $section = self::DEFAULT_CONFIG;
  205. }
  206. /**
  207. * Если такой секции не существует
  208. * То пытаемся подгрузить
  209. */
  210. if( !isset($this->config[$section]) )
  211. { $this->load($section, FALSE);
  212. }
  213. /**
  214. * Проверяем существование и возвращаем результат
  215. */
  216. return isset($this->config[$section][$name]);
  217. }
  218. /**
  219. * Сохранить параметр в конфиг
  220. * ??? Нужна ли функция? Но пусть будет
  221. *
  222. * @param string $section Имя секции
  223. * @param string $name Имя параметра
  224. * @param mixed $value Значение параметра
  225. */
  226. public function set($section, $name, $value)
  227. {
  228. $this->config[$section][$name] = $value;
  229. }
  230. }