‪TYPO3CMS  ‪main
LinkElement.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
23 use TYPO3\CMS\Backend\Utility\BackendUtility;
25 use TYPO3\CMS\Core\Imaging\IconSize;
28 use TYPO3\CMS\Core\LinkHandling\TypoLinkCodecService;
39 
46 {
52  protected ‪$defaultFieldInformation = [
53  'tcaDescription' => [
54  'renderType' => 'tcaDescription',
55  ],
56  ];
57 
63  protected ‪$defaultFieldWizard = [
64  'localizationStateSelector' => [
65  'renderType' => 'localizationStateSelector',
66  ],
67  'otherLanguageContent' => [
68  'renderType' => 'otherLanguageContent',
69  'after' => [
70  'localizationStateSelector',
71  ],
72  ],
73  'defaultLanguageDifferences' => [
74  'renderType' => 'defaultLanguageDifferences',
75  'after' => [
76  'otherLanguageContent',
77  ],
78  ],
79  ];
80 
81  public function ‪__construct(
82  private readonly ‪IconFactory $iconFactory,
83  private readonly EventDispatcherInterface $eventDispatcher,
84  private readonly TypoLinkCodecService $typoLinkCodecService,
85  private readonly ‪LinkService $linkService,
86  ) {}
87 
93  public function ‪render(): array
94  {
95  $table = $this->data['tableName'];
96  $fieldName = $this->data['fieldName'];
97  $parameterArray = $this->data['parameterArray'];
98  $resultArray = $this->‪initializeResultArray();
99  $config = $parameterArray['fieldConf']['config'];
100 
101  if (is_array($config['allowedTypes'] ?? false) && $config['allowedTypes'] === []) {
102  throw new \RuntimeException(
103  'Field "' . $fieldName . '" in table "' . $table . '" of type "link" defines an empty list of allowed link types.',
104  1646922484
105  );
106  }
107 
108  $itemValue = $parameterArray['itemFormElValue'];
109  $width = $this->‪formMaxWidth(
110  ‪MathUtility::forceIntegerInRange($config['size'] ?? $this->defaultInputWidth, $this->minimumInputWidth, $this->maxInputWidth)
111  );
112  $fieldId = ‪StringUtility::getUniqueId('formengine-input-');
113  $renderedLabel = $this->‪renderLabel($fieldId);
114 
115  $fieldInformationResult = $this->‪renderFieldInformation();
116  $fieldInformationHtml = $fieldInformationResult['html'];
117  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldInformationResult, false);
118 
119  if ($config['readOnly'] ?? false) {
120  $html = [];
121  $html[] = $renderedLabel;
122  $html[] = '<div class="formengine-field-item t3js-formengine-field-item">';
123  $html[] = $fieldInformationHtml;
124  $html[] = '<div class="form-wizards-wrap">';
125  $html[] = '<div class="form-wizards-element">';
126  $html[] = '<div class="form-control-wrap" style="max-width: ' . $width . 'px">';
127  $html[] = '<input class="form-control" id="' . htmlspecialchars($fieldId) . '" value="' . htmlspecialchars((string)$itemValue) . '" type="text" disabled>';
128  $html[] = '</div>';
129  $html[] = '</div>';
130  $html[] = '</div>';
131  $html[] = '</div>';
132  $resultArray['html'] = implode(LF, $html);
133  return $resultArray;
134  }
135 
136  $languageService = $this->‪getLanguageService();
137  $itemName = (string)$parameterArray['itemFormElName'];
138 
139  // Always adding "trim".
140  $evalList = ['trim'];
141  if ($config['nullable'] ?? false) {
142  $evalList[] = 'null';
143  }
144 
145  $attributes = [
146  'value' => '',
147  'id' => $fieldId,
148  'class' => implode(' ', [
149  'form-control',
150  'form-control-clearable',
151  't3js-clearable',
152  't3js-form-field-link-input',
153  'hasDefaultValue',
154  ]),
155  'data-formengine-validation-rules' => $this->‪getValidationDataAsJsonString($config),
156  'data-formengine-input-params' => (string)json_encode([
157  'field' => $itemName,
158  'evalList' => implode(',', $evalList),
159  ], JSON_THROW_ON_ERROR),
160  'data-formengine-input-name' => $itemName,
161  ];
162 
163  if (!empty($config['placeholder'])) {
164  $attributes['placeholder'] = trim($config['placeholder']);
165  }
166  if (isset($config['autocomplete'])) {
167  $attributes['autocomplete'] = empty($config['autocomplete']) ? 'new-' . $fieldName : 'on';
168  }
169 
170  $valuePickerHtml = [];
171  if (is_array($config['valuePicker']['items'] ?? false)) {
172  $valuePickerConfiguration = [
173  'mode' => $config['valuePicker']['mode'] ?? 'replace',
174  'linked-field' => '[data-formengine-input-name="' . $itemName . '"]',
175  ];
176  $valuePickerAttributes = array_merge(
177  [
178  'class' => 'form-select form-control-adapt',
179  ],
180  $this->getOnFieldChangeAttrs('change', $parameterArray['fieldChangeFunc'] ?? [])
181  );
182 
183  $valuePickerHtml[] = '<typo3-formengine-valuepicker ' . GeneralUtility::implodeAttributes($valuePickerConfiguration, true) . '>';
184  $valuePickerHtml[] = '<select ' . GeneralUtility::implodeAttributes($valuePickerAttributes, true) . '>';
185  $valuePickerHtml[] = '<option></option>';
186  foreach ($config['valuePicker']['items'] as $item) {
187  $valuePickerHtml[] = '<option value="' . htmlspecialchars($item[1]) . '">' . htmlspecialchars($languageService->sL($item[0])) . '</option>';
188  }
189  $valuePickerHtml[] = '</select>';
190  $valuePickerHtml[] = '</typo3-formengine-valuepicker>';
191 
192  $resultArray['javaScriptModules'][] = ‪JavaScriptModuleInstruction::create('@typo3/backend/form-engine/field-wizard/value-picker.js');
193  }
194 
195  $fieldWizardResult = $this->‪renderFieldWizard();
196  $fieldWizardHtml = $fieldWizardResult['html'];
197  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldWizardResult, false);
198 
199  // Manually initialize the "linkPopup" FieldControl configuration, based on the link type specific settings
200  $this->‪initializeLinkPopup($config);
201 
202  $fieldControlResult = $this->‪renderFieldControl();
203  $fieldControlHtml = $fieldControlResult['html'];
204  $resultArray = $this->‪mergeChildReturnIntoExistingResult($resultArray, $fieldControlResult, false);
205 
206  $linkExplanation = $this->‪getLinkExplanation((string)$itemValue);
207  $hasExplanation = ($linkExplanation['text'] ?? '') !== '';
208  if ($hasExplanation) {
209  $attributes['hidden'] = 'hidden';
210  }
211  $explanation = htmlspecialchars($linkExplanation['text'] ?? '');
212  $toggleButtonTitle = $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.toggleLinkExplanation');
213 
214  $expansionHtml = [];
215  $expansionHtml[] = '<div class="form-control-wrap" style="max-width: ' . $width . 'px">';
216  $expansionHtml[] = '<div class="form-wizards-wrap">';
217  $expansionHtml[] = '<div class="form-wizards-element">';
218  $expansionHtml[] = '<div class="input-group t3js-form-field-link">';
219  $expansionHtml[] = '<span class="t3js-form-field-link-icon input-group-text">' . ($linkExplanation['icon'] ?? '') . '</span>';
220  $expansionHtml[] = '<input class="form-control t3js-form-field-link-explanation" title="' . $explanation . '" value="' . $explanation . '"' . ' readonly' . ($hasExplanation ? '' : ' hidden') . '>';
221  $expansionHtml[] = '<input type="text" ' . GeneralUtility::implodeAttributes($attributes, true) . ' />';
222  $expansionHtml[] = '<button class="btn btn-default t3js-form-field-link-explanation-toggle" type="button" title="' . htmlspecialchars($toggleButtonTitle) . '"' . ($hasExplanation ? '' : ' disabled') . '>';
223  $expansionHtml[] = $this->iconFactory->getIcon('actions-version-workspaces-preview-link', IconSize::SMALL)->render();
224  $expansionHtml[] = '</button>';
225  $expansionHtml[] = '<input type="hidden" name="' . $itemName . '" value="' . htmlspecialchars((string)$itemValue) . '" />';
226  $expansionHtml[] = '</div>';
227  $expansionHtml[] = '</div>';
228  if (!empty($valuePickerHtml) || !empty($fieldControlHtml)) {
229  $expansionHtml[] = '<div class="form-wizards-items-aside form-wizards-items-aside--field-control">';
230  $expansionHtml[] = '<div class="btn-group">';
231  $expansionHtml[] = implode(LF, $valuePickerHtml);
232  $expansionHtml[] = $fieldControlHtml;
233  $expansionHtml[] = '</div>';
234  $expansionHtml[] = '</div>';
235  }
236  $expansionHtml[] = '<div class="form-wizards-items-bottom">';
237  $expansionHtml[] = $linkExplanation['additionalAttributes'] ?? '';
238  $expansionHtml[] = $fieldWizardHtml;
239  $expansionHtml[] = '</div>';
240  $expansionHtml[] = '</div>';
241  $expansionHtml[] = '</div>';
242  $expansionHtml = implode(LF, $expansionHtml);
243 
244  $nullControlNameEscaped = htmlspecialchars('control[active][' . $table . '][' . $this->data['databaseRow']['uid'] . '][' . $fieldName . ']');
245 
246  $fullElement = $expansionHtml;
247  if ($this->‪hasNullCheckboxButNoPlaceholder()) {
248  $checked = $itemValue !== null ? ' checked="checked"' : '';
249  $fullElement = [];
250  $fullElement[] = '<div class="t3-form-field-disable"></div>';
251  $fullElement[] = '<div class="form-check t3-form-field-eval-null-checkbox">';
252  $fullElement[] = '<input type="hidden" name="' . $nullControlNameEscaped . '" value="0" />';
253  $fullElement[] = '<input type="checkbox" class="form-check-input" name="' . $nullControlNameEscaped . '" id="' . $nullControlNameEscaped . '" value="1"' . $checked . ' />';
254  $fullElement[] = '<label class="form-check-label" for="' . $nullControlNameEscaped . '">';
255  $fullElement[] = $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.nullCheckbox');
256  $fullElement[] = '</label>';
257  $fullElement[] = '</div>';
258  $fullElement[] = $expansionHtml;
259  $fullElement = implode(LF, $fullElement);
260  } elseif ($this->‪hasNullCheckboxWithPlaceholder()) {
261  $checked = $itemValue !== null ? ' checked="checked"' : '';
262  $placeholder = $shortenedPlaceholder = (string)($config['placeholder'] ?? '');
263  if ($placeholder !== '') {
264  $shortenedPlaceholder = ‪GeneralUtility::fixed_lgd_cs($placeholder, 20);
265  if ($placeholder !== $shortenedPlaceholder) {
266  $overrideLabel = sprintf(
267  $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
268  '<span title="' . htmlspecialchars($placeholder) . '">' . htmlspecialchars($shortenedPlaceholder) . '</span>'
269  );
270  } else {
271  $overrideLabel = sprintf(
272  $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
273  htmlspecialchars($placeholder)
274  );
275  }
276  } else {
277  $overrideLabel = $languageService->sL(
278  'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override_not_available'
279  );
280  }
281  $fullElement = [];
282  $fullElement[] = '<div class="form-check t3js-form-field-eval-null-placeholder-checkbox">';
283  $fullElement[] = '<input type="hidden" name="' . $nullControlNameEscaped . '" value="0" />';
284  $fullElement[] = '<input type="checkbox" class="form-check-input" name="' . $nullControlNameEscaped . '" id="' . $nullControlNameEscaped . '" value="1"' . $checked . ' />';
285  $fullElement[] = '<label class="form-check-label" for="' . $nullControlNameEscaped . '">';
286  $fullElement[] = $overrideLabel;
287  $fullElement[] = '</label>';
288  $fullElement[] = '</div>';
289  $fullElement[] = '<div class="t3js-formengine-placeholder-placeholder">';
290  $fullElement[] = '<div class="form-control-wrap" style="max-width:' . $width . 'px">';
291  $fullElement[] = '<input type="text" class="form-control" disabled="disabled" value="' . htmlspecialchars($shortenedPlaceholder) . '" />';
292  $fullElement[] = '</div>';
293  $fullElement[] = '</div>';
294  $fullElement[] = '<div class="t3js-formengine-placeholder-formfield">';
295  $fullElement[] = $expansionHtml;
296  $fullElement[] = '</div>';
297  $fullElement = implode(LF, $fullElement);
298  }
299 
300  $resultArray['html'] = $renderedLabel . '
301  <typo3-formengine-element-link class="formengine-field-item t3js-formengine-field-item" recordFieldId="' . htmlspecialchars($fieldId) . '">
302  ' . $fieldInformationHtml . '
303  ' . $fullElement . '
304  </typo3-formengine-element-link>';
305 
306  $resultArray['javaScriptModules'][] = ‪JavaScriptModuleInstruction::create('@typo3/backend/form-engine/element/link-element.js');
307 
308  return $resultArray;
309  }
310 
311  protected function ‪getLinkExplanation(string $itemValue): array
312  {
313  if ($itemValue === '') {
314  return [];
315  }
316 
317  ‪$data = ['text' => '', 'icon' => ''];
318  $linkParts = $this->typoLinkCodecService->decode($itemValue);
319 
320  try {
321  $linkData = $this->linkService->resolve($linkParts['url']);
322  } catch (FileDoesNotExistException|FolderDoesNotExistException|UnknownLinkHandlerException|InvalidPathException $e) {
323  return ‪$data;
324  }
325 
326  // Resolving the TypoLink parts (class, title, params)
327  $additionalAttributes = [];
328  foreach ($linkParts as $key => $value) {
329  if ($key === 'url') {
330  continue;
331  }
332  if ($value) {
333  $label = match ((string)$key) {
334  'class' => $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:class'),
335  'title' => $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:title'),
336  'additionalParams' => $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:params'),
337  default => (string)$key
338  };
339  $additionalAttributes[] = '<span><strong>' . htmlspecialchars($label) . ': </strong> ' . htmlspecialchars($value) . '</span>';
340  }
341  }
342 
343  $backendUser = $this->‪getBackendUser();
344  // Resolve the actual link
345  switch ($linkData['type']) {
347  $pagePermissionClause = $backendUser->getPagePermsClause(‪Permission::PAGE_SHOW);
348  $pageRecord = BackendUtility::readPageAccess($linkData['pageuid'] ?? null, $pagePermissionClause);
349  // Is this a real page
350  if ($pageRecord['uid'] ?? 0) {
351  $fragmentTitle = '';
352  if (isset($linkData['fragment'])) {
353  if (‪MathUtility::canBeInterpretedAsInteger($linkData['fragment'])) {
354  $contentElement = BackendUtility::getRecord('tt_content', (int)$linkData['fragment'], '*', 'pid=' . $pageRecord['uid']);
355  if ($contentElement) {
356  $fragmentTitle = BackendUtility::getRecordTitle('tt_content', $contentElement, false, false);
357  }
358  }
359  $fragmentTitle = ' #' . ($fragmentTitle ?: $linkData['fragment']);
360  }
361  ‪$data = [
362  'text' => $pageRecord['_thePathFull'] . '[' . $pageRecord['uid'] . ']' . $fragmentTitle,
363  'icon' => $this->iconFactory->getIconForRecord('pages', $pageRecord, IconSize::SMALL)->render(),
364  ];
365  }
366  break;
368  ‪$data = [
369  'text' => $linkData['email'] ?? '',
370  'icon' => $this->iconFactory->getIcon('content-elements-mailform', IconSize::SMALL)->render(),
371  ];
372  break;
374  ‪$data = [
375  'text' => $linkData['url'] ?? '',
376  'icon' => $this->iconFactory->getIcon('apps-pagetree-page-shortcut-external', IconSize::SMALL)->render(),
377 
378  ];
379  break;
381  $file = $linkData['file'] ?? null;
382  if ($file instanceof File && $file->checkActionPermission('read') && !$file->getStorage()->isFallbackStorage()) {
383  ‪$data = [
384  'text' => $file->getPublicUrl(),
385  'icon' => $this->iconFactory->getIconForFileExtension($file->getExtension(), IconSize::SMALL)->‪render(),
386  ];
387  }
388  break;
390  $folder = $linkData['folder'] ?? null;
391  if ($folder instanceof Folder && $folder->checkActionPermission('read') && !$folder->getStorage()->isFallbackStorage()) {
392  ‪$data = [
393  'text' => $folder->getPublicUrl(),
394  'icon' => $this->iconFactory->getIcon('apps-filetree-folder-default', IconSize::SMALL)->render(),
395  ];
396  }
397  break;
399  $table = $this->data['pageTsConfig']['TCEMAIN.']['linkHandler.'][$linkData['identifier'] . '.']['configuration.']['table'] ?? '';
400  ‪$record = BackendUtility::getRecord($table, $linkData['uid']);
401  $pagePermissionClause = $backendUser->getPagePermsClause(‪Permission::PAGE_SHOW);
402  $hasPageAccess = BackendUtility::readPageAccess(‪$record['pid'] ?? null, $pagePermissionClause) !== false;
403  if (‪$record && $hasPageAccess && $backendUser->check('tables_select', $table)) {
404  $recordTitle = BackendUtility::getRecordTitle($table, ‪$record);
405  $tableTitle = $this->‪getLanguageService()->sL(‪$GLOBALS['TCA'][$table]['ctrl']['title']);
406  ‪$data = [
407  'text' => sprintf('%s [%s:%d]', $recordTitle, $tableTitle, $linkData['uid']),
408  'icon' => $this->iconFactory->getIconForRecord($table, ‪$record, IconSize::SMALL)->render(),
409  ];
410  } else {
411  ‪$data = [
412  'text' => sprintf('%s', $linkData['uid']),
413  'icon' => $this->iconFactory->getIcon('tcarecords-' . $table . '-default', IconSize::SMALL, 'overlay-missing')->render(),
414  ];
415  }
416  break;
418  $telephone = $linkData['telephone'];
419  if ($telephone) {
420  ‪$data = [
421  'text' => $telephone,
422  'icon' => $this->iconFactory->getIcon('actions-device-mobile', IconSize::SMALL)->render(),
423  ];
424  }
425  break;
427  ‪$data = [
428  'text' => $linkData['file'] ?? $linkData['url'] ?? '',
429  'icon' => $this->iconFactory->getIcon('actions-link', IconSize::SMALL)->render(),
430  ];
431  break;
432  default:
433  ‪$data = [
434  'text' => 'not implemented type ' . $linkData['type'],
435  'icon' => '',
436  ];
437  }
438 
439  ‪$data['additionalAttributes'] = $additionalAttributes !== []
440  ? '
441  <div class="callout callout-info mt-3 mb-0">
442  <div class="callout-body">
443  ' . implode(' - ', $additionalAttributes) . '
444  </div>
445  </div>
446  '
447  : ''; // Ensure "additionalAttributes" is always set (bw compatibility for the event)
448 
449  return $this->eventDispatcher->dispatch(
450  new ModifyLinkExplanationEvent(‪$data, $linkData, $linkParts, $this->data)
451  )->getLinkExplanation();
452  }
453 
459  protected function ‪initializeLinkPopup(array $fieldConfig): void
460  {
461  if (!($fieldConfig['appearance']['enableBrowser'] ?? true)) {
462  return;
463  }
464 
465  $options = [];
466 
467  if (is_array($fieldConfig['allowedTypes'] ?? null)
468  && ($fieldConfig['allowedTypes'][0] ?? '') !== '*'
469  ) {
470  $options['allowedTypes'] = $this->‪resolveAllowedTypes($fieldConfig['allowedTypes']);
471  }
472  if (is_array($fieldConfig['appearance']['allowedOptions'] ?? null)
473  && ($fieldConfig['appearance']['allowedOptions'][0] ?? '') !== '*'
474  ) {
475  $options['allowedOptions'] = $fieldConfig['appearance']['allowedOptions'];
476  }
477  if (is_array($fieldConfig['appearance']['allowedFileExtensions'] ?? null)
478  && ($fieldConfig['appearance']['allowedFileExtensions'][0] ?? '') !== '*'
479  ) {
480  $options['allowedFileExtensions'] = $fieldConfig['appearance']['allowedFileExtensions'];
481  }
482  if ($fieldConfig['appearance']['browserTitle'] ?? false) {
483  $options['title'] = $fieldConfig['appearance']['browserTitle'];
484  }
485 
486  // Add the LinkPopup configuration to the field configuration
487  $this->data['parameterArray']['fieldConf']['config']['fieldControl']['linkPopup'] = [
488  'renderType' => 'linkPopup',
489  'options' => $options,
490  ];
491  }
492 
496  protected function ‪resolveAllowedTypes(array $allowedTypes): array
497  {
498  // First, remove duplicate entries
499  $allowedTypes = array_unique($allowedTypes);
500 
501  // Replace "record" with available record link handlers
502  if (in_array('record', $allowedTypes, true)) {
503  unset($allowedTypes[(int)array_search('record', $allowedTypes, true)]);
504  $allowedTypes = array_merge($allowedTypes, $this->‪getRecordLinkHandlers());
505  }
506 
507  // Return the resolves types, while removing duplicate entries
508  return array_unique($allowedTypes);
509  }
510 
514  protected function ‪getRecordLinkHandlers(): array
515  {
516  return $this->‪getLinkHandlerIdentifiers(
517  array_filter(
518  (array)($this->data['pageTsConfig']['TCEMAIN.']['linkHandler.'] ?? []),
519  static fn(array $handler): bool => ($handler['handler'] ?? '') === RecordLinkHandler::class
520  )
521  );
522  }
523 
524  protected function ‪getLinkHandlerIdentifiers(array $linkHandlers): array
525  {
526  return array_map(static fn(string $handler): string => trim($handler, '.'), array_keys($linkHandlers));
527  }
528 }
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldInformation
‪array renderFieldInformation()
Definition: AbstractFormElement.php:73
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixed_lgd_cs
‪static string fixed_lgd_cs(string $string, int $chars, string $appendString='...')
Definition: GeneralUtility.php:92
‪TYPO3\CMS\Backend\Form\AbstractNode\mergeChildReturnIntoExistingResult
‪array mergeChildReturnIntoExistingResult(array $existing, array $childReturn, bool $mergeHtml=true)
Definition: AbstractNode.php:104
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\getBackendUser
‪getBackendUser()
Definition: AbstractFormElement.php:461
‪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\Core\Resource\Exception\FileDoesNotExistException
Definition: FileDoesNotExistException.php:21
‪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\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger(mixed $var)
Definition: MathUtility.php:69
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\renderFieldControl
‪array renderFieldControl()
Definition: AbstractFormElement.php:89
‪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\Core\Resource\Folder
Definition: Folder.php:38
‪TYPO3\CMS\Core\Resource\Exception\FolderDoesNotExistException
Definition: FolderDoesNotExistException.php:21
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Webhooks\Message\$record
‪identifier readonly int readonly array $record
Definition: PageModificationMessage.php:36
‪TYPO3\CMS\Core\Resource\Folder\checkActionPermission
‪bool checkActionPermission($action)
Definition: Folder.php:442
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\formMaxWidth
‪int formMaxWidth($size=48)
Definition: AbstractFormElement.php:332
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Core\Resource\File\checkActionPermission
‪bool checkActionPermission($action)
Definition: File.php:208
‪$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\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪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\Resource\Exception\InvalidPathException
Definition: InvalidPathException.php:23
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\hasNullCheckboxWithPlaceholder
‪hasNullCheckboxWithPlaceholder()
Definition: AbstractFormElement.php:195
‪TYPO3\CMS\Backend\Form\Element\AbstractFormElement\hasNullCheckboxButNoPlaceholder
‪hasNullCheckboxButNoPlaceholder()
Definition: AbstractFormElement.php:163
‪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