48 foreach ($result[
'processedTca'][
'columns'] as $fieldName => $fieldConfig) {
52 $result[
'processedTca'][
'columns'][$fieldName][
'children'] = [];
56 if ($result[
'inlineResolveExistingChildren']) {
73 return !empty($fieldConfig[
'config'][
'type']) && $fieldConfig[
'config'][
'type'] ===
'inline';
97 if ($result[
'inlineFirstPid'] ===
null) {
98 $table = $result[
'tableName'];
99 $row = $result[
'databaseRow'];
101 if ($table ===
'pages') {
103 $pid = $liveVersionId ===
null ? $row[
'uid'] : $liveVersionId;
104 } elseif (($row[
'pid'] ?? 0) < 0) {
106 $pid = $prevRec[
'pid'];
108 $pid = $row[
'pid'] ?? 0;
112 if ((
int)$pageRecord[
$GLOBALS[
'TCA'][
'pages'][
'ctrl'][
'transOrigPointerField']] > 0) {
113 $pid = (int)$pageRecord[
$GLOBALS[
'TCA'][
'pages'][
'ctrl'][
'transOrigPointerField']];
115 } elseif (strpos($pid,
'NEW') !== 0) {
116 throw new \RuntimeException(
117 'inlineFirstPid should either be an integer or a "NEW..." string',
121 $result[
'inlineFirstPid'] = $pid;
136 $childTableName = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'foreign_table'];
138 $connectedUidsOfLocalizedOverlay = [];
139 if ($result[
'command'] ===
'edit') {
141 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
142 $result[
'tableName'],
143 $result[
'databaseRow'][
'uid'],
144 $result[
'databaseRow'][$fieldName]
147 $result[
'databaseRow'][$fieldName] = implode(
',', $connectedUidsOfLocalizedOverlay);
148 $connectedUidsOfLocalizedOverlay = $this->
getWorkspacedUids($connectedUidsOfLocalizedOverlay, $childTableName);
149 if ($result[
'inlineCompileExistingChildren']) {
150 $tableNameWithDefaultRecords = $result[
'tableName'];
152 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
153 $tableNameWithDefaultRecords,
154 $result[
'defaultLanguageRow'][
'uid'],
155 $result[
'defaultLanguageRow'][$fieldName]
157 $connectedUidsOfDefaultLanguageRecord = $this->
getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
159 $showPossible = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'appearance'][
'showPossibleLocalizationRecords'];
163 $fieldNameWithDefaultLanguageUid =
$GLOBALS[
'TCA'][$childTableName][
'ctrl'][
'transOrigPointerField'];
164 foreach ($connectedUidsOfLocalizedOverlay as $localizedUid) {
169 $this->logger->warning(
172 'table' => $childTableName,
173 'uid' => $localizedUid,
179 $uidOfDefaultLanguageRecord = $localizedRecord[$fieldNameWithDefaultLanguageUid];
180 if (in_array($uidOfDefaultLanguageRecord, $connectedUidsOfDefaultLanguageRecord)) {
182 $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, [$uidOfDefaultLanguageRecord]);
185 $compiledChild = $this->
compileChild($result, $fieldName, $localizedUid);
186 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $compiledChild;
189 foreach ($connectedUidsOfDefaultLanguageRecord as $defaultLanguageUid) {
193 $compiledChild = $this->
compileChild($result, $fieldName, $defaultLanguageUid);
196 $this->logger->warning(
199 'table' => $childTableName,
200 'uid' => $defaultLanguageUid,
206 $compiledChild[
'isInlineDefaultLanguageRecordInLocalizedParentContext'] =
true;
207 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $compiledChild;
225 if ($result[
'defaultLanguageRow'] !==
null) {
229 $childTableName = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'foreign_table'];
231 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
232 $result[
'tableName'],
233 $result[
'databaseRow'][
'uid'],
234 $result[
'databaseRow'][$fieldName]
236 $result[
'databaseRow'][$fieldName] = implode(
',', $connectedUidsOfDefaultLanguageRecord);
238 $connectedUidsOfDefaultLanguageRecord = $this->
getWorkspacedUids($connectedUidsOfDefaultLanguageRecord, $childTableName);
240 if ($result[
'inlineCompileExistingChildren']) {
241 foreach ($connectedUidsOfDefaultLanguageRecord as $uid) {
242 $compiledChild = $this->
compileChild($result, $fieldName, $uid);
243 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $compiledChild;
260 if (!is_array($result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniqueConfiguration'])) {
264 $selectorOrUniqueConfiguration = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniqueConfiguration'];
265 $foreignFieldName = $selectorOrUniqueConfiguration[
'fieldName'];
266 $selectorOrUniquePossibleRecords = [];
268 if ($selectorOrUniqueConfiguration[
'config'][
'type'] ===
'select') {
271 'tableName' => $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'foreign_table'],
275 'pageTsConfig' => $result[
'pageTsConfig'],
276 'userTsConfig' => $result[
'userTsConfig'],
277 'databaseRow' => $result[
'databaseRow'],
281 $foreignFieldName => [
282 'config' => $selectorOrUniqueConfiguration[
'config'],
286 'inlineExpandCollapseStateArray' => $result[
'inlineExpandCollapseStateArray'],
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'];
297 $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniquePossibleRecords'] = $selectorOrUniquePossibleRecords;
310 protected function compileChild(array $result, $parentFieldName, $childUid)
312 $parentConfig = $result[
'processedTca'][
'columns'][$parentFieldName][
'config'];
313 $childTableName = $parentConfig[
'foreign_table'];
316 $inlineStackProcessor = GeneralUtility::makeInstance(InlineStackProcessor::class);
317 $inlineStackProcessor->initializeByGivenStructure($result[
'inlineStructure']);
318 $inlineTopMostParent = $inlineStackProcessor->getStructureLevel(0);
321 $formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class);
323 $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
324 $formDataCompilerInput = [
326 'tableName' => $childTableName,
327 'vanillaUid' => (int)$childUid,
331 'returnUrl' => $result[
'returnUrl'],
332 'isInlineChild' =>
true,
333 'inlineStructure' => $result[
'inlineStructure'],
334 'inlineExpandCollapseStateArray' => $result[
'inlineExpandCollapseStateArray'],
335 'inlineFirstPid' => $result[
'inlineFirstPid'],
336 'inlineParentConfig' => $parentConfig,
340 'inlineParentUid' => $result[
'databaseRow'][
'uid'],
341 'inlineParentTableName' => $result[
'tableName'],
342 'inlineParentFieldName' => $parentFieldName,
345 'inlineTopMostParentUid' => $result[
'inlineTopMostParentUid'] ?: $inlineTopMostParent[
'uid'],
346 'inlineTopMostParentTableName' => $result[
'inlineTopMostParentTableName'] ?: $inlineTopMostParent[
'table'],
347 'inlineTopMostParentFieldName' => $result[
'inlineTopMostParentFieldName'] ?: $inlineTopMostParent[
'field'],
353 $mainChild = $formDataCompiler->compile($formDataCompilerInput);
354 if ($parentConfig[
'foreign_selector'] && $parentConfig[
'appearance'][
'useCombination']) {
356 $mainChild[
'combinationChild'] = $this->
compileChildChild($mainChild, $parentConfig);
361 $this->
getLanguageService()->sL(
'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:formEngine.databaseRecordErrorInlineChildChild'),
364 $flashMessage = GeneralUtility::makeInstance(
370 GeneralUtility::makeInstance(FlashMessageService::class)->getMessageQueueByIdentifier()->enqueue($flashMessage);
387 $childChildUid = $child[
'databaseRow'][$parentConfig[
'foreign_selector']][0];
389 $childChildTableName = $child[
'processedTca'][
'columns'][$parentConfig[
'foreign_selector']][
'config'][
'foreign_table'];
391 $formDataGroup = GeneralUtility::makeInstance(TcaDatabaseRecord::class);
393 $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
395 $formDataCompilerInput = [
397 'tableName' => $childChildTableName,
398 'vanillaUid' => (int)$childChildUid,
399 'isInlineChild' =>
true,
400 'isInlineChildExpanded' => $child[
'isInlineChildExpanded'],
402 'inlineStructure' => $child[
'inlineStructure'],
403 'inlineFirstPid' => $child[
'inlineFirstPid'],
405 'inlineTopMostParentUid' => $child[
'inlineTopMostParentUid'],
406 'inlineTopMostParentTableName' => $child[
'inlineTopMostParentTableName'],
407 'inlineTopMostParentFieldName' => $child[
'inlineTopMostParentFieldName'],
409 $childChild = $formDataCompiler->compile($formDataCompilerInput);
423 $newConnectedUids = [];
424 foreach ($connectedUids as $uid) {
429 if (!empty($workspaceVersion)) {
434 $uid = $workspaceVersion[
'uid'];
437 $newConnectedUids[] = $uid;
439 return $newConnectedUids;
454 $directlyConnectedIds = GeneralUtility::trimExplode(
',', $parentFieldValue);
455 if (empty($parentConfig[
'MM'])) {
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;
468 foreach ($directlyConnectedIds as $id) {
469 if ((
int)$aForeignRecordUid === (int)$id) {
470 $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
475 return $resolvedForeignRecordUids;
490 if ($liveDefaultId ===
null) {
491 $liveDefaultId = $uid;
493 return $liveDefaultId;