Skip to content

Commit f133278

Browse files
authored
Merge pull request #6555 from WoltLab/62-form-option-ignore-missing-values
Ignore missing values for selections
2 parents e383ef5 + 647ba8c commit f133278

4 files changed

Lines changed: 53 additions & 8 deletions

File tree

wcfsetup/install/files/lib/system/form/builder/field/MultipleSelectionFormField.class.php

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ class MultipleSelectionFormField extends AbstractFormField implements
4343
*/
4444
protected $value = [];
4545

46+
/**
47+
* @since 6.2
48+
*/
49+
private bool $ignoreInvalidValues = false;
50+
4651
/**
4752
* @inheritDoc
4853
*/
@@ -130,13 +135,30 @@ public function value($value)
130135
throw new InvalidFormFieldValue($this, 'array', \gettype($value));
131136
}
132137

133-
$unknownValues = \array_diff($value, \array_keys($this->getOptions()));
134-
if (!empty($unknownValues)) {
135-
throw new \InvalidArgumentException(
136-
"Unknown values '" . \implode("', '", $unknownValues) . "' for field '{$this->getId()}'."
137-
);
138+
$validKeys = \array_keys($this->getOptions());
139+
$unknownValues = \array_diff($value, $validKeys);
140+
if ($unknownValues !== []) {
141+
if ($this->ignoreInvalidValues) {
142+
$value = \array_intersect($value, $validKeys);
143+
} else {
144+
throw new \InvalidArgumentException(
145+
"Unknown values '" . \implode("', '", $unknownValues) . "' for field '{$this->getId()}'."
146+
);
147+
}
138148
}
139149

140150
return parent::value($value);
141151
}
152+
153+
/**
154+
* Ignores invalid values when reading them from data.
155+
*
156+
* @since 6.2
157+
*/
158+
public function ignoreInvalidValues(bool $ignoreInvalidValues = true): self
159+
{
160+
$this->ignoreInvalidValues = $ignoreInvalidValues;
161+
162+
return $this;
163+
}
142164
}

wcfsetup/install/files/lib/system/form/builder/field/SelectFormField.class.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ final class SelectFormField extends AbstractFormField implements
3131
*/
3232
protected $templateName = 'shared_selectFormField';
3333

34+
/**
35+
* @since 6.2
36+
*/
37+
private bool $ignoreInvalidValues = false;
38+
3439
/**
3540
* @inheritDoc
3641
*/
@@ -75,10 +80,26 @@ public function value($value)
7580
{
7681
if ($value !== null && $value !== '') {
7782
if (!isset($this->getOptions()[$value])) {
78-
throw new \InvalidArgumentException("Unknown value '{$value}' for field '{$this->getId()}'.");
83+
if ($this->ignoreInvalidValues) {
84+
$value = null;
85+
} else {
86+
throw new \InvalidArgumentException("Unknown value '{$value}' for field '{$this->getId()}'.");
87+
}
7988
}
8089
}
8190

8291
return parent::value($value);
8392
}
93+
94+
/**
95+
* Ignores invalid values when reading them from data.
96+
*
97+
* @since 6.2
98+
*/
99+
public function ignoreInvalidValues(bool $ignoreInvalidValues = true): self
100+
{
101+
$this->ignoreInvalidValues = $ignoreInvalidValues;
102+
103+
return $this;
104+
}
84105
}

wcfsetup/install/files/lib/system/form/option/CheckboxesFormOption.class.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public function getId(): string
3030
#[\Override]
3131
public function getFormField(string $id, array $configuration = []): AbstractFormField
3232
{
33-
$formField = MultipleSelectionFormField::create($id);
33+
$formField = MultipleSelectionFormField::create($id)
34+
->ignoreInvalidValues();
3435
$this->setSelectOptions($formField, $configuration);
3536

3637
return $formField;

wcfsetup/install/files/lib/system/form/option/SelectFormOption.class.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public function getId(): string
3030
#[\Override]
3131
public function getFormField(string $id, array $configuration = []): AbstractFormField
3232
{
33-
$formField = SelectFormField::create($id);
33+
$formField = SelectFormField::create($id)
34+
->ignoreInvalidValues();
3435
$this->setSelectOptions($formField, $configuration);
3536

3637
return $formField;

0 commit comments

Comments
 (0)