‪TYPO3CMS  10.4
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 
25 
32 {
38  protected ‪$defaultFieldInformation = [
39  'tcaDescription' => [
40  'renderType' => 'tcaDescription',
41  ],
42  ];
43 
49  protected ‪$defaultFieldControl = [
50  'editPopup' => [
51  'renderType' => 'editPopup',
52  'disabled' => true,
53  ],
54  'addRecord' => [
55  'renderType' => 'addRecord',
56  'disabled' => true,
57  ],
58  'listModule' => [
59  'renderType' => 'listModule',
60  'disabled' => true,
61  'after' => [ 'addRecord' ],
62  ],
63  ];
64 
70  protected ‪$defaultFieldWizard = [
71  'localizationStateSelector' => [
72  'renderType' => 'localizationStateSelector',
73  ],
74  'otherLanguageContent' => [
75  'renderType' => 'otherLanguageContent',
76  'after' => [
77  'localizationStateSelector'
78  ],
79  ],
80  'defaultLanguageDifferences' => [
81  'renderType' => 'defaultLanguageDifferences',
82  'after' => [
83  'otherLanguageContent',
84  ],
85  ],
86  ];
87 
93  protected function ‪renderFieldControl(): array
94  {
95  $alternativeResult = [
96  'additionalJavaScriptPost' => [],
97  'additionalHiddenFields' => [],
98  'additionalInlineLanguageLabelFiles' => [],
99  'stylesheetFiles' => [],
100  'requireJsModules' => [],
101  'inlineData' => [],
102  'html' => '',
103  ];
104  $options = ‪$this->data;
105  $fieldControl = ‪$this->defaultFieldControl;
106  $fieldControlFromTca = $options['parameterArray']['fieldConf']['config']['fieldControl'] ?? [];
107  ‪ArrayUtility::mergeRecursiveWithOverrule($fieldControl, $fieldControlFromTca);
108  $options['renderType'] = 'fieldControl';
109  if (isset($fieldControl['editPopup'])) {
110  $editPopupControl = $fieldControl['editPopup'];
111  unset($fieldControl['editPopup']);
112  $alternativeOptions = $options;
113  $alternativeOptions['renderData']['fieldControl'] = ['editPopup' => $editPopupControl];
114  $alternativeResult = $this->nodeFactory->create($alternativeOptions)->render();
115  }
116  $options['renderData']['fieldControl'] = $fieldControl;
117  return [$this->nodeFactory->create($options)->render(), $alternativeResult];
118  }
119 
125  public function ‪render()
126  {
127  $filterTextfield = [];
128  $languageService = $this->‪getLanguageService();
129  $resultArray = $this->‪initializeResultArray();
130 
131  $parameterArray = $this->data['parameterArray'];
132  $config = $parameterArray['fieldConf']['config'];
133  $elementName = $parameterArray['itemFormElName'];
134 
135  if ($config['readOnly']) {
136  // Early return for the relatively simple read only case
137  return $this->‪renderReadOnly();
138  }
139 
140  $possibleItems = $config['items'];
141  $selectedItems = $parameterArray['itemFormElValue'] ?: [];
142  $selectedItemsCount = count($selectedItems);
143 
144  $maxItems = $config['maxitems'];
145  $autoSizeMax = ‪MathUtility::forceIntegerInRange($config['autoSizeMax'], 0);
146  $size = 2;
147  if (isset($config['size'])) {
148  $size = (int)$config['size'];
149  }
150  if ($autoSizeMax >= 1) {
151  $size = ‪MathUtility::forceIntegerInRange($selectedItemsCount + 1, ‪MathUtility::forceIntegerInRange($size, 1), $autoSizeMax);
152  }
153  $itemCanBeSelectedMoreThanOnce = !empty($config['multiple']);
154 
155  $listOfSelectedValues = [];
156  $selectedItemsHtml = [];
157  foreach ($selectedItems as $itemValue) {
158  foreach ($possibleItems as $possibleItem) {
159  if ($possibleItem[1] == $itemValue) {
160  $title = $possibleItem[0];
161  $listOfSelectedValues[] = $itemValue;
162  $selectedItemsHtml[] = '<option value="' . htmlspecialchars((string)$itemValue) . '" title="' . htmlspecialchars((string)$title) . '">' . htmlspecialchars($this->‪appendValueToLabelInDebugMode($title, $itemValue)) . '</option>';
163  break;
164  }
165  }
166  }
167 
168  $selectableItemsHtml = [];
169  foreach ($possibleItems as $possibleItem) {
170  $disabledAttr = '';
171  $classAttr = '';
172  if (!$itemCanBeSelectedMoreThanOnce && in_array((string)$possibleItem[1], $selectedItems, true)) {
173  $disabledAttr = ' disabled="disabled"';
174  $classAttr = ' class="hidden"';
175  }
176  $selectableItemsHtml[] =
177  '<option value="'
178  . htmlspecialchars($possibleItem[1])
179  . '" title="' . htmlspecialchars($possibleItem[0]) . '"'
180  . $classAttr . $disabledAttr
181  . '>'
182  . htmlspecialchars($this->‪appendValueToLabelInDebugMode($possibleItem[0], $possibleItem[1])) .
183  '</option>';
184  }
185 
186  // Html stuff for filter and select filter on top of right side of multi select boxes
187  $filterTextfield[] = '<span class="input-group input-group-sm">';
188  $filterTextfield[] = '<span class="input-group-addon">';
189  $filterTextfield[] = '<span class="fa fa-filter"></span>';
190  $filterTextfield[] = '</span>';
191  $filterTextfield[] = '<input class="t3js-formengine-multiselect-filter-textfield form-control" value="">';
192  $filterTextfield[] = '</span>';
193 
194  $filterDropDownOptions = [];
195  if (isset($config['multiSelectFilterItems']) && is_array($config['multiSelectFilterItems']) && count($config['multiSelectFilterItems']) > 1) {
196  foreach ($config['multiSelectFilterItems'] as $optionElement) {
197  $value = $languageService->sL($optionElement[0]);
198  $label = $value;
199  if (isset($optionElement[1]) && trim($optionElement[1]) !== '') {
200  $label = $languageService->sL($optionElement[1]);
201  }
202  $filterDropDownOptions[] = '<option value="' . htmlspecialchars($value) . '">' . htmlspecialchars($label) . '</option>';
203  }
204  }
205  $filterHtml = [];
206  $filterHtml[] = '<div class="form-multigroup-item-wizard">';
207  if (!empty($filterDropDownOptions)) {
208  $filterHtml[] = '<div class="t3js-formengine-multiselect-filter-container form-multigroup-wrap">';
209  $filterHtml[] = '<div class="form-multigroup-item form-multigroup-element">';
210  $filterHtml[] = '<select class="form-control input-sm t3js-formengine-multiselect-filter-dropdown">';
211  $filterHtml[] = implode(LF, $filterDropDownOptions);
212  $filterHtml[] = '</select>';
213  $filterHtml[] = '</div>';
214  $filterHtml[] = '<div class="form-multigroup-item form-multigroup-element">';
215  $filterHtml[] = implode(LF, $filterTextfield);
216  $filterHtml[] = '</div>';
217  $filterHtml[] = '</div>';
218  } else {
219  $filterHtml[] = implode(LF, $filterTextfield);
220  }
221  $filterHtml[] = '</div>';
222 
223  $classes = [];
224  $classes[] = 'form-control';
225  $classes[] = 'tceforms-multiselect';
226  if ($maxItems === 1) {
227  $classes[] = 'form-select-no-siblings';
228  }
229  $multipleAttribute = '';
230  if ($maxItems !== 1 && $size !== 1) {
231  $multipleAttribute = ' multiple="multiple"';
232  }
233 
234  $fieldInformationResult = $this->‪renderFieldInformation();
235  $fieldInformationHtml = $fieldInformationResult['html'];
236  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
237 
238  [$fieldControlResult, $alternativeControlResult] = $this->‪renderFieldControl();
239  $fieldControlHtml = $fieldControlResult['html'];
240  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldControlResult, false);
241  $alternativeFieldControlHtml = $alternativeControlResult['html'];
242  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $alternativeControlResult, false);
243 
244  $fieldWizardResult = $this->‪renderFieldWizard();
245  $fieldWizardHtml = $fieldWizardResult['html'];
246  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldWizardResult, false);
247 
248  $selectedOptionsFieldId = ‪StringUtility::getUniqueId('tceforms-multiselect-');
249  $availableOptionsFieldId = ‪StringUtility::getUniqueId('tceforms-multiselect-');
250 
251  $html = [];
252  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
253  $html[] = $fieldInformationHtml;
254  $html[] = '<div class="form-wizards-wrap">';
255  $html[] = '<div class="form-wizards-element">';
256  $html[] = '<input type="hidden" data-formengine-input-name="' . htmlspecialchars($elementName) . '" value="' . (int)$itemCanBeSelectedMoreThanOnce . '" />';
257  $html[] = '<div class="form-multigroup-wrap t3js-formengine-field-group">';
258  $html[] = '<div class="form-multigroup-item form-multigroup-element">';
259  $html[] = '<label>';
260  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selected'));
261  $html[] = '</label>';
262  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
263  $html[] = '<div class="form-wizards-element">';
264  $html[] = '<select';
265  $html[] = ' id="' . $selectedOptionsFieldId . '"';
266  $html[] = ' size="' . $size . '"';
267  $html[] = ' class="' . implode(' ', $classes) . '"';
268  $html[] = $multipleAttribute;
269  $html[] = ' data-formengine-input-name="' . htmlspecialchars($elementName) . '"';
270  $html[] = '>';
271  $html[] = implode(LF, $selectedItemsHtml);
272  $html[] = '</select>';
273  $html[] = '</div>';
274  $html[] = '<div class="form-wizards-items-aside">';
275  $html[] = '<div class="btn-group-vertical">';
276  if ($maxItems > 1 && $size >= 5) {
277  $html[] = '<a href="#"';
278  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-top"';
279  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
280  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_to_top')) . '"';
281  $html[] = '>';
282  $html[] = $this->iconFactory->getIcon('actions-move-to-top', ‪Icon::SIZE_SMALL)->render();
283  $html[] = '</a>';
284  }
285  if ($maxItems > 1) {
286  $html[] = '<a href="#"';
287  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-up"';
288  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
289  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_up')) . '"';
290  $html[] = '>';
291  $html[] = $this->iconFactory->getIcon('actions-move-up', ‪Icon::SIZE_SMALL)->render();
292  $html[] = '</a>';
293  $html[] = '<a href="#"';
294  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-down"';
295  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
296  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_down')) . '"';
297  $html[] = '>';
298  $html[] = $this->iconFactory->getIcon('actions-move-down', ‪Icon::SIZE_SMALL)->render();
299  $html[] = '</a>';
300  }
301  if ($maxItems > 1 && $size >= 5) {
302  $html[] = '<a href="#"';
303  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-moveoption-bottom"';
304  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
305  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move_to_bottom')) . '"';
306  $html[] = '>';
307  $html[] = $this->iconFactory->getIcon('actions-move-to-bottom', ‪Icon::SIZE_SMALL)->render();
308  $html[] = '</a>';
309  }
310  $html[] = $alternativeFieldControlHtml;
311  $html[] = '<a href="#"';
312  $html[] = ' class="btn btn-default t3js-btn-option t3js-btn-removeoption"';
313  $html[] = ' data-fieldname="' . htmlspecialchars($elementName) . '"';
314  $html[] = ' title="' . htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.remove_selected')) . '"';
315  $html[] = '>';
316  $html[] = $this->iconFactory->getIcon('actions-selection-delete', ‪Icon::SIZE_SMALL)->render();
317  $html[] = '</a>';
318  $html[] = '</div>';
319  $html[] = '</div>';
320  $html[] = '</div>';
321  $html[] = '</div>';
322  $html[] = '<div class="form-multigroup-item form-multigroup-element">';
323  $html[] = '<label>';
324  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.items'));
325  $html[] = '</label>';
326  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
327  $html[] = '<div class="form-wizards-element">';
328  $html[] = implode(LF, $filterHtml);
329  $html[] = '<select';
330  $html[] = ' data-relatedfieldname="' . htmlspecialchars($elementName) . '"';
331  $html[] = ' data-exclusivevalues="' . htmlspecialchars($config['exclusiveKeys']) . '"';
332  $html[] = ' id="' . $availableOptionsFieldId . '"';
333  $html[] = ' data-formengine-input-name="' . htmlspecialchars($elementName) . '"';
334  $html[] = ' class="form-control t3js-formengine-select-itemstoselect"';
335  $html[] = ' size="' . $size . '"';
336  $html[] = ' onchange="' . htmlspecialchars(implode('', $parameterArray['fieldChangeFunc'])) . '"';
337  $html[] = ' data-formengine-validation-rules="' . htmlspecialchars($this->‪getValidationDataAsJsonString($config)) . '"';
338  $html[] = '>';
339  $html[] = implode(LF, $selectableItemsHtml);
340  $html[] = '</select>';
341  $html[] = '</div>';
342  if (!empty($fieldControlHtml)) {
343  $html[] = '<div class="form-wizards-items-aside">';
344  $html[] = '<div class="btn-group-vertical">';
345  $html[] = $fieldControlHtml;
346  $html[] = '</div>';
347  $html[] = '</div>';
348  }
349  $html[] = '</div>';
350  $html[] = '</div>';
351  $html[] = '</div>';
352  $html[] = '<input type="hidden" name="' . htmlspecialchars($elementName) . '" value="' . htmlspecialchars(implode(',', $listOfSelectedValues)) . '" />';
353  $html[] = '</div>';
354  if (!empty($fieldWizardHtml)) {
355  $html[] = '<div class="form-wizards-items-bottom">';
356  $html[] = $fieldWizardHtml;
357  $html[] = '</div>';
358  }
359  $html[] = '</div>';
360  $html[] = '</div>';
361 
362  $resultArray['requireJsModules'][] = ['TYPO3/CMS/Backend/FormEngine/Element/SelectMultipleSideBySideElement' => '
363  function(SelectMultipleSideBySideElement) {
364  new SelectMultipleSideBySideElement(' . GeneralUtility::quoteJSvalue($selectedOptionsFieldId) . ', ' . GeneralUtility::quoteJSvalue($availableOptionsFieldId) . ');
365  }'
366  ];
367 
368  $resultArray['html'] = implode(LF, $html);
369  return $resultArray;
370  }
371 
378  protected function ‪renderReadOnly()
379  {
380  $languageService = $this->‪getLanguageService();
381  $resultArray = $this->‪initializeResultArray();
382 
383  $parameterArray = $this->data['parameterArray'];
384  $config = $parameterArray['fieldConf']['config'];
385  $fieldName = $parameterArray['itemFormElName'];
386 
387  $possibleItems = $config['items'];
388  $selectedItems = $parameterArray['itemFormElValue'] ?: [];
389  if (!is_array($selectedItems)) {
390  $selectedItems = ‪GeneralUtility::trimExplode(',', $selectedItems, true);
391  }
392  $selectedItemsCount = count($selectedItems);
393 
394  $autoSizeMax = ‪MathUtility::forceIntegerInRange($config['autoSizeMax'], 0);
395  $size = 2;
396  if (isset($config['size'])) {
397  $size = (int)$config['size'];
398  }
399  if ($autoSizeMax >= 1) {
400  $size = ‪MathUtility::forceIntegerInRange($selectedItemsCount + 1, ‪MathUtility::forceIntegerInRange($size, 1), $autoSizeMax);
401  }
402  $multiple = '';
403  if ($size !== 1) {
404  $multiple = ' multiple="multiple"';
405  }
406 
407  $listOfSelectedValues = [];
408  $optionsHtml = [];
409  foreach ($selectedItems as $itemValue) {
410  foreach ($possibleItems as $possibleItem) {
411  if ($possibleItem[1] == $itemValue) {
412  $title = $possibleItem[0];
413  $listOfSelectedValues[] = $itemValue;
414  $optionsHtml[] = '<option value="' . htmlspecialchars($itemValue) . '" title="' . htmlspecialchars($title) . '">' . htmlspecialchars($title) . '</option>';
415  break;
416  }
417  }
418  }
419 
420  $fieldInformationResult = $this->‪renderFieldInformation();
421  $fieldInformationHtml = $fieldInformationResult['html'];
422  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
423 
424  $html = [];
425  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
426  $html[] = $fieldInformationHtml;
427  $html[] = '<div class="form-wizards-wrap">';
428  $html[] = '<div class="form-wizards-element">';
429  $html[] = '<label>';
430  $html[] = htmlspecialchars($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selected'));
431  $html[] = '</label>';
432  $html[] = '<div class="form-wizards-wrap form-wizards-aside">';
433  $html[] = '<div class="form-wizards-element">';
434  $html[] = '<select';
435  $html[] = ' id="' . ‪StringUtility::getUniqueId('tceforms-multiselect-') . '"';
436  $html[] = ' size="' . $size . '"';
437  $html[] = ' class="form-control tceforms-multiselect"';
438  $html[] = $multiple;
439  $html[] = ' data-formengine-input-name="' . htmlspecialchars($fieldName) . '"';
440  $html[] = ' disabled="disabled">';
441  $html[] = '/>';
442  $html[] = implode(LF, $optionsHtml);
443  $html[] = '</select>';
444  $html[] = '</div>';
445  $html[] = '</div>';
446  $html[] = '<input type="hidden" name="' . htmlspecialchars($fieldName) . '" value="' . htmlspecialchars(implode(',', $listOfSelectedValues)) . '" />';
447  $html[] = '</div>';
448  $html[] = '</div>';
449  $html[] = '</div>';
450 
451  $resultArray['html'] = implode(LF, $html);
452  return $resultArray;
453  }
454 
458  protected function ‪getLanguageService()
459  {
460  return ‪$GLOBALS['LANG'];
461  }
462 
466  protected function ‪getBackendUserAuthentication()
467  {
468  return ‪$GLOBALS['BE_USER'];
469  }
470 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldInformation
‪array renderFieldInformation()
Definition: AbstractFormElement.php:72
‪TYPO3\CMS\Backend\Form\AbstractNode\mergeChildReturnIntoExistingResult
‪array mergeChildReturnIntoExistingResult(array $existing, array $childReturn, bool $mergeHtml=true)
Definition: AbstractNode.php:116
‪TYPO3\CMS\Backend\Form\AbstractNode\initializeResultArray
‪array initializeResultArray()
Definition: AbstractNode.php:90
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement
Definition: SelectMultipleSideBySideElement.php:32
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Core\Utility\MathUtility\forceIntegerInRange
‪static int forceIntegerInRange($theInt, $min, $max=2000000000, $defaultValue=0)
Definition: MathUtility.php:32
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement
Definition: AbstractFormElement.php:32
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldWizard
‪array $defaultFieldWizard
Definition: SelectMultipleSideBySideElement.php:67
‪TYPO3\CMS\Core\Utility\ArrayUtility\mergeRecursiveWithOverrule
‪static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
Definition: ArrayUtility.php:654
‪TYPO3\CMS\Backend\Form\Element
Definition: AbstractFormElement.php:16
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\renderReadOnly
‪array renderReadOnly()
Definition: SelectMultipleSideBySideElement.php:375
‪TYPO3\CMS\Backend\Form\AbstractNode\getValidationDataAsJsonString
‪string getValidationDataAsJsonString(array $config)
Definition: AbstractNode.php:151
‪TYPO3\CMS\Backend\Form\AbstractNode\$data
‪array $data
Definition: AbstractNode.php:42
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldInformation
‪array $defaultFieldInformation
Definition: SelectMultipleSideBySideElement.php:37
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\getBackendUserAuthentication
‪BackendUserAuthentication getBackendUserAuthentication()
Definition: SelectMultipleSideBySideElement.php:463
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static string[] trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:1059
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\appendValueToLabelInDebugMode
‪string appendValueToLabelInDebugMode($label, $value)
Definition: AbstractFormElement.php:378
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:92
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:24
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\renderFieldControl
‪array renderFieldControl()
Definition: SelectMultipleSideBySideElement.php:90
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:22
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\$defaultFieldControl
‪array $defaultFieldControl
Definition: SelectMultipleSideBySideElement.php:47
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldWizard
‪array renderFieldWizard()
Definition: AbstractFormElement.php:104
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\render
‪array render()
Definition: SelectMultipleSideBySideElement.php:122
‪TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement\getLanguageService
‪LanguageService getLanguageService()
Definition: SelectMultipleSideBySideElement.php:455