‪TYPO3CMS  ‪main
TcaInline.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 
24 use TYPO3\CMS\Backend\Utility\BackendUtility;
34 
39 {
45  public function ‪addData(array $result)
46  {
47  $result = $this->‪addInlineFirstPid($result);
48 
49  foreach ($result['processedTca']['columns'] as $fieldName => $fieldConfig) {
50  if (!$this->‪isInlineField($fieldConfig)) {
51  continue;
52  }
53  $result['processedTca']['columns'][$fieldName]['children'] = [];
54  if (!$this->‪isUserAllowedToModify($fieldConfig)) {
55  continue;
56  }
57  if ($result['inlineResolveExistingChildren']) {
58  $result = $this->‪resolveRelatedRecords($result, $fieldName);
59  $result = $this->‪addForeignSelectorAndUniquePossibleRecords($result, $fieldName);
60  }
61  }
62 
63  return $result;
64  }
65 
72  protected function ‪isInlineField($fieldConfig)
73  {
74  return !empty($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'inline';
75  }
76 
83  protected function ‪isUserAllowedToModify($fieldConfig)
84  {
85  return $this->‪getBackendUser()->check('tables_modify', $fieldConfig['config']['foreign_table']);
86  }
87 
96  protected function ‪addInlineFirstPid(array $result)
97  {
98  if ($result['inlineFirstPid'] === null) {
99  $table = $result['tableName'];
100  $row = $result['databaseRow'];
101  // If the parent is a page, use the uid(!) of the (new?) page as pid for the child records:
102  if ($table === 'pages') {
103  $liveVersionId = BackendUtility::getLiveVersionIdOfRecord('pages', $row['uid']);
104  $pid = $liveVersionId ?? $row['uid'];
105  } elseif (($row['pid'] ?? 0) < 0) {
106  $prevRec = BackendUtility::getRecord($table, (int)abs($row['pid']));
107  $pid = $prevRec['pid'];
108  } else {
109  $pid = $row['pid'] ?? 0;
110  }
112  $pageRecord = BackendUtility::getRecord('pages', (int)$pid);
113  if (($pageRecord[‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'] ?? null] ?? 0) > 0) {
114  $pid = (int)$pageRecord[‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']];
115  }
116  } elseif (!str_starts_with($pid, 'NEW')) {
117  throw new \RuntimeException(
118  'inlineFirstPid should either be an integer or a "NEW..." string',
119  1521220142
120  );
121  }
122  $result['inlineFirstPid'] = $pid;
123  }
124  return $result;
125  }
126 
135  protected function ‪resolveRelatedRecordsOverlays(array $result, $fieldName)
136  {
137  $childTableName = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
138 
139  $connectedUidsOfLocalizedOverlay = [];
140  if ($result['command'] === 'edit') {
141  $connectedUidsOfLocalizedOverlay = $this->‪resolveConnectedRecordUids(
142  $result['processedTca']['columns'][$fieldName]['config'],
143  $result['tableName'],
144  $result['databaseRow']['uid'],
145  $result['databaseRow'][$fieldName]
146  );
147  }
148  $result['databaseRow'][$fieldName] = implode(',', $connectedUidsOfLocalizedOverlay);
149  $connectedUidsOfLocalizedOverlay = $this->‪getWorkspacedUids($connectedUidsOfLocalizedOverlay, $childTableName);
150  if ($result['inlineCompileExistingChildren']) {
151  $tableNameWithDefaultRecords = $result['tableName'];
152  $connectedUidsOfDefaultLanguageRecord = $this->‪resolveConnectedRecordUids(
153  $result['processedTca']['columns'][$fieldName]['config'],
154  $tableNameWithDefaultRecords,
155  $result['defaultLanguageRow']['uid'],
156  $result['defaultLanguageRow'][$fieldName]
157  );
158  $connectedUidsOfDefaultLanguageRecord = $this->‪getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
159 
160  $showPossible = $result['processedTca']['columns'][$fieldName]['config']['appearance']['showPossibleLocalizationRecords'];
161 
162  // Find which records are localized, which records are not localized and which are
163  // localized but miss default language record
164  $fieldNameWithDefaultLanguageUid = ‪$GLOBALS['TCA'][$childTableName]['ctrl']['transOrigPointerField'] ?? '';
165  foreach ($connectedUidsOfLocalizedOverlay as $localizedUid) {
166  try {
167  $localizedRecord = $this->‪getRecordFromDatabase($childTableName, $localizedUid);
168  } catch (‪DatabaseRecordException $e) {
169  // The child could not be compiled, probably it was deleted and a dangling mm record exists
170  $this->logger->warning(
171  $e->getMessage(),
172  [
173  'table' => $childTableName,
174  'uid' => $localizedUid,
175  'exception' => $e,
176  ]
177  );
178  continue;
179  }
180  if (isset($localizedRecord[$fieldNameWithDefaultLanguageUid])) {
181  $uidOfDefaultLanguageRecord = $localizedRecord[$fieldNameWithDefaultLanguageUid];
182  if (in_array($uidOfDefaultLanguageRecord, $connectedUidsOfDefaultLanguageRecord)) {
183  // This localized child has a default language record. Remove this record from list of default language records
184  $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, [$uidOfDefaultLanguageRecord]);
185  }
186  }
187  // Compile localized record
188  $compiledChild = $this->‪compileChild($result, $fieldName, $localizedUid);
189  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
190  }
191  if ($showPossible) {
192  foreach ($connectedUidsOfDefaultLanguageRecord as $defaultLanguageUid) {
193  // If there are still uids in $connectedUidsOfDefaultLanguageRecord, these are records that
194  // exist in default language, but are not localized yet. Compile and mark those
195  try {
196  $compiledChild = $this->‪compileChild($result, $fieldName, $defaultLanguageUid);
197  } catch (‪DatabaseRecordException $e) {
198  // The child could not be compiled, probably it was deleted and a dangling mm record exists
199  $this->logger->warning(
200  $e->getMessage(),
201  [
202  'table' => $childTableName,
203  'uid' => $defaultLanguageUid,
204  'exception' => $e,
205  ]
206  );
207  continue;
208  }
209  $compiledChild['isInlineDefaultLanguageRecordInLocalizedParentContext'] = true;
210  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
211  }
212  }
213  }
214 
215  return $result;
216  }
217 
226  protected function ‪resolveRelatedRecords(array $result, $fieldName)
227  {
228  if ($result['defaultLanguageRow'] !== null) {
229  return $this->‪resolveRelatedRecordsOverlays($result, $fieldName);
230  }
231 
232  $childTableName = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
233  $connectedUidsOfDefaultLanguageRecord = $this->‪resolveConnectedRecordUids(
234  $result['processedTca']['columns'][$fieldName]['config'],
235  $result['tableName'],
236  $result['databaseRow']['uid'],
237  $result['databaseRow'][$fieldName]
238  );
239  $result['databaseRow'][$fieldName] = implode(',', $connectedUidsOfDefaultLanguageRecord);
240 
241  $connectedUidsOfDefaultLanguageRecord = $this->‪getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
242 
243  if ($result['inlineCompileExistingChildren']) {
244  foreach ($connectedUidsOfDefaultLanguageRecord as ‪$uid) {
245  try {
246  $compiledChild = $this->‪compileChild($result, $fieldName, ‪$uid);
247  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
248  } catch (‪DatabaseRecordException $e) {
249  // Nothing to do here, missing child is just not being rendered.
250  }
251  }
252  }
253  return $result;
254  }
255 
265  protected function ‪addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
266  {
267  if (!is_array($result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'] ?? null)) {
268  return $result;
269  }
270 
271  $selectorOrUniqueConfiguration = $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'];
272  $foreignFieldName = $selectorOrUniqueConfiguration['fieldName'];
273  $selectorOrUniquePossibleRecords = [];
274 
275  if ($selectorOrUniqueConfiguration['config']['type'] === 'select') {
276  // Compile child table data for this field only
277  $selectDataInput = [
278  'request' => $result['request'],
279  'tableName' => $result['processedTca']['columns'][$fieldName]['config']['foreign_table'],
280  'command' => 'new',
281  // Since there is no existing record that may have a type, it does not make sense to
282  // do extra handling of pageTsConfig merged here. Just provide "parent" pageTS as is
283  'pageTsConfig' => $result['pageTsConfig'],
284  'userTsConfig' => $result['userTsConfig'],
285  'databaseRow' => $result['databaseRow'],
286  'processedTca' => [
287  'ctrl' => [],
288  'columns' => [
289  $foreignFieldName => [
290  'config' => $selectorOrUniqueConfiguration['config'],
291  ],
292  ],
293  ],
294  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
295  'site' => $result['site'],
296  ];
297  $formDataGroup = GeneralUtility::makeInstance(OnTheFly::class);
298  $formDataGroup->setProviderList([TcaSelectItems::class]);
299  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
300  $compilerResult = $formDataCompiler->compile($selectDataInput, $formDataGroup);
301  $selectorOrUniquePossibleRecords = $compilerResult['processedTca']['columns'][$foreignFieldName]['config']['items'];
302  }
303 
304  $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniquePossibleRecords'] = $selectorOrUniquePossibleRecords;
305 
306  return $result;
307  }
308 
317  protected function ‪compileChild(array $result, $parentFieldName, $childUid)
318  {
319  $parentConfig = $result['processedTca']['columns'][$parentFieldName]['config'];
320  $childTableName = $parentConfig['foreign_table'];
321 
322  $inlineStackProcessor = GeneralUtility::makeInstance(InlineStackProcessor::class);
323  $inlineStackProcessor->initializeByGivenStructure($result['inlineStructure']);
324  $inlineTopMostParent = $inlineStackProcessor->getStructureLevel(0) ?: [];
325 
326  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
327  $formDataCompilerInput = [
328  'request' => $result['request'],
329  'command' => 'edit',
330  'tableName' => $childTableName,
331  'vanillaUid' => (int)$childUid,
332  // Give incoming returnUrl down to children so they generate a returnUrl back to
333  // the originally opening record, also see "originalReturnUrl" in inline container
334  // and FormInlineAjaxController
335  'returnUrl' => $result['returnUrl'],
336  'isInlineChild' => true,
337  'inlineStructure' => $result['inlineStructure'],
338  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
339  'inlineFirstPid' => $result['inlineFirstPid'],
340  'inlineParentConfig' => $parentConfig,
341 
342  // values of the current parent element
343  // it is always a string either an id or new...
344  'inlineParentUid' => $result['databaseRow']['uid'],
345  'inlineParentTableName' => $result['tableName'],
346  'inlineParentFieldName' => $parentFieldName,
347 
348  // values of the top most parent element set on first level and not overridden on following levels
349  'inlineTopMostParentUid' => $result['inlineTopMostParentUid'] ?: $inlineTopMostParent['uid'] ?? '',
350  'inlineTopMostParentTableName' => $result['inlineTopMostParentTableName'] ?: $inlineTopMostParent['table'] ?? '',
351  'inlineTopMostParentFieldName' => $result['inlineTopMostParentFieldName'] ?: $inlineTopMostParent['field'] ?? '',
352  ];
353 
354  // For foreign_selector with useCombination $mainChild is the mm record
355  // and $combinationChild is the child-child. For 1:n "normal" relations,
356  // $mainChild is just the normal child record and $combinationChild is empty.
357  $mainChild = $formDataCompiler->compile($formDataCompilerInput, GeneralUtility::makeInstance(TcaDatabaseRecord::class));
358  if (($parentConfig['foreign_selector'] ?? false) && ($parentConfig['appearance']['useCombination'] ?? false)) {
359  try {
360  $mainChild['combinationChild'] = $this->‪compileChildChild($mainChild, $parentConfig);
361  } catch (‪DatabaseRecordException $e) {
362  // The child could not be compiled, probably it was deleted and a dangling mm record
363  // exists. This is a data inconsistency, we catch this exception and create a flash message
364  $message = vsprintf(
365  $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:formEngine.databaseRecordErrorInlineChildChild'),
366  [$e->‪getTableName(), $e->‪getUid(), $childTableName, (int)$childUid]
367  );
368  $flashMessage = GeneralUtility::makeInstance(
369  FlashMessage::class,
370  $message,
371  '',
372  ContextualFeedbackSeverity::ERROR
373  );
374  GeneralUtility::makeInstance(FlashMessageService::class)->getMessageQueueByIdentifier()->enqueue($flashMessage);
375  }
376  }
377  return $mainChild;
378  }
379 
388  protected function ‪compileChildChild(array $child, array $parentConfig)
389  {
390  // foreign_selector on intermediate is probably type=select, so data provider of this table resolved that to the uid already
391  $childChildUid = $child['databaseRow'][$parentConfig['foreign_selector']][0];
392  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
393 
394  $formDataCompilerInput = [
395  'request' => $child['request'],
396  'command' => 'edit',
397  'tableName' => $this->‪getChildChildTableName($parentConfig['foreign_selector'] ?? '', $child),
398  'vanillaUid' => (int)$childChildUid,
399  'isInlineChild' => true,
400  'isInlineChildExpanded' => $child['isInlineChildExpanded'],
401  // @todo: this is the wrong inline structure, isn't it? Shouldn't it contain the part from child child, too?
402  'inlineStructure' => $child['inlineStructure'],
403  'inlineFirstPid' => $child['inlineFirstPid'],
404  // values of the top most parent element set on first level and not overridden on following levels
405  'inlineTopMostParentUid' => $child['inlineTopMostParentUid'],
406  'inlineTopMostParentTableName' => $child['inlineTopMostParentTableName'],
407  'inlineTopMostParentFieldName' => $child['inlineTopMostParentFieldName'],
408  ];
409  $childChild = $formDataCompiler->compile($formDataCompilerInput, GeneralUtility::makeInstance(TcaDatabaseRecord::class));
410  return $childChild;
411  }
412 
420  protected function ‪getWorkspacedUids(array $connectedUids, $childTableName)
421  {
422  $backendUser = $this->‪getBackendUser();
423  $newConnectedUids = [];
424  foreach ($connectedUids as ‪$uid) {
425  // Fetch workspace version of a record (if any):
426  // @todo: Needs handling
427  if ($backendUser->workspace !== 0 && BackendUtility::isTableWorkspaceEnabled($childTableName)) {
428  $workspaceVersion = BackendUtility::getWorkspaceVersionOfRecord($backendUser->workspace, $childTableName, ‪$uid, 'uid,t3ver_state');
429  if (!empty($workspaceVersion)) {
430  $versionState = VersionState::tryFrom($workspaceVersion['t3ver_state'] ?? 0);
431  if ($versionState === VersionState::DELETE_PLACEHOLDER) {
432  continue;
433  }
434  ‪$uid = $workspaceVersion['uid'];
435  }
436  }
437  $newConnectedUids[] = ‪$uid;
438  }
439  return $newConnectedUids;
440  }
441 
452  protected function ‪resolveConnectedRecordUids(array $parentConfig, $parentTableName, $parentUid, $parentFieldValue)
453  {
454  $directlyConnectedIds = ‪GeneralUtility::trimExplode(',', $parentFieldValue);
455  if (empty($parentConfig['MM'])) {
456  $parentUid = $this->‪getLiveDefaultId($parentTableName, $parentUid);
457  }
458  $relationHandler = GeneralUtility::makeInstance(RelationHandler::class);
459  $relationHandler->start($parentFieldValue, $parentConfig['foreign_table'] ?? '', $parentConfig['MM'] ?? '', $parentUid, $parentTableName, $parentConfig);
460  $foreignRecordUids = $relationHandler->getValueArray();
461  $resolvedForeignRecordUids = [];
462  foreach ($foreignRecordUids as $aForeignRecordUid) {
463  if ($parentConfig['MM'] ?? $parentConfig['foreign_field'] ?? false) {
464  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
465  } else {
466  foreach ($directlyConnectedIds as $id) {
467  if ((int)$aForeignRecordUid === (int)$id) {
468  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
469  }
470  }
471  }
472  }
473  return $resolvedForeignRecordUids;
474  }
475 
485  protected function ‪getLiveDefaultId($tableName, ‪$uid)
486  {
487  $liveDefaultId = BackendUtility::getLiveVersionIdOfRecord($tableName, ‪$uid);
488  if ($liveDefaultId === null) {
489  $liveDefaultId = ‪$uid;
490  }
491  return $liveDefaultId;
492  }
493 
498  protected function ‪getChildChildTableName(string $foreignSelector, array $childConfiguration): string
499  {
500  $config = $childConfiguration['processedTca']['columns'][$foreignSelector]['config'] ?? [];
501  $type = $config['type'] ?? '';
502 
503  return match ($type) {
504  'select' => $config['foreign_table'] ?? '',
505  'group' => ‪GeneralUtility::trimExplode(',', $config['allowed'] ?? '', true)[0] ?? '',
506  default => '',
507  };
508  }
509 
511  {
512  return ‪$GLOBALS['BE_USER'];
513  }
514 
516  {
517  return ‪$GLOBALS['LANG'];
518  }
519 }
‪TYPO3\CMS\Backend\Form\FormDataGroup\OnTheFly
Definition: OnTheFly.php:27
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\isUserAllowedToModify
‪bool isUserAllowedToModify($fieldConfig)
Definition: TcaInline.php:83
‪TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider
Definition: AbstractDatabaseRecordProvider.php:31
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\compileChild
‪array compileChild(array $result, $parentFieldName, $childUid)
Definition: TcaInline.php:317
‪TYPO3\CMS\Core\Database\RelationHandler
Definition: RelationHandler.php:36
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getBackendUser
‪getBackendUser()
Definition: TcaInline.php:510
‪TYPO3\CMS\Core\Versioning\VersionState
‪VersionState
Definition: VersionState.php:22
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\isInlineField
‪bool isInlineField($fieldConfig)
Definition: TcaInline.php:72
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline
Definition: TcaInline.php:39
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addForeignSelectorAndUniquePossibleRecords
‪array addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
Definition: TcaInline.php:265
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getLanguageService
‪getLanguageService()
Definition: TcaInline.php:515
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException\getUid
‪int getUid()
Definition: DatabaseRecordException.php:64
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveConnectedRecordUids
‪array resolveConnectedRecordUids(array $parentConfig, $parentTableName, $parentUid, $parentFieldValue)
Definition: TcaInline.php:452
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger(mixed $var)
Definition: MathUtility.php:69
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addInlineFirstPid
‪array addInlineFirstPid(array $result)
Definition: TcaInline.php:96
‪TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider\getRecordFromDatabase
‪array getRecordFromDatabase($tableName, $uid)
Definition: AbstractDatabaseRecordProvider.php:44
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getChildChildTableName
‪getChildChildTableName(string $foreignSelector, array $childConfiguration)
Definition: TcaInline.php:498
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\compileChildChild
‪array compileChildChild(array $child, array $parentConfig)
Definition: TcaInline.php:388
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:61
‪TYPO3\CMS\Backend\Form\FormDataProvider
Definition: AbstractDatabaseRecordProvider.php:16
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException\getTableName
‪string getTableName()
Definition: DatabaseRecordException.php:54
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getWorkspacedUids
‪array getWorkspacedUids(array $connectedUids, $childTableName)
Definition: TcaInline.php:420
‪TYPO3\CMS\Backend\Form\FormDataProviderInterface
Definition: FormDataProviderInterface.php:23
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException
Definition: DatabaseRecordException.php:24
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:27
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getLiveDefaultId
‪int getLiveDefaultId($tableName, $uid)
Definition: TcaInline.php:485
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveRelatedRecordsOverlays
‪array resolveRelatedRecordsOverlays(array $result, $fieldName)
Definition: TcaInline.php:135
‪TYPO3\CMS\Backend\Form\InlineStackProcessor
Definition: InlineStackProcessor.php:32
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveRelatedRecords
‪array resolveRelatedRecords(array $result, $fieldName)
Definition: TcaInline.php:226
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Backend\Form\FormDataCompiler
Definition: FormDataCompiler.php:26
‪TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord
Definition: TcaDatabaseRecord.php:25
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addData
‪array addData(array $result)
Definition: TcaInline.php:45
‪TYPO3\CMS\Core\Messaging\FlashMessageService
Definition: FlashMessageService.php:27
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:817