summaryrefslogtreecommitdiffstats
path: root/core/command/config/system/setconfig.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/command/config/system/setconfig.php')
-rw-r--r--core/command/config/system/setconfig.php133
1 files changed, 124 insertions, 9 deletions
diff --git a/core/command/config/system/setconfig.php b/core/command/config/system/setconfig.php
index 0100ad2dfb0..45ba01e9284 100644
--- a/core/command/config/system/setconfig.php
+++ b/core/command/config/system/setconfig.php
@@ -48,8 +48,15 @@ class SetConfig extends Base {
->setDescription('Set a system config value')
->addArgument(
'name',
- InputArgument::REQUIRED,
- 'Name of the config to set'
+ InputArgument::REQUIRED | InputArgument::IS_ARRAY,
+ 'Name of the config parameter, specify multiple for array parameter'
+ )
+ ->addOption(
+ 'type',
+ null,
+ InputOption::VALUE_REQUIRED,
+ 'Value type [string, integer, double, boolean]',
+ 'string'
)
->addOption(
'value',
@@ -67,16 +74,124 @@ class SetConfig extends Base {
}
protected function execute(InputInterface $input, OutputInterface $output) {
- $configName = $input->getArgument('name');
+ $configNames = $input->getArgument('name');
+ $configName = $configNames[0];
+ $configValue = $this->castValue($input->getOption('value'), $input->getOption('type'));
+ $updateOnly = $input->getOption('update-only');
+
+ if (sizeof($configNames) > 1) {
+ $existingValue = $this->systemConfig->getValue($configName);
+
+ $newValue = $this->mergeArrayValue(
+ array_slice($configNames, 1), $existingValue, $configValue['value'], $updateOnly
+ );
+
+ $this->systemConfig->setValue($configName, $newValue);
+ } else {
+ if ($updateOnly && !in_array($configName, $this->systemConfig->getKeys(), true)) {
+ throw new \UnexpectedValueException('Config parameter does not exist');
+ }
- if (!in_array($configName, $this->systemConfig->getKeys()) && $input->hasParameterOption('--update-only')) {
- $output->writeln('<comment>Config value ' . $configName . ' not updated, as it has not been set before.</comment>');
- return 1;
+ $this->systemConfig->setValue($configName, $configValue['value']);
}
- $configValue = $input->getOption('value');
- $this->systemConfig->setValue($configName, $configValue);
- $output->writeln('<info>System config value ' . $configName . ' set to ' . $configValue . '</info>');
+ $output->writeln('<info>System config value ' . implode(' => ', $configNames) . ' set to ' . $configValue['readable-value'] . '</info>');
return 0;
}
+
+ /**
+ * @param string $value
+ * @param string $type
+ * @return mixed
+ * @throws \InvalidArgumentException
+ */
+ protected function castValue($value, $type) {
+ switch ($type) {
+ case 'integer':
+ case 'int':
+ if (!is_numeric($value)) {
+ throw new \InvalidArgumentException('Non-numeric value specified');
+ }
+ return [
+ 'value' => (int) $value,
+ 'readable-value' => 'integer ' . (int) $value,
+ ];
+
+ case 'double':
+ case 'float':
+ if (!is_numeric($value)) {
+ throw new \InvalidArgumentException('Non-numeric value specified');
+ }
+ return [
+ 'value' => (double) $value,
+ 'readable-value' => 'double ' . (double) $value,
+ ];
+
+ case 'boolean':
+ case 'bool':
+ $value = strtolower($value);
+ switch ($value) {
+ case 'true':
+ return [
+ 'value' => true,
+ 'readable-value' => 'boolean ' . $value,
+ ];
+
+ case 'false':
+ return [
+ 'value' => false,
+ 'readable-value' => 'boolean ' . $value,
+ ];
+
+ default:
+ throw new \InvalidArgumentException('Unable to parse value as boolean');
+ }
+
+ case 'null':
+ return [
+ 'value' => null,
+ 'readable-value' => 'null',
+ ];
+
+ case 'string':
+ $value = (string) $value;
+ return [
+ 'value' => $value,
+ 'readable-value' => ($value === '') ? 'empty string' : 'string ' . $value,
+ ];
+
+ default:
+ throw new \InvalidArgumentException('Invalid type');
+ }
+ }
+
+ /**
+ * @param array $configNames
+ * @param mixed $existingValues
+ * @param mixed $value
+ * @param bool $updateOnly
+ * @return array merged value
+ * @throws \UnexpectedValueException
+ */
+ protected function mergeArrayValue(array $configNames, $existingValues, $value, $updateOnly) {
+ $configName = array_shift($configNames);
+ if (!is_array($existingValues)) {
+ $existingValues = [];
+ }
+ if (!empty($configNames)) {
+ if (isset($existingValues[$configName])) {
+ $existingValue = $existingValues[$configName];
+ } else {
+ $existingValue = [];
+ }
+ $existingValues[$configName] = $this->mergeArrayValue($configNames, $existingValue, $value, $updateOnly);
+ } else {
+ if (!isset($existingValues[$configName]) && $updateOnly) {
+ throw new \UnexpectedValueException('Config parameter does not exist');
+ }
+ $existingValues[$configName] = $value;
+ }
+ return $existingValues;
+ }
+
}