-
Notifications
You must be signed in to change notification settings - Fork 148
Expand file tree
/
Copy pathAbstractFormOptionAddForm.class.php
More file actions
125 lines (106 loc) · 4.21 KB
/
AbstractFormOptionAddForm.class.php
File metadata and controls
125 lines (106 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
namespace wcf\acp\form;
use wcf\data\DatabaseObject;
use wcf\data\IStorableObject;
use wcf\form\AbstractFormBuilderForm;
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
use wcf\system\form\builder\field\dependency\ValueFormFieldDependency;
use wcf\system\form\builder\field\IFormField;
use wcf\system\form\builder\field\SelectFormField;
use wcf\system\form\builder\IFormDocument;
use wcf\system\form\option\FormOptionHandler;
use wcf\system\form\option\SharedConfigurationFormFields;
/**
* Default implementation for a form that adds custom options based on the form option system.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*
* @template TIStorableObject of IStorableObject|null
* @extends AbstractFormBuilderForm<TIStorableObject>
*/
abstract class AbstractFormOptionAddForm extends AbstractFormBuilderForm
{
#[\Override]
public function finalizeForm()
{
parent::finalizeForm();
$this->form->getDataHandler()->addProcessor(
new CustomFormDataProcessor(
'saveOptionProcessor',
function (IFormDocument $document, array $parameters) {
$configuration = [];
foreach ($this->getConfigurationFormFieldIds() as $parameter) {
if (!empty($parameters['data'][$parameter])) {
$configuration[$parameter] = $parameters['data'][$parameter];
}
if (\array_key_exists($parameter, $parameters['data'])) {
unset($parameters['data'][$parameter]);
}
}
$parameters['data']['configuration'] = \json_encode($configuration, \JSON_THROW_ON_ERROR);
return $parameters;
},
function (IFormDocument $document, array $data, IStorableObject $object) {
\assert($object instanceof DatabaseObject);
// @phpstan-ignore property.notFound
if ($object->configuration) {
$data = \array_merge($data, \json_decode($object->configuration, true, flags: \JSON_THROW_ON_ERROR));
}
return $data;
}
)
);
}
/**
* @return string[]
*/
protected function getConfigurationFormFieldIds(): array
{
$ids = [];
foreach (FormOptionHandler::getInstance()->getOptions() as $option) {
foreach ($option->getConfigurationFormFields() as $formFieldId) {
$ids[] = $formFieldId;
}
}
return \array_unique($ids);
}
/**
* @return list<IFormField>
*/
protected function getSharedConfigurationFormFields(): array
{
$sharedConfigurationFormFields = new SharedConfigurationFormFields();
$matrix = [];
foreach (FormOptionHandler::getInstance()->getOptions() as $option) {
foreach ($option->getConfigurationFormFields() as $formFieldId) {
if (!isset($matrix[$formFieldId])) {
$matrix[$formFieldId] = [];
}
$matrix[$formFieldId][] = $option->getId();
}
}
$formFields = [];
foreach ($matrix as $formFieldId => $dependencies) {
$formField = $sharedConfigurationFormFields->getFormField($formFieldId);
\assert($formField !== null);
$formField->addDependency(
ValueFormFieldDependency::create($formFieldId . 'OptionTypeDependency')
->fieldId('optionType')
->values($dependencies)
);
$formFields[] = $formField;
}
return $formFields;
}
protected function getOptionTypeFormField(): SelectFormField
{
return SelectFormField::create('optionType')
->label('wcf.form.option.optionType')
->immutable($this->formAction !== 'create')
->options(FormOptionHandler::getInstance()->getSortedOptionTypes())
->required();
}
}