. */ namespace SP\Config; use ReflectionObject; use SP\Core\Exceptions\ConfigException; use SP\Core\Session\Session; use SP\Core\Traits\InjectableTrait; use SP\Storage\XmlFileStorageInterface; use SP\Storage\XmlHandler; defined('APP_ROOT') || die(); /** * Esta clase es responsable de leer y escribir la configuración del archivo config.php */ class Config { use InjectableTrait; /** * @var bool */ private static $configLoaded = false; /** * @var ConfigData */ private $configData; /** * @var XmlHandler */ private $fileStorage; /** * @var Session */ private $session; /** * Config constructor. * * @param XmlFileStorageInterface $fileStorage * @throws \SP\Core\Exceptions\ConfigException * @throws \SP\Core\Dic\ContainerException */ public function __construct(XmlFileStorageInterface $fileStorage) { $this->injectDependencies(); $this->fileStorage = $fileStorage; if (!self::$configLoaded) { $this->configData = new ConfigData(); $this->loadConfigFile(); self::$configLoaded = true; } } /** * Cargar el archivo de configuración * * @return ConfigData * @throws \SP\Core\Exceptions\ConfigException */ public function loadConfigFile() { ConfigUtil::checkConfigDir(); try { // Mapear el array de elementos de configuración con las propieades de la clase configData $items = $this->fileStorage->load('config')->getItems(); $Reflection = new ReflectionObject($this->configData); foreach ($Reflection->getProperties() as $property) { $property->setAccessible(true); if (isset($items[$property->getName()])) { $property->setValue($this->configData, $items[$property->getName()]); } $property->setAccessible(false); } } catch (\Exception $e) { debugLog($e->getMessage()); throw new ConfigException(ConfigException::CRITICAL, $e->getMessage(), '', $e->getCode(), $e); } return $this->configData; } /** * Obtener la configuración o devolver una nueva * * @return void * @deprecated */ public static function getConfig() { } /** * Cargar la configuración desde el archivo * * @param bool $reload * @return ConfigData */ public function loadConfig($reload = false) { $configData = $this->session->getConfig(); if ($reload === true || $configData === null || time() >= ($this->session->getConfigTime() + $configData->getSessionTimeout() / 2) ) { $this->saveConfigInSession(); } return $this->configData; } /** * Guardar la configuración en la sesión */ private function saveConfigInSession() { $this->session->setConfig($this->configData); $this->session->setConfigTime(time()); } /** * Guardar la configuración * * @param ConfigData $configData * @param bool $backup */ public function saveConfig(ConfigData $configData = null, $backup = true) { $configData = null === $configData ? $this->configData : $configData; $configData->setConfigDate(time()); $configData->setConfigSaver($this->session->getUserData()->getLogin()); $configData->setConfigHash(); $this->fileStorage->setItems($configData); $this->fileStorage->save('config'); // if ($backup) { // $this->backupToDB(); // } } /** * Realizar un backup de la configuración en la BD */ private function backupToDB() { ConfigDB::setValue('config_backup', json_encode($this->configData), true, true); ConfigDB::setValue('config_backupdate', time()); } /** * @return ConfigData */ public function getConfigData() { return $this->configData; } /** * @param Session $session */ public function inject(Session $session) { $this->session = $session; } /** * Restaurar la configuración desde la BD * * @return array */ private function restoreBackupFromDB() { $configBackup = ConfigDB::getValue('config_backup'); return json_decode($configBackup); } }