‪TYPO3CMS  9.5
TcaInline.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
32 
37 {
44  public function ‪addData(array $result)
45  {
46  $result = $this->‪addInlineFirstPid($result);
47 
48  foreach ($result['processedTca']['columns'] as $fieldName => $fieldConfig) {
49  if (!$this->‪isInlineField($fieldConfig)) {
50  continue;
51  }
52  $result['processedTca']['columns'][$fieldName]['children'] = [];
53  if (!$this->‪isUserAllowedToModify($fieldConfig)) {
54  continue;
55  }
56  if ($result['inlineResolveExistingChildren']) {
57  $result = $this->‪resolveRelatedRecords($result, $fieldName);
58  $result = $this->‪addForeignSelectorAndUniquePossibleRecords($result, $fieldName);
59  }
60  }
61 
62  return $result;
63  }
64 
71  protected function ‪isInlineField($fieldConfig)
72  {
73  return !empty($fieldConfig['config']['type']) && $fieldConfig['config']['type'] === 'inline';
74  }
75 
82  protected function ‪isUserAllowedToModify($fieldConfig)
83  {
84  return $this->‪getBackendUser()->‪check('tables_modify', $fieldConfig['config']['foreign_table']);
85  }
86 
95  protected function ‪addInlineFirstPid(array $result)
96  {
97  if ($result['inlineFirstPid'] === null) {
98  $table = $result['tableName'];
99  $row = $result['databaseRow'];
100  // If the parent is a page, use the uid(!) of the (new?) page as pid for the child records:
101  if ($table === 'pages') {
102  $liveVersionId = ‪BackendUtility::getLiveVersionIdOfRecord('pages', $row['uid']);
103  $pid = $liveVersionId === null ? $row['uid'] : $liveVersionId;
104  } elseif (($row['pid'] ?? 0) < 0) {
105  $prevRec = ‪BackendUtility::getRecord($table, abs($row['pid']));
106  $pid = $prevRec['pid'];
107  } else {
108  $pid = $row['pid'] ?? 0;
109  }
111  $pageRecord = ‪BackendUtility::getRecord('pages', (int)$pid);
112  if ((int)$pageRecord[‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']] > 0) {
113  $pid = (int)$pageRecord[‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']];
114  }
115  } elseif (strpos($pid, 'NEW') !== 0) {
116  throw new \RuntimeException(
117  'inlineFirstPid should either be an integer or a "NEW..." string',
118  1521220142
119  );
120  }
121  $result['inlineFirstPid'] = $pid;
122  }
123  return $result;
124  }
125 
134  protected function ‪resolveRelatedRecordsOverlays(array $result, $fieldName)
135  {
136  $childTableName = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
137 
138  $connectedUidsOfLocalizedOverlay = [];
139  if ($result['command'] === 'edit') {
140  $connectedUidsOfLocalizedOverlay = $this->‪resolveConnectedRecordUids(
141  $result['processedTca']['columns'][$fieldName]['config'],
142  $result['tableName'],
143  $result['databaseRow']['uid'],
144  $result['databaseRow'][$fieldName]
145  );
146  }
147  $result['databaseRow'][$fieldName] = implode(',', $connectedUidsOfLocalizedOverlay);
148  $connectedUidsOfLocalizedOverlay = $this->‪getWorkspacedUids($connectedUidsOfLocalizedOverlay, $childTableName);
149  if ($result['inlineCompileExistingChildren']) {
150  $tableNameWithDefaultRecords = $result['tableName'];
151  $connectedUidsOfDefaultLanguageRecord = $this->‪resolveConnectedRecordUids(
152  $result['processedTca']['columns'][$fieldName]['config'],
153  $tableNameWithDefaultRecords,
154  $result['defaultLanguageRow']['uid'],
155  $result['defaultLanguageRow'][$fieldName]
156  );
157  $connectedUidsOfDefaultLanguageRecord = $this->‪getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
158 
159  $showPossible = $result['processedTca']['columns'][$fieldName]['config']['appearance']['showPossibleLocalizationRecords'];
160 
161  // Find which records are localized, which records are not localized and which are
162  // localized but miss default language record
163  $fieldNameWithDefaultLanguageUid = ‪$GLOBALS['TCA'][$childTableName]['ctrl']['transOrigPointerField'];
164  foreach ($connectedUidsOfLocalizedOverlay as $localizedUid) {
165  try {
166  $localizedRecord = $this->‪getRecordFromDatabase($childTableName, $localizedUid);
167  } catch (‪DatabaseRecordException $e) {
168  // The child could not be compiled, probably it was deleted and a dangling mm record exists
169  $this->logger->warning(
170  $e->getMessage(),
171  [
172  'table' => $childTableName,
173  'uid' => $localizedUid,
174  'exception' => $e
175  ]
176  );
177  continue;
178  }
179  $uidOfDefaultLanguageRecord = $localizedRecord[$fieldNameWithDefaultLanguageUid];
180  if (in_array($uidOfDefaultLanguageRecord, $connectedUidsOfDefaultLanguageRecord)) {
181  // This localized child has a default language record. Remove this record from list of default language records
182  $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, [$uidOfDefaultLanguageRecord]);
183  }
184  // Compile localized record
185  $compiledChild = $this->‪compileChild($result, $fieldName, $localizedUid);
186  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
187  }
188  if ($showPossible) {
189  foreach ($connectedUidsOfDefaultLanguageRecord as $defaultLanguageUid) {
190  // If there are still uids in $connectedUidsOfDefaultLanguageRecord, these are records that
191  // exist in default language, but are not localized yet. Compile and mark those
192  try {
193  $compiledChild = $this->‪compileChild($result, $fieldName, $defaultLanguageUid);
194  } catch (‪DatabaseRecordException $e) {
195  // The child could not be compiled, probably it was deleted and a dangling mm record exists
196  $this->logger->warning(
197  $e->getMessage(),
198  [
199  'table' => $childTableName,
200  'uid' => $defaultLanguageUid,
201  'exception' => $e
202  ]
203  );
204  continue;
205  }
206  $compiledChild['isInlineDefaultLanguageRecordInLocalizedParentContext'] = true;
207  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
208  }
209  }
210  }
211 
212  return $result;
213  }
214 
223  protected function ‪resolveRelatedRecords(array $result, $fieldName)
224  {
225  if ($result['defaultLanguageRow'] !== null) {
226  return $this->‪resolveRelatedRecordsOverlays($result, $fieldName);
227  }
228 
229  $childTableName = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
230  $connectedUidsOfDefaultLanguageRecord = $this->‪resolveConnectedRecordUids(
231  $result['processedTca']['columns'][$fieldName]['config'],
232  $result['tableName'],
233  $result['databaseRow']['uid'],
234  $result['databaseRow'][$fieldName]
235  );
236  $result['databaseRow'][$fieldName] = implode(',', $connectedUidsOfDefaultLanguageRecord);
237 
238  $connectedUidsOfDefaultLanguageRecord = $this->‪getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
239 
240  if ($result['inlineCompileExistingChildren']) {
241  foreach ($connectedUidsOfDefaultLanguageRecord as $uid) {
242  $compiledChild = $this->‪compileChild($result, $fieldName, $uid);
243  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
244  }
245  }
246  return $result;
247  }
248 
258  protected function ‪addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
259  {
260  if (!is_array($result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'])) {
261  return $result;
262  }
263 
264  $selectorOrUniqueConfiguration = $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'];
265  $foreignFieldName = $selectorOrUniqueConfiguration['fieldName'];
266  $selectorOrUniquePossibleRecords = [];
267 
268  if ($selectorOrUniqueConfiguration['config']['type'] === 'select') {
269  // Compile child table data for this field only
270  $selectDataInput = [
271  'tableName' => $result['processedTca']['columns'][$fieldName]['config']['foreign_table'],
272  'command' => 'new',
273  // Since there is no existing record that may have a type, it does not make sense to
274  // do extra handling of pageTsConfig merged here. Just provide "parent" pageTS as is
275  'pageTsConfig' => $result['pageTsConfig'],
276  'userTsConfig' => $result['userTsConfig'],
277  'databaseRow' => $result['databaseRow'],
278  'processedTca' => [
279  'ctrl' => [],
280  'columns' => [
281  $foreignFieldName => [
282  'config' => $selectorOrUniqueConfiguration['config'],
283  ],
284  ],
285  ],
286  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
287  ];
289  $formDataGroup = GeneralUtility::makeInstance(OnTheFly::class);
290  $formDataGroup->setProviderList([TcaSelectItems::class]);
292  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
293  $compilerResult = $formDataCompiler->compile($selectDataInput);
294  $selectorOrUniquePossibleRecords = $compilerResult['processedTca']['columns'][$foreignFieldName]['config']['items'];
295  }
296 
297  $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniquePossibleRecords'] = $selectorOrUniquePossibleRecords;
298 
299  return $result;
300  }
301 
310  protected function ‪compileChild(array $result, $parentFieldName, $childUid)
311  {
312  $parentConfig = $result['processedTca']['columns'][$parentFieldName]['config'];
313  $childTableName = $parentConfig['foreign_table'];
314 
316  $inlineStackProcessor = GeneralUtility::makeInstance(InlineStackProcessor::class);
317  $inlineStackProcessor->initializeByGivenStructure($result['inlineStructure']);
318  $inlineTopMostParent = $inlineStackProcessor->getStructureLevel(0);
319 
321  $formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class);
323  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
324  $formDataCompilerInput = [
325  'command' => 'edit',
326  'tableName' => $childTableName,
327  'vanillaUid' => (int)$childUid,
328  // Give incoming returnUrl down to children so they generate a returnUrl back to
329  // the originally opening record, also see "originalReturnUrl" in inline container
330  // and FormInlineAjaxController
331  'returnUrl' => $result['returnUrl'],
332  'isInlineChild' => true,
333  'inlineStructure' => $result['inlineStructure'],
334  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
335  'inlineFirstPid' => $result['inlineFirstPid'],
336  'inlineParentConfig' => $parentConfig,
337 
338  // values of the current parent element
339  // it is always a string either an id or new...
340  'inlineParentUid' => $result['databaseRow']['uid'],
341  'inlineParentTableName' => $result['tableName'],
342  'inlineParentFieldName' => $parentFieldName,
343 
344  // values of the top most parent element set on first level and not overridden on following levels
345  'inlineTopMostParentUid' => $result['inlineTopMostParentUid'] ?: $inlineTopMostParent['uid'],
346  'inlineTopMostParentTableName' => $result['inlineTopMostParentTableName'] ?: $inlineTopMostParent['table'],
347  'inlineTopMostParentFieldName' => $result['inlineTopMostParentFieldName'] ?: $inlineTopMostParent['field'],
348  ];
349 
350  // For foreign_selector with useCombination $mainChild is the mm record
351  // and $combinationChild is the child-child. For 1:n "normal" relations,
352  // $mainChild is just the normal child record and $combinationChild is empty.
353  $mainChild = $formDataCompiler->compile($formDataCompilerInput);
354  if ($parentConfig['foreign_selector'] && $parentConfig['appearance']['useCombination']) {
355  try {
356  $mainChild['combinationChild'] = $this->‪compileChildChild($mainChild, $parentConfig);
357  } catch (‪DatabaseRecordException $e) {
358  // The child could not be compiled, probably it was deleted and a dangling mm record
359  // exists. This is a data inconsistency, we catch this exception and create a flash message
360  $message = vsprintf(
361  $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:formEngine.databaseRecordErrorInlineChildChild'),
362  [$e->‪getTableName(), $e->‪getUid(), $childTableName, (int)$childUid]
363  );
364  $flashMessage = GeneralUtility::makeInstance(
365  FlashMessage::class,
366  $message,
367  '',
369  );
370  GeneralUtility::makeInstance(FlashMessageService::class)->getMessageQueueByIdentifier()->enqueue($flashMessage);
371  }
372  }
373  return $mainChild;
374  }
375 
384  protected function ‪compileChildChild(array $child, array $parentConfig)
385  {
386  // foreign_selector on intermediate is probably type=select, so data provider of this table resolved that to the uid already
387  $childChildUid = $child['databaseRow'][$parentConfig['foreign_selector']][0];
388  // child-child table name is set in child tca "the selector field" foreign_table
389  $childChildTableName = $child['processedTca']['columns'][$parentConfig['foreign_selector']]['config']['foreign_table'];
391  $formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class);
393  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
394 
395  $formDataCompilerInput = [
396  'command' => 'edit',
397  'tableName' => $childChildTableName,
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);
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::cast($workspaceVersion['t3ver_state']);
431  if ($versionState->equals(‪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  }
459  $relationHandler = GeneralUtility::makeInstance(RelationHandler::class);
460  $relationHandler->registerNonTableValues = (bool)$parentConfig['allowedIdValues'];
461  $relationHandler->start($parentFieldValue, $parentConfig['foreign_table'], $parentConfig['MM'], $parentUid, $parentTableName, $parentConfig);
462  $foreignRecordUids = $relationHandler->getValueArray();
463  $resolvedForeignRecordUids = [];
464  foreach ($foreignRecordUids as $aForeignRecordUid) {
465  if ($parentConfig['MM'] || $parentConfig['foreign_field']) {
466  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
467  } else {
468  foreach ($directlyConnectedIds as $id) {
469  if ((int)$aForeignRecordUid === (int)$id) {
470  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
471  }
472  }
473  }
474  }
475  return $resolvedForeignRecordUids;
476  }
477 
487  protected function ‪getLiveDefaultId($tableName, $uid)
488  {
489  $liveDefaultId = ‪BackendUtility::getLiveVersionIdOfRecord($tableName, $uid);
490  if ($liveDefaultId === null) {
491  $liveDefaultId = $uid;
492  }
493  return $liveDefaultId;
494  }
495 
499  protected function ‪getBackendUser()
500  {
501  return ‪$GLOBALS['BE_USER'];
502  }
503 
507  protected function ‪getLanguageService()
508  {
509  return ‪$GLOBALS['LANG'];
510  }
511 }
‪TYPO3\CMS\Backend\Form\FormDataGroup\OnTheFly
Definition: OnTheFly.php:26
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\isUserAllowedToModify
‪bool isUserAllowedToModify($fieldConfig)
Definition: TcaInline.php:82
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger($var)
Definition: MathUtility.php:73
‪TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider
Definition: AbstractDatabaseRecordProvider.php:28
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\compileChild
‪array compileChild(array $result, $parentFieldName, $childUid)
Definition: TcaInline.php:310
‪TYPO3\CMS\Core\Database\RelationHandler
Definition: RelationHandler.php:32
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\isInlineField
‪bool isInlineField($fieldConfig)
Definition: TcaInline.php:71
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline
Definition: TcaInline.php:37
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\check
‪bool check($type, $value)
Definition: BackendUserAuthentication.php:648
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addForeignSelectorAndUniquePossibleRecords
‪array addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
Definition: TcaInline.php:258
‪TYPO3\CMS\Core\Versioning\VersionState\DELETE_PLACEHOLDER
‪const DELETE_PLACEHOLDER
Definition: VersionState.php:54
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException\getUid
‪int getUid()
Definition: DatabaseRecordException.php:63
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveConnectedRecordUids
‪array resolveConnectedRecordUids(array $parentConfig, $parentTableName, $parentUid, $parentFieldValue)
Definition: TcaInline.php:452
‪TYPO3\CMS\Backend\Utility\BackendUtility\isTableWorkspaceEnabled
‪static bool isTableWorkspaceEnabled($table)
Definition: BackendUtility.php:4493
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addInlineFirstPid
‪array addInlineFirstPid(array $result)
Definition: TcaInline.php:95
‪TYPO3\CMS\Core\Type\Enumeration\cast
‪static static cast($value)
Definition: Enumeration.php:182
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getBackendUser
‪BackendUserAuthentication getBackendUser()
Definition: TcaInline.php:499
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getLanguageService
‪LanguageService getLanguageService()
Definition: TcaInline.php:507
‪TYPO3\CMS\Backend\Form\FormDataProvider\AbstractDatabaseRecordProvider\getRecordFromDatabase
‪array getRecordFromDatabase($tableName, $uid)
Definition: AbstractDatabaseRecordProvider.php:41
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\compileChildChild
‪array compileChildChild(array $child, array $parentConfig)
Definition: TcaInline.php:384
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:45
‪TYPO3\CMS\Backend\Form\FormDataProvider
Definition: AbstractDatabaseRecordProvider.php:2
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:72
‪TYPO3\CMS\Backend\Utility\BackendUtility\getWorkspaceVersionOfRecord
‪static array bool getWorkspaceVersionOfRecord($workspace, $table, $uid, $fields=' *')
Definition: BackendUtility.php:4166
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException\getTableName
‪string getTableName()
Definition: DatabaseRecordException.php:53
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getWorkspacedUids
‪array getWorkspacedUids(array $connectedUids, $childTableName)
Definition: TcaInline.php:420
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecord
‪static array null getRecord($table, $uid, $fields=' *', $where='', $useDeleteClause=true)
Definition: BackendUtility.php:130
‪TYPO3\CMS\Backend\Form\FormDataProviderInterface
Definition: FormDataProviderInterface.php:22
‪TYPO3\CMS\Core\Versioning\VersionState
Definition: VersionState.php:23
‪TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException
Definition: DatabaseRecordException.php:23
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:22
‪TYPO3\CMS\Backend\Utility\BackendUtility\getLiveVersionIdOfRecord
‪static int getLiveVersionIdOfRecord($table, $uid)
Definition: BackendUtility.php:4229
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:21
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getLiveDefaultId
‪int getLiveDefaultId($tableName, $uid)
Definition: TcaInline.php:487
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:29
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveRelatedRecordsOverlays
‪array resolveRelatedRecordsOverlays(array $result, $fieldName)
Definition: TcaInline.php:134
‪TYPO3\CMS\Backend\Form\InlineStackProcessor
Definition: InlineStackProcessor.php:29
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\resolveRelatedRecords
‪array resolveRelatedRecords(array $result, $fieldName)
Definition: TcaInline.php:223
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Backend\Form\FormDataCompiler
Definition: FormDataCompiler.php:24
‪TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord
Definition: TcaDatabaseRecord.php:24
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\addData
‪array addData(array $result)
Definition: TcaInline.php:44
‪TYPO3\CMS\Core\Messaging\FlashMessageService
Definition: FlashMessageService.php:25
‪TYPO3\CMS\Core\Messaging\AbstractMessage\ERROR
‪const ERROR
Definition: AbstractMessage.php:29