‪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->‪getSubstitutedWorkspacedUids($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->‪getSubstitutedWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
159 
160  $showPossibleLocalizationRecords = $result['processedTca']['columns'][$fieldName]['config']['appearance']['showPossibleLocalizationRecords'] ?? false;
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  // Compile localized record
181  $compiledChild = $this->‪compileChild($result, $fieldName, $localizedUid);
182  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
183  // If that relation is configured to "showPossibleLocalizationRecords", this localized record
184  // needs to be removed from the list of records that are pending to be localized.
185  if ($fieldNameWithDefaultLanguageUid && $showPossibleLocalizationRecords) {
186  $uidOfDefaultLanguageRecord = (int)$localizedRecord[$fieldNameWithDefaultLanguageUid];
187  if (in_array($uidOfDefaultLanguageRecord, $connectedUidsOfDefaultLanguageRecord, true)) {
188  // This localized child has a default language record. Remove this record from list of default language records
189  $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, [$uidOfDefaultLanguageRecord]);
190  }
191  $uidOfDefaultLanguageRecordWorkspaceVersionArray = $this->‪getSubstitutedWorkspacedUids([$uidOfDefaultLanguageRecord], $childTableName);
192  if (!empty($uidOfDefaultLanguageRecordWorkspaceVersionArray)
193  && in_array($uidOfDefaultLanguageRecordWorkspaceVersionArray[0], $connectedUidsOfDefaultLanguageRecord, true)
194  ) {
195  // In some situations 'l10n_parent' of a localized workspace record points to the live version
196  // of the default language record, and not to the workspace version, even though it exists.
197  // Filter those as well, since the interface would otherwise show the item as "can be localized/synchronized".
198  $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, [$uidOfDefaultLanguageRecordWorkspaceVersionArray[0]]);
199  }
200  }
201  }
202  if ($showPossibleLocalizationRecords) {
203  foreach ($connectedUidsOfDefaultLanguageRecord as $defaultLanguageUid) {
204  // If there are still uids in $connectedUidsOfDefaultLanguageRecord, these are records that
205  // exist in default language, but are not localized yet. Compile and mark those
206  try {
207  $compiledChild = $this->‪compileChild($result, $fieldName, $defaultLanguageUid);
208  } catch (‪DatabaseRecordException $e) {
209  // The child could not be compiled, probably it was deleted and a dangling mm record exists
210  $this->logger->warning(
211  $e->getMessage(),
212  [
213  'table' => $childTableName,
214  'uid' => $defaultLanguageUid,
215  'exception' => $e,
216  ]
217  );
218  continue;
219  }
220  $compiledChild['isInlineDefaultLanguageRecordInLocalizedParentContext'] = true;
221  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
222  }
223  }
224  }
225 
226  return $result;
227  }
228 
237  protected function ‪resolveRelatedRecords(array $result, $fieldName)
238  {
239  if ($result['defaultLanguageRow'] !== null) {
240  return $this->‪resolveRelatedRecordsOverlays($result, $fieldName);
241  }
242 
243  $childTableName = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
244  $connectedUidsOfDefaultLanguageRecord = $this->‪resolveConnectedRecordUids(
245  $result['processedTca']['columns'][$fieldName]['config'],
246  $result['tableName'],
247  $result['databaseRow']['uid'],
248  $result['databaseRow'][$fieldName]
249  );
250  $result['databaseRow'][$fieldName] = implode(',', $connectedUidsOfDefaultLanguageRecord);
251 
252  $connectedUidsOfDefaultLanguageRecord = $this->‪getSubstitutedWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
253 
254  if ($result['inlineCompileExistingChildren']) {
255  foreach ($connectedUidsOfDefaultLanguageRecord as ‪$uid) {
256  try {
257  $compiledChild = $this->‪compileChild($result, $fieldName, ‪$uid);
258  $result['processedTca']['columns'][$fieldName]['children'][] = $compiledChild;
259  } catch (‪DatabaseRecordException $e) {
260  // Nothing to do here, missing child is just not being rendered.
261  }
262  }
263  }
264  return $result;
265  }
266 
276  protected function ‪addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
277  {
278  if (!is_array($result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'] ?? null)) {
279  return $result;
280  }
281 
282  $selectorOrUniqueConfiguration = $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniqueConfiguration'];
283  $foreignFieldName = $selectorOrUniqueConfiguration['fieldName'];
284  $selectorOrUniquePossibleRecords = [];
285 
286  if ($selectorOrUniqueConfiguration['config']['type'] === 'select') {
287  // Compile child table data for this field only
288  $selectDataInput = [
289  'request' => $result['request'],
290  'tableName' => $result['processedTca']['columns'][$fieldName]['config']['foreign_table'],
291  'command' => 'new',
292  // Since there is no existing record that may have a type, it does not make sense to
293  // do extra handling of pageTsConfig merged here. Just provide "parent" pageTS as is
294  'pageTsConfig' => $result['pageTsConfig'],
295  'userTsConfig' => $result['userTsConfig'],
296  'databaseRow' => $result['databaseRow'],
297  'processedTca' => [
298  'ctrl' => [],
299  'columns' => [
300  $foreignFieldName => [
301  'config' => $selectorOrUniqueConfiguration['config'],
302  ],
303  ],
304  ],
305  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
306  'site' => $result['site'],
307  ];
308  $formDataGroup = GeneralUtility::makeInstance(OnTheFly::class);
309  $formDataGroup->setProviderList([TcaSelectItems::class]);
310  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
311  $compilerResult = $formDataCompiler->compile($selectDataInput, $formDataGroup);
312  $selectorOrUniquePossibleRecords = $compilerResult['processedTca']['columns'][$foreignFieldName]['config']['items'];
313  }
314 
315  $result['processedTca']['columns'][$fieldName]['config']['selectorOrUniquePossibleRecords'] = $selectorOrUniquePossibleRecords;
316 
317  return $result;
318  }
319 
328  protected function ‪compileChild(array $result, $parentFieldName, $childUid)
329  {
330  $parentConfig = $result['processedTca']['columns'][$parentFieldName]['config'];
331  $childTableName = $parentConfig['foreign_table'];
332 
333  $inlineStackProcessor = GeneralUtility::makeInstance(InlineStackProcessor::class);
334  $inlineStackProcessor->initializeByGivenStructure($result['inlineStructure']);
335  $inlineTopMostParent = $inlineStackProcessor->getStructureLevel(0) ?: [];
336 
337  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
338  $formDataCompilerInput = [
339  'request' => $result['request'],
340  'command' => 'edit',
341  'tableName' => $childTableName,
342  'vanillaUid' => (int)$childUid,
343  // Give incoming returnUrl down to children so they generate a returnUrl back to
344  // the originally opening record, also see "originalReturnUrl" in inline container
345  // and FormInlineAjaxController
346  'returnUrl' => $result['returnUrl'],
347  'isInlineChild' => true,
348  'inlineStructure' => $result['inlineStructure'],
349  'inlineExpandCollapseStateArray' => $result['inlineExpandCollapseStateArray'],
350  'inlineFirstPid' => $result['inlineFirstPid'],
351  'inlineParentConfig' => $parentConfig,
352 
353  // values of the current parent element
354  // it is always a string either an id or new...
355  'inlineParentUid' => $result['databaseRow']['uid'],
356  'inlineParentTableName' => $result['tableName'],
357  'inlineParentFieldName' => $parentFieldName,
358 
359  // values of the top most parent element set on first level and not overridden on following levels
360  'inlineTopMostParentUid' => $result['inlineTopMostParentUid'] ?: $inlineTopMostParent['uid'] ?? '',
361  'inlineTopMostParentTableName' => $result['inlineTopMostParentTableName'] ?: $inlineTopMostParent['table'] ?? '',
362  'inlineTopMostParentFieldName' => $result['inlineTopMostParentFieldName'] ?: $inlineTopMostParent['field'] ?? '',
363  ];
364 
365  // For foreign_selector with useCombination $mainChild is the mm record
366  // and $combinationChild is the child-child. For 1:n "normal" relations,
367  // $mainChild is just the normal child record and $combinationChild is empty.
368  $mainChild = $formDataCompiler->compile($formDataCompilerInput, GeneralUtility::makeInstance(TcaDatabaseRecord::class));
369  if (($parentConfig['foreign_selector'] ?? false) && ($parentConfig['appearance']['useCombination'] ?? false)) {
370  try {
371  $mainChild['combinationChild'] = $this->‪compileChildChild($mainChild, $parentConfig);
372  } catch (‪DatabaseRecordException $e) {
373  // The child could not be compiled, probably it was deleted and a dangling mm record
374  // exists. This is a data inconsistency, we catch this exception and create a flash message
375  $message = vsprintf(
376  $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:formEngine.databaseRecordErrorInlineChildChild'),
377  [$e->‪getTableName(), $e->‪getUid(), $childTableName, (int)$childUid]
378  );
379  $flashMessage = GeneralUtility::makeInstance(
380  FlashMessage::class,
381  $message,
382  '',
383  ContextualFeedbackSeverity::ERROR
384  );
385  GeneralUtility::makeInstance(FlashMessageService::class)->getMessageQueueByIdentifier()->enqueue($flashMessage);
386  }
387  }
388  return $mainChild;
389  }
390 
399  protected function ‪compileChildChild(array $child, array $parentConfig)
400  {
401  // foreign_selector on intermediate is probably type=select, so data provider of this table resolved that to the uid already
402  $childChildUid = $child['databaseRow'][$parentConfig['foreign_selector']][0];
403  $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class);
404 
405  $formDataCompilerInput = [
406  'request' => $child['request'],
407  'command' => 'edit',
408  'tableName' => $this->‪getChildChildTableName($parentConfig['foreign_selector'] ?? '', $child),
409  'vanillaUid' => (int)$childChildUid,
410  'isInlineChild' => true,
411  'isInlineChildExpanded' => $child['isInlineChildExpanded'],
412  // @todo: this is the wrong inline structure, isn't it? Shouldn't it contain the part from child child, too?
413  'inlineStructure' => $child['inlineStructure'],
414  'inlineFirstPid' => $child['inlineFirstPid'],
415  // values of the top most parent element set on first level and not overridden on following levels
416  'inlineTopMostParentUid' => $child['inlineTopMostParentUid'],
417  'inlineTopMostParentTableName' => $child['inlineTopMostParentTableName'],
418  'inlineTopMostParentFieldName' => $child['inlineTopMostParentFieldName'],
419  ];
420  $childChild = $formDataCompiler->compile($formDataCompilerInput, GeneralUtility::makeInstance(TcaDatabaseRecord::class));
421  return $childChild;
422  }
423 
431  protected function ‪getSubstitutedWorkspacedUids(array $connectedUids, string $childTableName): array
432  {
433  $backendUser = $this->‪getBackendUser();
434  $newConnectedUids = [];
435  foreach ($connectedUids as ‪$uid) {
436  // Fetch workspace version of a record (if any):
437  if ($backendUser->workspace !== 0 && BackendUtility::isTableWorkspaceEnabled($childTableName)) {
438  $workspaceVersion = BackendUtility::getWorkspaceVersionOfRecord($backendUser->workspace, $childTableName, ‪$uid, 'uid,t3ver_state');
439  if (!empty($workspaceVersion)) {
440  $versionState = VersionState::tryFrom($workspaceVersion['t3ver_state'] ?? 0);
441  if ($versionState === VersionState::DELETE_PLACEHOLDER) {
442  continue;
443  }
444  ‪$uid = $workspaceVersion['uid'];
445  }
446  }
447  $newConnectedUids[] = (int)‪$uid;
448  }
449  return $newConnectedUids;
450  }
451 
462  protected function ‪resolveConnectedRecordUids(array $parentConfig, $parentTableName, $parentUid, $parentFieldValue)
463  {
464  $directlyConnectedIds = ‪GeneralUtility::trimExplode(',', $parentFieldValue);
465  if (empty($parentConfig['MM'])) {
466  $parentUid = $this->‪getLiveDefaultId($parentTableName, $parentUid);
467  }
468  $relationHandler = GeneralUtility::makeInstance(RelationHandler::class);
469  $relationHandler->start($parentFieldValue, $parentConfig['foreign_table'] ?? '', $parentConfig['MM'] ?? '', $parentUid, $parentTableName, $parentConfig);
470  $foreignRecordUids = $relationHandler->getValueArray();
471  $resolvedForeignRecordUids = [];
472  foreach ($foreignRecordUids as $aForeignRecordUid) {
473  if ($parentConfig['MM'] ?? $parentConfig['foreign_field'] ?? false) {
474  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
475  } else {
476  foreach ($directlyConnectedIds as $id) {
477  if ((int)$aForeignRecordUid === (int)$id) {
478  $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
479  }
480  }
481  }
482  }
483  return $resolvedForeignRecordUids;
484  }
485 
495  protected function ‪getLiveDefaultId($tableName, ‪$uid)
496  {
497  $liveDefaultId = BackendUtility::getLiveVersionIdOfRecord($tableName, ‪$uid);
498  if ($liveDefaultId === null) {
499  $liveDefaultId = ‪$uid;
500  }
501  return $liveDefaultId;
502  }
503 
508  protected function ‪getChildChildTableName(string $foreignSelector, array $childConfiguration): string
509  {
510  $config = $childConfiguration['processedTca']['columns'][$foreignSelector]['config'] ?? [];
511  $type = $config['type'] ?? '';
512 
513  return match ($type) {
514  'select' => $config['foreign_table'] ?? '',
515  'group' => ‪GeneralUtility::trimExplode(',', $config['allowed'] ?? '', true)[0] ?? '',
516  default => '',
517  };
518  }
519 
521  {
522  return ‪$GLOBALS['BE_USER'];
523  }
524 
526  {
527  return ‪$GLOBALS['LANG'];
528  }
529 }
‪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:328
‪TYPO3\CMS\Core\Database\RelationHandler
Definition: RelationHandler.php:36
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getBackendUser
‪getBackendUser()
Definition: TcaInline.php:520
‪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:276
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\getLanguageService
‪getLanguageService()
Definition: TcaInline.php:525
‪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:462
‪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\getSubstitutedWorkspacedUids
‪int[] getSubstitutedWorkspacedUids(array $connectedUids, string $childTableName)
Definition: TcaInline.php:431
‪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:508
‪TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline\compileChildChild
‪array compileChildChild(array $child, array $parentConfig)
Definition: TcaInline.php:399
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪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\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:495
‪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:237
‪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:822