‪TYPO3CMS  ‪main
SelectMultipleSideBySideElement.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
20 use TYPO3\CMS\Core\Imaging\IconSize;
26 
33 {
39  protected ‪$defaultFieldInformation = [
40  'tcaDescription' => [
41  'renderType' => 'tcaDescription',
42  ],
43  ];
44 
50  protected ‪$defaultFieldControl = [
51  'editPopup' => [
52  'renderType' => 'editPopup',
53  'disabled' => true,
54  ],
55  'addRecord' => [
56  'renderType' => 'addRecord',
57  'disabled' => true,
58  ],
59  'listModule' => [
60  'renderType' => 'listModule',
61  'disabled' => true,
62  'after' => [ 'addRecord' ],
63  ],
64  ];
65 
71  protected ‪$defaultFieldWizard = [
72  'localizationStateSelector' => [
73  'renderType' => 'localizationStateSelector',
74  ],
75  'otherLanguageContent' => [
76  'renderType' => 'otherLanguageContent',
77  'after' => [
78  'localizationStateSelector',
79  ],
80  ],
81  'defaultLanguageDifferences' => [
82  'renderType' => 'defaultLanguageDifferences',
83  'after' => [
84  'otherLanguageContent',
85  ],
86  ],
87  ];
88 
89  public function ‪__construct(
90  private readonly ‪IconFactory $iconFactory,
91  ) {}
92 
98  protected function ‪renderFieldControl(): array
99  {
100  $alternativeResult = [
101  'additionalHiddenFields' => [],
102  'additionalInlineLanguageLabelFiles' => [],
103  'stylesheetFiles' => [],
104  'javaScriptModules' => [],
105  'inlineData' => [],
106  'html' => '',
107  ];
108  $options = ‪$this->data;
109  $fieldControl = ‪$this->defaultFieldControl;
110  $fieldControlFromTca = $options['parameterArray']['fieldConf']['config']['fieldControl'] ?? [];
111  ArrayUtility::mergeRecursiveWithOverrule($fieldControl, $fieldControlFromTca);
112  $options['renderType'] = 'fieldControl';
113  if (isset($fieldControl['editPopup'])) {
114  $editPopupControl = $fieldControl['editPopup'];
115  unset($fieldControl['editPopup']);
116  $alternativeOptions = $options;
117  $alternativeOptions['renderData']['fieldControl'] = ['editPopup' => $editPopupControl];
118  $alternativeResult = $this->nodeFactory->create($alternativeOptions)->render();
119  }
120  $options['renderData']['fieldControl'] = $fieldControl;
121  return [$this->nodeFactory->create($options)->render(), $alternativeResult];
122  }
123 
129  public function ‪render(): array
130  {
131  $parameterArray = $this->data['parameterArray'];
132  $config = $parameterArray['fieldConf']['config'];
133 
134  if ($config['readOnly'] ?? false) {
135  // Early return for the relatively simple read only case
136  return $this->‪renderReadOnly();
137  }
138 
139  $filterTextfield = [];
140  $languageService = $this->‪getLanguageService();
141  $resultArray = $this->‪initializeResultArray();
142  $elementName = $parameterArray['itemFormElName'];
143 
144  $possibleItems = $config['items'];
145  $selectedItems = $parameterArray['itemFormElValue'] ?: [];
146  $maxItems = $config['maxitems'];
147 
148  $size = (int)($config['size'] ?? 2);
149  $autoSizeMax = (int)($config['autoSizeMax'] ?? 0);
150  if ($autoSizeMax > 0) {
151  $size = ‪MathUtility::forceIntegerInRange($size, 1);
152  $size = ‪MathUtility::forceIntegerInRange(count($selectedItems) + 1, $size, $autoSizeMax);
153  }
154 
155  $itemCanBeSelectedMoreThanOnce = !empty($config['multiple']);
156 
157  $listOfSelectedValues = [];
158  $selectedItemsHtml = [];
159  foreach ($selectedItems as $itemValue) {
160  foreach ($possibleItems as $possibleItem) {
161  if ($possibleItem['value'] == $itemValue) {
162  $title = $possibleItem['label'];
163  $listOfSelectedValues[] = $itemValue;
164  $selectedItemsHtml[] = '<option value="' . htmlspecialchars((string)$itemValue) . '" title="' . htmlspecialchars((string)$title) . '">' . htmlspecialchars($this->‪appendValueToLabelInDebugMode($title, $itemValue)) . '</option>';
165  break;
166  }
167  }
168  }
169 
170  $selectableItemCounter = 0;
171  $selectableItemGroupCounter = 0;
172  $selectableItemGroups = [];
173  $selectableItemsHtml = [];
174 
175  // Initialize groups
176  foreach ($possibleItems as $possibleItem) {
177  $disableAttributes = [];
178  if (!$itemCanBeSelectedMoreThanOnce && in_array((string)$possibleItem['value'], $selectedItems, true)) {
179  $disableAttributes = [
180  'disabled' => 'disabled',
181  'class' => 'hidden',
182  ];
183  }
184  if ($possibleItem['value'] === '--div--') {
185  if ($selectableItemCounter !== 0) {
186  $selectableItemGroupCounter++;
187  }
188  $selectableItemGroups[$selectableItemGroupCounter]['header']['title'] = $possibleItem['label'];
189  } else {
190  $selectableItemGroups[$selectableItemGroupCounter]['items'][] = [
191  'label' => $this->‪appendValueToLabelInDebugMode($possibleItem['label'], $possibleItem['value']),
192  'attributes' => array_merge(['title' => $possibleItem['label'], 'value' => $possibleItem['value']], $disableAttributes),
193  ];
194  // In case the item is not disabled, enable the group (if any)
195  if ($disableAttributes === [] && isset($selectableItemGroups[$selectableItemGroupCounter]['header'])) {
196  $selectableItemGroups[$selectableItemGroupCounter]['header']['disabled'] = false;
197  }
198  $selectableItemCounter++;
199  }
200  }
201 
202  // Process groups
203  foreach ($selectableItemGroups as $selectableItemGroup) {
204  if (!is_array($selectableItemGroup['items'] ?? false) || $selectableItemGroup['items'] === []) {
205  continue;
206  }
207 
208  $optionGroup = isset($selectableItemGroup['header']);
209  if ($optionGroup) {
210  $selectableItemsHtml[] = '<optgroup label="' . htmlspecialchars($selectableItemGroup['header']['title']) . '"' . (($selectableItemGroup['header']['disabled'] ?? true) ? 'class="hidden" disabled="disabled"' : '') . '>';
211  }
212 
213  foreach ($selectableItemGroup['items'] as $item) {
214  $selectableItemsHtml[] = '
215  <option ' . GeneralUtility::implodeAttributes($item['attributes'], true, true) . '>
216  ' . htmlspecialchars($item['label']) . '
217  </option>';
218  }
219 
220  if ($optionGroup) {
221  $selectableItemsHtml[] = '</optgroup>';
222  }
223  }
224 
225  // Html stuff for filter and select filter on top of right side of multi select boxes
226  $filterTextfield[] = '<span class="input-group input-group-sm">';
227  $filterTextfield[] = '<span class="input-group-text">';
228  $filterTextfield[] = $this->iconFactory->getIcon('actions-filter', IconSize::SMALL)->render();
229  $filterTextfield[] = '</span>';
230  $filterTextfield[] = '<input class="t3js-formengine-multiselect-filter-textfield form-control" value="">';
231  $filterTextfield[] = '</span>';
232 
233  $filterDropDownOptions = [];
234  if (isset($config['multiSelectFilterItems']) && is_array($config['multiSelectFilterItems']) && count($config['multiSelectFilterItems']) > 1) {
235  foreach ($config['multiSelectFilterItems'] as $optionElement) {
236  $value = $languageService->sL($optionElement[0]);
237  $label = $value;
238  if (isset($optionElement[1]) && trim($optionElement[1]) !== '') {
239  $label = $languageService->sL($optionElement[1]);
240  }
241  $filterDropDownOptions[] = '<option value="' . htmlspecialchars($value) . '">' . htmlspecialchars($label) . '</option>';
242  }
243  }
244  $filterHtml = [];
245  $filterHtml[] = '<div class="form-multigroup-item-wizard">';
246  if (!empty($filterDropDownOptions)) {
247  $filterHtml[] = '<div class="t3js-formengine-multiselect-filter-container form-multigroup-wrap">';
248  $filterHtml[] = '<div class="form-multigroup-item form-multigroup-element">';
249  $filterHtml[] = '<select class="form-select form-select-sm t3js-formengine-multiselect-filter-dropdown">';
250  $filterHtml[] = implode(LF, $filterDropDownOptions);
251  $filterHtml[] = '</select>';
252  $filterHtml[] = '</div>';
253  $filterHtml[] = '<div class="form-multigroup-item form-multigroup-element">';
254  $filterHtml[] = implode(LF, $filterTextfield);
255  $filterHtml[] = '</div>';
256  $filterHtml[] = '</div>';
257  } else {
258  $filterHtml[] = implode(LF, $filterTextfield);
259  }
260  $filterHtml[] = '</div>';
261 
262  $multipleAttribute = '';
263  if ($maxItems !== 1 && $size !== 1) {
264  $multipleAttribute = ' multiple="multiple"';
265  }
266 
267  $fieldInformationResult = $this->‪renderFieldInformation();
268  $fieldInformationHtml = $fieldInformationResult['html'];
269  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
270 
271  [$fieldControlResult, $alternativeControlResult] = $this->‪renderFieldControl();
272  $fieldControlHtml = $fieldControlResult['html'];
273  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldControlResult, false);
274  $alternativeFieldControlHtml = $alternativeControlResult['html'];
275  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $alternativeControlResult, false);
276 
277  $fieldWizardResult = $this->‪renderFieldWizard();
278  $fieldWizardHtml = $fieldWizardResult['html'];
279  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldWizardResult, false);
280 
281  $selectedOptionsFieldId = ‪StringUtility::getUniqueId('tceforms-multiselect-');
282  $availableOptionsFieldId = ‪StringUtility::getUniqueId('tceforms-multiselect-');
283 
284  $html = [];
285  $html[] = $this->‪renderLabel($selectedOptionsFieldId);
286  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
287  $html[] = $fieldInformationHtml;
288  $html[] = '<div class="form-wizards-wrap">';
289  $html[] = '<div class="form-wizards-element">';
290  $html[] = '<input type="hidden" data-formengine-input-name="' . htmlspecialchars($elementName) . '" value="' . (int)$itemCanBeSelectedMoreThanOnce . '" />';
291  $html[] = '<div class="form-multigroup-wrap t3js-formengine-field-group">';
292  $html[] = '<div class="form-multigroup-item form-multigroup-element">';
293  $html[] = '<label>';
294  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selected'));
295  $html[] = '</label>';
296  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
297  $html[] = '<div class="form-wizards-element">';
298  $html[] = '<select';
299  $html[] = ' id="' . $selectedOptionsFieldId . '"';
300  $html[] = ' size="' . $size . '"';
301  $html[] = ' class="form-select"';
302  $html[] = $multipleAttribute;
303  $html[] = ' data-formengine-input-name="' . htmlspecialchars($elementName) . '"';
304  $html[] = '>';
305  $html[] = implode(LF, $selectedItemsHtml);
306  $html[] = '</select>';
307  $html[] = '</div>';
308  $html[] = '<div class="form-wizards-items-aside form-wizards-items-aside--move">';
309  $html[] = '<div class="btn-group-vertical">';
310  if ($maxItems > 1 && $size >= 5) {
311  $html[] = '<a href="#"';
312  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-top"';
313  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
314  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_to_top')) . '"';
315  $html[] = '>';
316  $html[] = $this->iconFactory->getIcon('actions-move-to-top', IconSize::SMALL)->render();
317  $html[] = '</a>';
318  }
319  if ($maxItems > 1) {
320  $html[] = '<a href="#"';
321  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-up"';
322  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
323  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_up')) . '"';
324  $html[] = '>';
325  $html[] = $this->iconFactory->getIcon('actions-move-up', IconSize::SMALL)->render();
326  $html[] = '</a>';
327  $html[] = '<a href="#"';
328  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-down"';
329  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
330  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_down')) . '"';
331  $html[] = '>';
332  $html[] = $this->iconFactory->getIcon('actions-move-down', IconSize::SMALL)->render();
333  $html[] = '</a>';
334  }
335  if ($maxItems > 1 && $size >= 5) {
336  $html[] = '<a href="#"';
337  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-bottom"';
338  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
339  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_to_bottom')) . '"';
340  $html[] = '>';
341  $html[] = $this->iconFactory->getIcon('actions-move-to-bottom', IconSize::SMALL)->render();
342  $html[] = '</a>';
343  }
344  $html[] = $alternativeFieldControlHtml;
345  $html[] = '<a href="#"';
346  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-removeoption"';
347  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
348  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.remove_selected')) . '"';
349  $html[] = '>';
350  $html[] = $this->iconFactory->getIcon('actions-selection-delete', IconSize::SMALL)->render();
351  $html[] = '</a>';
352  $html[] = '</div>';
353  $html[] = '</div>';
354  $html[] = '</div>';
355  $html[] = '</div>';
356  $html[] = '<div class="form-multigroup-item form-multigroup-element">';
357  $html[] = '<label>';
358  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.items'));
359  $html[] = '</label>';
360  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
361  $html[] = '<div class="form-wizards-element">';
362  $html[] = implode(LF, $filterHtml);
363  $selectElementAttrs = array_merge(
364  [
365  'size' => $size,
366  'id' => $availableOptionsFieldId,
367  'class' => 'form-select t3js-formengine-select-itemstoselect',
368  'data-relatedfieldname' => $elementName,
369  'data-exclusivevalues' => $config['exclusiveKeys'] ?? '',
370  'data-formengine-validation-rules' => $this->‪getValidationDataAsJsonString($config),
371  ],
372  $this->getOnFieldChangeAttrs('change', $parameterArray['fieldChangeFunc'] ?? [])
373  );
374  $html[] = '<select ' . GeneralUtility::implodeAttributes($selectElementAttrs, true) . '>';
375  $html[] = implode(LF, $selectableItemsHtml);
376  $html[] = '</select>';
377  $html[] = '</div>';
378  if (!empty($fieldControlHtml)) {
379  $html[] = '<div class="form-wizards-items-aside form-wizards-items-aside--field-control">';
380  $html[] = '<div class="btn-group-vertical">';
381  $html[] = $fieldControlHtml;
382  $html[] = '</div>';
383  $html[] = '</div>';
384  }
385  $html[] = '</div>';
386  $html[] = '</div>';
387  $html[] = '</div>';
388  $html[] = '<input type="hidden" name="' . htmlspecialchars($elementName) . '" value="' . htmlspecialchars(implode(',', $listOfSelectedValues)) . '" />';
389  $html[] = '</div>';
390  if (!empty($fieldWizardHtml)) {
391  $html[] = '<div class="form-wizards-items-bottom">';
392  $html[] = $fieldWizardHtml;
393  $html[] = '</div>';
394  }
395  $html[] = '</div>';
396  $html[] = '</div>';
397 
398  $resultArray['javaScriptModules'][] = ‪JavaScriptModuleInstruction::create(
399  '@typo3/backend/form-engine/element/select-multiple-side-by-side-element.js'
400  )->instance($selectedOptionsFieldId, $availableOptionsFieldId);
401 
402  $resultArray['html'] = implode(LF, $html);
403  return $resultArray;
404  }
405 
412  protected function ‪renderReadOnly()
413  {
414  $languageService = $this->‪getLanguageService();
415  $resultArray = $this->‪initializeResultArray();
416 
417  $parameterArray = $this->data['parameterArray'];
418  $config = $parameterArray['fieldConf']['config'];
419  $fieldName = $parameterArray['itemFormElName'];
420 
421  $possibleItems = $config['items'];
422  $selectedItems = $parameterArray['itemFormElValue'] ?: [];
423  if (!is_array($selectedItems)) {
424  $selectedItems = ‪GeneralUtility::trimExplode(',', $selectedItems, true);
425  }
426  $size = (int)($config['size'] ?? 2);
427  $autoSizeMax = (int)($config['autoSizeMax'] ?? 0);
428  if ($autoSizeMax > 0) {
429  $size = ‪MathUtility::forceIntegerInRange($size, 1);
430  $size = ‪MathUtility::forceIntegerInRange(count($selectedItems) + 1, $size, $autoSizeMax);
431  }
432 
433  $multiple = '';
434  if ($size !== 1) {
435  $multiple = ' multiple="multiple"';
436  }
437 
438  $listOfSelectedValues = [];
439  $optionsHtml = [];
440  foreach ($selectedItems as $itemValue) {
441  foreach ($possibleItems as $possibleItem) {
442  if ($possibleItem['value'] == $itemValue) {
443  $title = $possibleItem['label'];
444  $listOfSelectedValues[] = $itemValue;
445  $optionsHtml[] = '<option value="' . htmlspecialchars($itemValue) . '" title="' . htmlspecialchars($title) . '">' . htmlspecialchars($title) . '</option>';
446  break;
447  }
448  }
449  }
450 
451  $fieldInformationResult = $this->‪renderFieldInformation();
452  $fieldInformationHtml = $fieldInformationResult['html'];
453  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
454 
455  $selectId = ‪StringUtility::getUniqueId('tceforms-multiselect-');
456 
457  $html = [];
458  $html[] = $this->‪renderLabel($selectId);
459  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
460  $html[] = $fieldInformationHtml;
461  $html[] = '<div class="form-wizards-wrap">';
462  $html[] = '<div class="form-wizards-element">';
463  $html[] = '<label>';
464  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selected'));
465  $html[] = '</label>';
466  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
467  $html[] = '<div class="form-wizards-element">';
468  $html[] = '<select';
469  $html[] = ' id="' . $selectId . '"';
470  $html[] = ' size="' . $size . '"';
471  $html[] = ' class="form-select"';
472  $html[] = $multiple;
473  $html[] = ' data-formengine-input-name="' . htmlspecialchars($fieldName) . '"';
474  $html[] = ' disabled="disabled">';
475  $html[] = '/>';
476  $html[] = implode(LF, $optionsHtml);
477  $html[] = '</select>';
478  $html[] = '</div>';
479  $html[] = '</div>';
480  $html[] = '<input type="hidden" name="' . htmlspecialchars($fieldName) . '" value="' . htmlspecialchars(implode(',', $listOfSelectedValues)) . '" />';
481  $html[] = '</div>';
482  $html[] = '</div>';
483  $html[] = '</div>';
484 
485  $resultArray['html'] = implode(LF, $html);
486  return $resultArray;
487  }
488 
490  {
491  return ‪$GLOBALS['BE_USER'];
492  }
493 }
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldInformation
‪array renderFieldInformation()
Definition: AbstractFormElement.php:73
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\getBackendUserAuthentication
‪getBackendUserAuthentication()
Definition: SelectMultipleSideBySideElement.php:486
‪TYPO3\CMS\Backend\Form\AbstractNode\mergeChildReturnIntoExistingResult
‪array mergeChildReturnIntoExistingResult(array $existing, array $childReturn, bool $mergeHtml=true)
Definition: AbstractNode.php:104
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement
Definition: SelectMultipleSideBySideElement.php:33
‪TYPO3\CMS\Core\Page\JavaScriptModuleInstruction\create
‪static create(string $name, string $exportName=null)
Definition: JavaScriptModuleInstruction.php:47
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement
Definition: AbstractFormElement.php:37
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldWizard
‪array $defaultFieldWizard
Definition: SelectMultipleSideBySideElement.php:68
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Core\Page\JavaScriptModuleInstruction
Definition: JavaScriptModuleInstruction.php:23
‪TYPO3\CMS\Backend\Form\Element
Definition: AbstractFormElement.php:16
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\renderReadOnly
‪array renderReadOnly()
Definition: SelectMultipleSideBySideElement.php:409
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\getLanguageService
‪getLanguageService()
Definition: AbstractFormElement.php:456
‪TYPO3\CMS\Backend\Form\AbstractNode\$data
‪array $data
Definition: AbstractNode.php:35
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\__construct
‪__construct(private readonly IconFactory $iconFactory,)
Definition: SelectMultipleSideBySideElement.php:86
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:61
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldInformation
‪array $defaultFieldInformation
Definition: SelectMultipleSideBySideElement.php:38
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\appendValueToLabelInDebugMode
‪appendValueToLabelInDebugMode(string|int $label, string|int $value)
Definition: AbstractFormElement.php:447
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:26
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Backend\Form\AbstractNode\getValidationDataAsJsonString
‪getValidationDataAsJsonString(array $config)
Definition: AbstractNode.php:133
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderLabel
‪renderLabel(string $for)
Definition: AbstractFormElement.php:119
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\renderFieldControl
‪array renderFieldControl()
Definition: SelectMultipleSideBySideElement.php:95
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldControl
‪array $defaultFieldControl
Definition: SelectMultipleSideBySideElement.php:48
‪TYPO3\CMS\Core\Utility\MathUtility\forceIntegerInRange
‪static int forceIntegerInRange(mixed $theInt, int $min, int $max=2000000000, int $defaultValue=0)
Definition: MathUtility.php:34
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldWizard
‪array renderFieldWizard()
Definition: AbstractFormElement.php:105
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:817
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\render
‪array render()
Definition: SelectMultipleSideBySideElement.php:126
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Backend\Form\AbstractNode\initializeResultArray
‪initializeResultArray()
Definition: AbstractNode.php:77