1 | <?php |
||||
2 | |||||
3 | namespace Backend\Modules\FormBuilder\Engine; |
||||
4 | |||||
5 | use Backend\Core\Engine\Form as BackendForm; |
||||
6 | use Backend\Core\Engine\Model as BackendModel; |
||||
7 | use Backend\Core\Engine\TwigTemplate as BackendTemplate; |
||||
8 | |||||
9 | /** |
||||
10 | * Helper class for the form_builder module. |
||||
11 | * |
||||
12 | * Dieter Vanden Eynde <[email protected]> |
||||
13 | */ |
||||
14 | class Helper |
||||
15 | { |
||||
16 | /** |
||||
17 | * Parse a field and return the HTML. |
||||
18 | * |
||||
19 | * @param array $field Field data. |
||||
20 | * |
||||
21 | * @return string |
||||
22 | */ |
||||
23 | public static function parseField(array $field): string |
||||
24 | { |
||||
25 | if (!empty($field)) { |
||||
26 | // init |
||||
27 | $form = new BackendForm('tmp', ''); |
||||
28 | $tpl = ( |
||||
29 | BackendModel::getContainer()->has('template') ? |
||||
30 | BackendModel::getContainer()->get('template') : |
||||
31 | new BackendTemplate() |
||||
32 | ); |
||||
33 | $fieldHTML = ''; |
||||
34 | $fieldName = 'field' . $field['id']; |
||||
35 | $values = (isset($field['settings']['values']) ? $field['settings']['values'] : null); |
||||
36 | $defaultValues = ( |
||||
37 | isset($field['settings']['default_values']) ? |
||||
38 | $field['settings']['default_values'] : |
||||
39 | null |
||||
40 | ); |
||||
41 | $placeholder = (isset($field['settings']['placeholder']) ? $field['settings']['placeholder'] : null); |
||||
42 | |||||
43 | /* |
||||
44 | * Create form and parse to HTML |
||||
45 | */ |
||||
46 | // dropdown |
||||
47 | if ($field['type'] === 'dropdown') { |
||||
48 | // values and labels are the same |
||||
49 | $values = array_combine($values, $values); |
||||
0 ignored issues
–
show
Bug
introduced
by
![]() It seems like
$values can also be of type null ; however, parameter $keys of array_combine() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
50 | |||||
51 | // get index of selected item |
||||
52 | $defaultIndex = array_search($defaultValues, $values, true); |
||||
53 | if ($defaultIndex === false) { |
||||
54 | $defaultIndex = null; |
||||
55 | } |
||||
56 | |||||
57 | // create element |
||||
58 | $ddm = $form->addDropdown($fieldName, $values, $defaultIndex); |
||||
59 | |||||
60 | // empty default element |
||||
61 | $ddm->setDefaultElement(''); |
||||
62 | |||||
63 | // get content |
||||
64 | $fieldHTML = $ddm->parse(); |
||||
65 | } elseif ($field['type'] === 'datetime') { |
||||
66 | // create element |
||||
67 | if ($field['settings']['input_type'] === 'date') { |
||||
68 | // calculate default value |
||||
69 | $amount = $field['settings']['value_amount']; |
||||
70 | $type = $field['settings']['value_type']; |
||||
71 | |||||
72 | if ($type != '') { |
||||
73 | switch ($type) { |
||||
74 | case 'today': |
||||
75 | $defaultValues = date('d/m/Y'); |
||||
76 | break; |
||||
77 | case 'day': |
||||
78 | case 'week': |
||||
79 | case 'month': |
||||
80 | case 'year': |
||||
81 | if ($amount != '') { |
||||
82 | $defaultValues = date('d/m/Y', strtotime('+' . $amount . ' ' . $type)); |
||||
83 | } |
||||
84 | break; |
||||
85 | } |
||||
86 | } |
||||
87 | |||||
88 | $datetime = $form->addText($fieldName, $defaultValues); |
||||
89 | } else { |
||||
90 | $datetime = $form->addTime($fieldName, $defaultValues); |
||||
91 | } |
||||
92 | $datetime->setAttribute('disabled', 'disabled'); |
||||
93 | |||||
94 | // get content |
||||
95 | $fieldHTML = $datetime->parse(); |
||||
96 | } elseif ($field['type'] === 'radiobutton') { |
||||
97 | // create element |
||||
98 | $rbt = $form->addRadiobutton($fieldName, $values, $defaultValues); |
||||
99 | |||||
100 | // get content |
||||
101 | $fieldHTML = $rbt->parse(); |
||||
102 | } elseif ($field['type'] === 'checkbox') { |
||||
103 | // rebuild values |
||||
104 | $newValues = []; |
||||
105 | foreach ((array) $values as $value) { |
||||
106 | $newValues[] = ['label' => $value, 'value' => $value]; |
||||
107 | } |
||||
108 | |||||
109 | // create element |
||||
110 | $chk = $form->addMultiCheckbox($fieldName, $newValues, $defaultValues); |
||||
111 | |||||
112 | // get content |
||||
113 | $fieldHTML = $chk->parse(); |
||||
114 | } elseif ($field['type'] === 'textbox') { |
||||
115 | // create element |
||||
116 | $txt = $form->addText($fieldName, $defaultValues); |
||||
117 | $txt->setAttribute('disabled', 'disabled'); |
||||
118 | $txt->setAttribute('placeholder', $placeholder); |
||||
119 | |||||
120 | // get content |
||||
121 | $fieldHTML = $txt->parse(); |
||||
122 | } elseif ($field['type'] === 'textarea') { |
||||
123 | // create element |
||||
124 | $txt = $form->addTextarea($fieldName, $defaultValues); |
||||
125 | $txt->setAttribute('cols', 30); |
||||
126 | $txt->setAttribute('disabled', 'disabled'); |
||||
127 | $txt->setAttribute('placeholder', $placeholder); |
||||
128 | |||||
129 | // get content |
||||
130 | $fieldHTML = $txt->parse(); |
||||
131 | } elseif ($field['type'] === 'heading') { |
||||
132 | $fieldHTML = '<h3>' . $values . '</h3>'; |
||||
133 | } elseif ($field['type'] === 'paragraph') { |
||||
134 | $fieldHTML = $values; |
||||
135 | } elseif ($field['type'] === 'recaptcha') { |
||||
136 | $fieldHTML = '<p>reCAPTCHA</p>'; |
||||
137 | } |
||||
138 | |||||
139 | /* |
||||
140 | * Parse the field into the template |
||||
141 | */ |
||||
142 | // init |
||||
143 | $tpl->assign('plaintext', false); |
||||
144 | $tpl->assign('simple', false); |
||||
145 | $tpl->assign('multiple', false); |
||||
146 | $tpl->assign('id', $field['id']); |
||||
147 | $tpl->assign('required', isset($field['validations']['required'])); |
||||
148 | |||||
149 | // plaintext items |
||||
150 | if (in_array($field['type'], ['heading', 'paragraph', 'recaptcha'])) { |
||||
151 | // assign |
||||
152 | $tpl->assign('content', $fieldHTML); |
||||
153 | $tpl->assign('plaintext', true); |
||||
154 | } elseif (in_array($field['type'], ['checkbox', 'radiobutton'])) { |
||||
155 | // name (prefixed by type) |
||||
156 | $name = ($field['type'] === 'checkbox') ? |
||||
157 | 'chk' . \SpoonFilter::ucfirst($fieldName) : |
||||
158 | 'rbt' . \SpoonFilter::ucfirst($fieldName) |
||||
159 | ; |
||||
160 | |||||
161 | // rebuild so the html is stored in a general name (and not rbtName) |
||||
162 | foreach ($fieldHTML as &$item) { |
||||
163 | $item['field'] = $item[$name]; |
||||
164 | } |
||||
165 | |||||
166 | // show multiple |
||||
167 | $tpl->assign('label', $field['settings']['label']); |
||||
168 | $tpl->assign('items', $fieldHTML); |
||||
169 | $tpl->assign('multiple', true); |
||||
170 | } else { |
||||
171 | // assign |
||||
172 | $tpl->assign('label', $field['settings']['label']); |
||||
173 | $tpl->assign('field', $fieldHTML); |
||||
174 | $tpl->assign('simple', true); |
||||
175 | } |
||||
176 | |||||
177 | return $tpl->getContent(BACKEND_MODULES_PATH . '/FormBuilder/Layout/Templates/Field.html.twig'); |
||||
178 | } |
||||
179 | |||||
180 | // empty field so return empty string |
||||
181 | return ''; |
||||
182 | } |
||||
183 | } |
||||
184 |