diff --git a/lam/lib/config.inc b/lam/lib/config.inc index 50b95c91..201ddf2c 100644 --- a/lam/lib/config.inc +++ b/lam/lib/config.inc @@ -2705,7 +2705,7 @@ class LAMCfgMain { logNewMessage(LOG_WARNING, 'Ignored setting during import: ' . $dataKey); continue; } - if (!(is_array($dataValue) || is_string($dataValue) || is_int($dataValue) || is_bool($dataValue))) { + if (!(($dataValue === null) || is_array($dataValue) || is_string($dataValue) || is_int($dataValue) || is_bool($dataValue))) { throw new LAMException('Invalid import data type for ' . htmlspecialchars($dataKey) . ': ' . gettype($dataValue)); } $this->$dataKey = $dataValue; diff --git a/lam/lib/persistence.inc b/lam/lib/persistence.inc index 60f54783..dadbeb31 100644 --- a/lam/lib/persistence.inc +++ b/lam/lib/persistence.inc @@ -1,5 +1,8 @@ _getMainConfigData(); + $jsonData['mainConfig'] = $this->_getMainConfigData(); return json_encode($jsonData); } @@ -50,9 +53,137 @@ class ConfigDataExporter { * @return array data */ public function _getMainConfigData() { - $mainCfg = new \LAMCfgMain(); + $mainCfg = new LAMCfgMain(); return $mainCfg->exportData(); } } +/** + * Importer for LAM's configuration data. + */ +class ConfigDataImporter { + + /** + * Returns a list of possible import objects. + * + * @param string $json JSON data + * @return ImporterStep[] steps + * @throws LAMException if invalid format + */ + public function getPossibleImportSteps($json) { + $data = json_decode($json); + if ($data === null) { + throw new LAMException(_('Unable to read import file.')); + } + $steps = array(); + foreach ($data as $key => $value) { + switch ($key) { + case 'mainConfig': + $steps[] = new ImporterStep(_('General settings'), 'mainConfig', $value); + break; + default: + logNewMessage(LOG_WARNING, 'Unknown import type: ' . $key); + } + } + if (empty($steps)) { + throw new LAMException(_('Unable to read import file.')); + } + return $steps; + } + + /** + * Runs the actual import. + * + * @param ImporterStep[] $steps import steps + * @throws LAMException if error occured + */ + public function runImport($steps) { + foreach ($steps as $step) { + if (!$step->isActive()) { + continue; + } + $key = $step->getKey(); + switch ($key) { + case 'mainConfig': + $cfgMain = new LAMCfgMain(); + $cfgMain->importData($step->getValue()); + $cfgMain->save(); + break; + default: + logNewMessage(LOG_WARNING, 'Unknown import type: ' . $key); + } + } + } + +} + +/** + * Step of the import process. + */ +class ImporterStep { + + private $label; + private $key; + private $value; + private $active = false; + + /** + * Constructor. + * + * @param string $label label + * @param string $key key + * @param array $value value + */ + public function __construct($label, $key, &$value) { + $this->label = $label; + $this->key = $key; + $this->value = $value; + } + + /** + * Returns the label. + * + * @return string label + */ + public function getLabel() { + return $this->label; + } + + /** + * Returns the key. + * + * @return string key + */ + public function getKey() { + return $this->key; + } + + /** + * Returns if this step should be executed. + * + * @return bool active + */ + public function isActive(): bool { + return $this->active; + } + + /** + * Sets if this step should be executed. + * + * @param bool $active active + */ + public function setActive(bool $active) { + $this->active = $active; + } + + /** + * Returns the value. + * + * @return string value + */ + public function getValue() { + return $this->value; + } + +} diff --git a/lam/templates/config/confImportExport.php b/lam/templates/config/confImportExport.php index d51b8cda..0f461f71 100644 --- a/lam/templates/config/confImportExport.php +++ b/lam/templates/config/confImportExport.php @@ -1,13 +1,18 @@ -