‪TYPO3CMS  10.4
InputLinkElement.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 
32 
39 {
45  protected ‪$defaultFieldInformation = [
46  'tcaDescription' => [
47  'renderType' => 'tcaDescription',
48  ],
49  ];
50 
56  protected ‪$defaultFieldControl = [
57  'linkPopup' => [
58  'renderType' => 'linkPopup',
59  'options' => []
60  ],
61  ];
62 
68  protected ‪$defaultFieldWizard = [
69  'localizationStateSelector' => [
70  'renderType' => 'localizationStateSelector',
71  ],
72  'otherLanguageContent' => [
73  'renderType' => 'otherLanguageContent',
74  'after' => [
75  'localizationStateSelector'
76  ],
77  ],
78  'defaultLanguageDifferences' => [
79  'renderType' => 'defaultLanguageDifferences',
80  'after' => [
81  'otherLanguageContent',
82  ],
83  ],
84  ];
85 
91  public function ‪render()
92  {
93  $languageService = $this->‪getLanguageService();
94 
95  $table = $this->data['tableName'];
96  $fieldName = $this->data['fieldName'];
97  $row = $this->data['databaseRow'];
98  $parameterArray = $this->data['parameterArray'];
99  $resultArray = $this->‪initializeResultArray();
100  $config = $parameterArray['fieldConf']['config'];
101 
102  $itemValue = $parameterArray['itemFormElValue'];
103  $evalList = ‪GeneralUtility::trimExplode(',', $config['eval'], true);
104  $size = ‪MathUtility::forceIntegerInRange($config['size'] ?? $this->defaultInputWidth, $this->minimumInputWidth, $this->maxInputWidth);
105  $width = (int)$this->‪formMaxWidth($size);
106  $nullControlNameEscaped = htmlspecialchars('control[active][' . $table . '][' . $row['uid'] . '][' . $fieldName . ']');
107 
108  $fieldInformationResult = $this->‪renderFieldInformation();
109  $fieldInformationHtml = $fieldInformationResult['html'];
110  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
111 
112  if ($config['readOnly']) {
113  // Early return for read only fields
114  $html = [];
115  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
116  $html[] = $fieldInformationHtml;
117  $html[] = '<div class="form-wizards-wrap">';
118  $html[] = '<div class="form-wizards-element">';
119  $html[] = '<div class="form-control-wrap" style="max-width: ' . $width . 'px">';
120  $html[] = '<input class="form-control" value="' . htmlspecialchars($itemValue) . '" type="text" disabled>';
121  $html[] = '</div>';
122  $html[] = '</div>';
123  $html[] = '</div>';
124  $html[] = '</div>';
125  $resultArray['html'] = implode(LF, $html);
126  return $resultArray;
127  }
128 
129  // @todo: The whole eval handling is a mess and needs refactoring
130  foreach ($evalList as $func) {
131  // @todo: This is ugly: The code should find out on it's own whether an eval definition is a
132  // @todo: keyword like "date", or a class reference. The global registration could be dropped then
133  // Pair hook to the one in \TYPO3\CMS\Core\DataHandling\DataHandler::checkValue_input_Eval()
134  if (isset(‪$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tce']['formevals'][$func])) {
135  if (class_exists($func)) {
136  $evalObj = GeneralUtility::makeInstance($func);
137  if (method_exists($evalObj, 'deevaluateFieldValue')) {
138  $_params = [
139  'value' => $itemValue
140  ];
141  $itemValue = $evalObj->deevaluateFieldValue($_params);
142  }
143  if (method_exists($evalObj, 'returnFieldJS')) {
144  $resultArray['additionalJavaScriptPost'][] = 'TBE_EDITOR.customEvalFunctions[' . GeneralUtility::quoteJSvalue($func) . ']'
145  . ' = function(value) {' . $evalObj->returnFieldJS() . '};';
146  }
147  }
148  }
149  }
150 
151  $fieldId = ‪StringUtility::getUniqueId('formengine-input-');
152 
153  $attributes = [
154  'value' => '',
155  'id' => $fieldId,
156  'class' => implode(' ', [
157  'form-control',
158  't3js-clearable',
159  't3js-form-field-inputlink-input',
160  'hidden',
161  'hasDefaultValue',
162  ]),
163  'data-formengine-validation-rules' => $this->‪getValidationDataAsJsonString($config),
164  'data-formengine-input-params' => (string)json_encode([
165  'field' => $parameterArray['itemFormElName'],
166  'evalList' => implode(',', $evalList)
167  ]),
168  'data-formengine-input-name' => (string)($parameterArray['itemFormElName'] ?? ''),
169  ];
170 
171  $maxLength = $config['max'] ?? 0;
172  if ((int)$maxLength > 0) {
173  $attributes['maxlength'] = (string)(int)$maxLength;
174  }
175  if (!empty($config['placeholder'])) {
176  $attributes['placeholder'] = trim($config['placeholder']);
177  }
178  if (isset($config['autocomplete'])) {
179  $attributes['autocomplete'] = empty($config['autocomplete']) ? 'new-' . $fieldName : 'on';
180  }
181 
182  $valuePickerHtml = [];
183  if (isset($config['valuePicker']['items']) && is_array($config['valuePicker']['items'])) {
184  $mode = $config['valuePicker']['mode'] ?? '';
185  $itemName = $parameterArray['itemFormElName'];
186  $fieldChangeFunc = $parameterArray['fieldChangeFunc'];
187  if ($mode === 'append') {
188  $assignValue = 'document.querySelectorAll(' . GeneralUtility::quoteJSvalue('[data-formengine-input-name="' . $itemName . '"]') . ')[0]'
189  . '.value=\'\'+this.options[this.selectedIndex].value+document.editform[' . GeneralUtility::quoteJSvalue($itemName) . '].value';
190  } elseif ($mode === 'prepend') {
191  $assignValue = 'document.querySelectorAll(' . GeneralUtility::quoteJSvalue('[data-formengine-input-name="' . $itemName . '"]') . ')[0]'
192  . '.value+=\'\'+this.options[this.selectedIndex].value';
193  } else {
194  $assignValue = 'document.querySelectorAll(' . GeneralUtility::quoteJSvalue('[data-formengine-input-name="' . $itemName . '"]') . ')[0]'
195  . '.value=this.options[this.selectedIndex].value';
196  }
197  $valuePickerHtml[] = '<select';
198  $valuePickerHtml[] = ' class="form-control tceforms-select tceforms-wizardselect"';
199  $valuePickerHtml[] = ' onchange="' . htmlspecialchars($assignValue . ';this.blur();this.selectedIndex=0;' . implode('', $fieldChangeFunc)) . '"';
200  $valuePickerHtml[] = '>';
201  $valuePickerHtml[] = '<option></option>';
202  foreach ($config['valuePicker']['items'] as $item) {
203  $valuePickerHtml[] = '<option value="' . htmlspecialchars($item[1]) . '">' . htmlspecialchars($languageService->sL($item[0])) . '</option>';
204  }
205  $valuePickerHtml[] = '</select>';
206  }
207 
208  $fieldWizardResult = $this->‪renderFieldWizard();
209  $fieldWizardHtml = $fieldWizardResult['html'];
210  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldWizardResult, false);
211 
212  $fieldControlResult = $this->‪renderFieldControl();
213  $fieldControlHtml = $fieldControlResult['html'];
214  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldControlResult, false);
215 
216  $linkExplanation = $this->‪getLinkExplanation($itemValue ?: '');
217  $explanation = htmlspecialchars($linkExplanation['text']);
218  $toggleButtonTitle = $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.toggleLinkExplanation');
219 
220  $expansionHtml = [];
221  $expansionHtml[] = '<div class="form-control-wrap" style="max-width: ' . $width . 'px">';
222  $expansionHtml[] = '<div class="form-wizards-wrap">';
223  $expansionHtml[] = '<div class="form-wizards-element">';
224  $expansionHtml[] = '<div class="input-group t3js-form-field-inputlink">';
225  $expansionHtml[] = '<span class="t3js-form-field-inputlink-icon input-group-addon">' . $linkExplanation['icon'] . '</span>';
226  $expansionHtml[] = '<input class="form-control t3js-form-field-inputlink-explanation" data-toggle="tooltip" data-title="' . $explanation . '" value="' . $explanation . '" readonly>';
227  $expansionHtml[] = '<input type="text" ' . GeneralUtility::implodeAttributes($attributes, true) . ' />';
228  $expansionHtml[] = '<span class="input-group-btn">';
229  $expansionHtml[] = '<button class="btn btn-default t3js-form-field-inputlink-explanation-toggle" type="button" title="' . htmlspecialchars($toggleButtonTitle) . '">';
230  $expansionHtml[] = $this->iconFactory->getIcon('actions-version-workspaces-preview-link', ‪Icon::SIZE_SMALL)->render();
231  $expansionHtml[] = '</button>';
232  $expansionHtml[] = '</span>';
233  $expansionHtml[] = '<input type="hidden" name="' . $parameterArray['itemFormElName'] . '" value="' . htmlspecialchars($itemValue) . '" />';
234  $expansionHtml[] = '</div>';
235  $expansionHtml[] = '</div>';
236  if (!empty($valuePickerHtml) || !empty($fieldControlHtml)) {
237  $expansionHtml[] = '<div class="form-wizards-items-aside">';
238  $expansionHtml[] = '<div class="btn-group">';
239  $expansionHtml[] = implode(LF, $valuePickerHtml);
240  $expansionHtml[] = $fieldControlHtml;
241  $expansionHtml[] = '</div>';
242  $expansionHtml[] = '</div>';
243  }
244  $expansionHtml[] = '<div class="form-wizards-items-bottom">';
245  $expansionHtml[] = $linkExplanation['additionalAttributes'];
246  $expansionHtml[] = $fieldWizardHtml;
247  $expansionHtml[] = '</div>';
248  $expansionHtml[] = '</div>';
249  $expansionHtml[] = '</div>';
250  $expansionHtml = implode(LF, $expansionHtml);
251 
252  $fullElement = $expansionHtml;
253  if ($this->‪hasNullCheckboxButNoPlaceholder()) {
254  $checked = $itemValue !== null ? ' checked="checked"' : '';
255  $fullElement = [];
256  $fullElement[] = '<div class="t3-form-field-disable"></div>';
257  $fullElement[] = '<div class="checkbox t3-form-field-eval-null-checkbox">';
258  $fullElement[] = '<label for="' . $nullControlNameEscaped . '">';
259  $fullElement[] = '<input type="hidden" name="' . $nullControlNameEscaped . '" value="0" />';
260  $fullElement[] = '<input type="checkbox" name="' . $nullControlNameEscaped . '" id="' . $nullControlNameEscaped . '" value="1"' . $checked . ' />';
261  $fullElement[] = $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.nullCheckbox');
262  $fullElement[] = '</label>';
263  $fullElement[] = '</div>';
264  $fullElement[] = $expansionHtml;
265  $fullElement = implode(LF, $fullElement);
266  } elseif ($this->‪hasNullCheckboxWithPlaceholder()) {
267  $checked = $itemValue !== null ? ' checked="checked"' : '';
268  $placeholder = $shortenedPlaceholder = $config['placeholder'] ?? '';
269  $disabled = '';
270  $fallbackValue = 0;
271  if (strlen($placeholder) > 0) {
272  $shortenedPlaceholder = GeneralUtility::fixed_lgd_cs($placeholder, 20);
273  if ($placeholder !== $shortenedPlaceholder) {
274  $overrideLabel = sprintf(
275  $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
276  '<span title="' . htmlspecialchars($placeholder) . '">' . htmlspecialchars($shortenedPlaceholder) . '</span>'
277  );
278  } else {
279  $overrideLabel = sprintf(
280  $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
281  htmlspecialchars($placeholder)
282  );
283  }
284  } else {
285  $overrideLabel = $languageService->sL(
286  'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override_not_available'
287  );
288  }
289  $fullElement = [];
290  $fullElement[] = '<div class="checkbox t3js-form-field-eval-null-placeholder-checkbox">';
291  $fullElement[] = '<label for="' . $nullControlNameEscaped . '">';
292  $fullElement[] = '<input type="hidden" name="' . $nullControlNameEscaped . '" value="' . $fallbackValue . '" />';
293  $fullElement[] = '<input type="checkbox" name="' . $nullControlNameEscaped . '" id="' . $nullControlNameEscaped . '" value="1"' . $checked . $disabled . ' />';
294  $fullElement[] = $overrideLabel;
295  $fullElement[] = '</label>';
296  $fullElement[] = '</div>';
297  $fullElement[] = '<div class="t3js-formengine-placeholder-placeholder">';
298  $fullElement[] = '<div class="form-control-wrap" style="max-width:' . $width . 'px">';
299  $fullElement[] = '<input type="text" class="form-control" disabled="disabled" value="' . htmlspecialchars($shortenedPlaceholder) . '" />';
300  $fullElement[] = '</div>';
301  $fullElement[] = '</div>';
302  $fullElement[] = '<div class="t3js-formengine-placeholder-formfield">';
303  $fullElement[] = $expansionHtml;
304  $fullElement[] = '</div>';
305  $fullElement = implode(LF, $fullElement);
306  }
307 
308  $resultArray['requireJsModules'][] = ['TYPO3/CMS/Backend/FormEngine/Element/InputLinkElement' => '
309  function(InputLinkElement) {
310  new InputLinkElement(' . GeneralUtility::quoteJSvalue($fieldId) . ');
311  }'
312  ];
313  $resultArray['html'] = '<div class="formengine-field-item t3js-formengine-field-item">' . $fieldInformationHtml . $fullElement . '</div>';
314  return $resultArray;
315  }
316 
321  protected function ‪getLinkExplanation(string $itemValue): array
322  {
323  if (empty($itemValue)) {
324  return [];
325  }
326  ‪$data = ['text' => '', 'icon' => ''];
327  $typolinkService = GeneralUtility::makeInstance(TypoLinkCodecService::class);
328  $linkParts = $typolinkService->decode($itemValue);
329  $linkService = GeneralUtility::makeInstance(LinkService::class);
330 
331  try {
332  $linkData = $linkService->resolve($linkParts['url']);
334  return ‪$data;
335  }
336 
337  // Resolving the TypoLink parts (class, title, params)
338  $additionalAttributes = [];
339  foreach ($linkParts as $key => $value) {
340  if ($key === 'url') {
341  continue;
342  }
343  if ($value) {
344  switch ($key) {
345  case 'class':
346  $label = $this->‪getLanguageService()->‪sL('LLL:EXT:recordlist/Resources/Private/Language/locallang_browse_links.xlf:class');
347  break;
348  case 'title':
349  $label = $this->‪getLanguageService()->‪sL('LLL:EXT:recordlist/Resources/Private/Language/locallang_browse_links.xlf:title');
350  break;
351  case 'additionalParams':
352  $label = $this->‪getLanguageService()->‪sL('LLL:EXT:recordlist/Resources/Private/Language/locallang_browse_links.xlf:params');
353  break;
354  default:
355  $label = (string)$key;
356  }
357 
358  $additionalAttributes[] = '<span><strong>' . htmlspecialchars($label) . ': </strong> ' . htmlspecialchars($value) . '</span>';
359  }
360  }
361 
362  // Resolve the actual link
363  switch ($linkData['type']) {
365  $pageRecord = ‪BackendUtility::readPageAccess($linkData['pageuid'], '1=1');
366  // Is this a real page
367  if ($pageRecord['uid']) {
368  ‪$data = [
369  'text' => $pageRecord['_thePathFull'] . '[' . $pageRecord['uid'] . ']',
370  'icon' => $this->iconFactory->getIconForRecord('pages', $pageRecord, ‪Icon::SIZE_SMALL)->render()
371  ];
372  }
373  break;
375  ‪$data = [
376  'text' => $linkData['email'],
377  'icon' => $this->iconFactory->getIcon('content-elements-mailform', ‪Icon::SIZE_SMALL)->render()
378  ];
379  break;
381  ‪$data = [
382  'text' => $linkData['url'],
383  'icon' => $this->iconFactory->getIcon('apps-pagetree-page-shortcut-external', ‪Icon::SIZE_SMALL)->render()
384 
385  ];
386  break;
389  $file = $linkData['file'];
390  if ($file) {
391  ‪$data = [
392  'text' => $file->getPublicUrl(),
393  'icon' => $this->iconFactory->getIconForFileExtension($file->getExtension(), ‪Icon::SIZE_SMALL)->render()
394  ];
395  }
396  break;
399  $folder = $linkData['folder'];
400  if ($folder) {
401  ‪$data = [
402  'text' => $folder->getPublicUrl(),
403  'icon' => $this->iconFactory->getIcon('apps-filetree-folder-default', ‪Icon::SIZE_SMALL)->render()
404  ];
405  }
406  break;
408  $table = $this->data['pageTsConfig']['TCEMAIN.']['linkHandler.'][$linkData['identifier'] . '.']['configuration.']['table'];
409  $record = ‪BackendUtility::getRecord($table, $linkData['uid']);
410  if ($record) {
411  $recordTitle = ‪BackendUtility::getRecordTitle($table, $record);
412  $tableTitle = $this->‪getLanguageService()->‪sL(‪$GLOBALS['TCA'][$table]['ctrl']['title']);
413  ‪$data = [
414  'text' => sprintf('%s [%s:%d]', $recordTitle, $tableTitle, $linkData['uid']),
415  'icon' => $this->iconFactory->getIconForRecord($table, $record, ‪Icon::SIZE_SMALL)->render(),
416  ];
417  } else {
418  ‪$data = [
419  'text' => sprintf('%s', $linkData['uid']),
420  'icon' => $this->iconFactory->getIcon('tcarecords-' . $table . '-default', ‪Icon::SIZE_SMALL, 'overlay-missing')->render(),
421  ];
422  }
423  break;
425  $telephone = $linkData['telephone'];
426  if ($telephone) {
427  ‪$data = [
428  'text' => $telephone,
429  'icon' => $this->iconFactory->getIcon('actions-device-mobile', ‪Icon::SIZE_SMALL)->render()
430  ];
431  }
432  break;
433  default:
434  // Please note that this hook is preliminary and might change, as this element could become its own
435  // TCA type in the future
436  if (isset(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['linkHandler'][$linkData['type']])) {
437  $linkBuilder = GeneralUtility::makeInstance(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['linkHandler'][$linkData['type']]);
438  ‪$data = $linkBuilder->getFormData($linkData, $linkParts, $this->data, $this);
439  } elseif ($linkData['type'] === ‪LinkService::TYPE_UNKNOWN) {
440  ‪$data = [
441  'text' => $linkData['file'],
442  'icon' => $this->iconFactory->getIcon('actions-link', ‪Icon::SIZE_SMALL)->render()
443  ];
444  } else {
445  ‪$data = [
446  'text' => 'not implemented type ' . $linkData['type'],
447  'icon' => ''
448  ];
449  }
450  }
451 
452  ‪$data['additionalAttributes'] = '<div class="help-block">' . implode(' - ', $additionalAttributes) . '</div>';
453  return ‪$data;
454  }
455 
459  protected function ‪getLanguageService()
460  {
461  return ‪$GLOBALS['LANG'];
462  }
463 }
‪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\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\Core\Resource\Exception\FileDoesNotExistException
Definition: FileDoesNotExistException.php:22
‪TYPO3\CMS\Core\Localization\LanguageService\sL
‪string sL($input)
Definition: LanguageService.php:194
‪TYPO3\CMS\Backend\Form\Element
Definition: AbstractFormElement.php:16
‪TYPO3\CMS\Backend\Form\AbstractNode\getValidationDataAsJsonString
‪string getValidationDataAsJsonString(array $config)
Definition: AbstractNode.php:151
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldControl
‪array renderFieldControl()
Definition: AbstractFormElement.php:88
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\hasNullCheckboxWithPlaceholder
‪bool hasNullCheckboxWithPlaceholder()
Definition: AbstractFormElement.php:167
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\hasNullCheckboxButNoPlaceholder
‪bool hasNullCheckboxButNoPlaceholder()
Definition: AbstractFormElement.php:132
‪TYPO3\CMS\Backend\Form\AbstractNode\$data
‪array $data
Definition: AbstractNode.php:42
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:37
‪TYPO3\CMS\Core\Resource\Exception\FolderDoesNotExistException
Definition: FolderDoesNotExistException.php:22
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:24
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1541
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\formMaxWidth
‪int formMaxWidth($size=48)
Definition: AbstractFormElement.php:298
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:75
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecord
‪static array null getRecord($table, $uid, $fields=' *', $where='', $useDeleteClause=true)
Definition: BackendUtility.php:95
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static string[] trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:1059
‪TYPO3\CMS\Backend\Utility\BackendUtility\readPageAccess
‪static array false readPageAccess($id, $perms_clause)
Definition: BackendUtility.php:597
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:92
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:22
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪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\Core\Resource\Exception\InvalidPathException
Definition: InvalidPathException.php:24