2 namespace TYPO3\CMS\Backend\Form\FormDataProvider;
43 foreach ($result[
'processedTca'][
'columns'] as $fieldName => $fieldConfig) {
44 if (empty($fieldConfig[
'config'][
'type']) || $fieldConfig[
'config'][
'type'] !==
'inline') {
47 $result[
'processedTca'][
'columns'][$fieldName][
'children'] = [];
48 if ($result[
'inlineResolveExistingChildren']) {
50 $result = $this->addForeignSelectorAndUniquePossibleRecords($result, $fieldName);
67 if (is_null($result[
'inlineFirstPid'])) {
68 $table = $result[
'tableName'];
69 $row = $result[
'databaseRow'];
71 if ($table ==
'pages') {
73 $pid = is_null($liveVersionId) ? $row[
'uid'] : $liveVersionId;
74 }
elseif ($row[
'pid'] < 0) {
76 $pid = $prevRec[
'pid'];
80 $result[
'inlineFirstPid'] = (int)$pid;
95 $childTableName = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'foreign_table'];
111 $mode = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'behaviour'][
'localizationMode'];
112 if ($mode ===
'none') {
115 if ($result[
'command'] ===
'edit') {
116 $connectedUids = $this->resolveConnectedRecordUids(
117 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
118 $result[
'tableName'],
119 $result[
'databaseRow'][
'uid'],
120 $result[
'databaseRow'][$fieldName]
123 $result[
'databaseRow'][$fieldName] = implode(
',', $connectedUids);
127 if ($result[
'inlineCompileExistingChildren']) {
128 foreach ($connectedUids as $childUid) {
129 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $this->compileChild($result, $fieldName, $childUid);
132 }
elseif ($mode ===
'keep') {
134 $connectedUids = $this->resolveConnectedRecordUids(
135 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
136 $result[
'tableName'],
137 $result[
'defaultLanguageRow'][
'uid'],
138 $result[
'defaultLanguageRow'][$fieldName]
140 $result[
'databaseRow'][$fieldName] = implode(
',', $connectedUids);
142 if ($result[
'inlineCompileExistingChildren']) {
143 foreach ($connectedUids as $childUid) {
144 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $this->compileChild($result, $fieldName, $childUid);
148 $connectedUidsOfLocalizedOverlay = [];
149 if ($result[
'command'] ===
'edit') {
150 $connectedUidsOfLocalizedOverlay = $this->resolveConnectedRecordUids(
151 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
152 $result[
'tableName'],
153 $result[
'databaseRow'][
'uid'],
154 $result[
'databaseRow'][$fieldName]
157 $result[
'databaseRow'][$fieldName] = implode(
',', $connectedUidsOfLocalizedOverlay);
158 if ($result[
'inlineCompileExistingChildren']) {
159 $connectedUidsOfDefaultLanguageRecord = $this->resolveConnectedRecordUids(
160 $result[
'processedTca'][
'columns'][$fieldName][
'config'],
161 $result[
'tableName'],
162 $result[
'defaultLanguageRow'][
'uid'],
163 $result[
'defaultLanguageRow'][$fieldName]
166 $showPossible = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'appearance'][
'showPossibleLocalizationRecords'];
170 $fieldNameWithDefaultLanguageUid =
$GLOBALS[
'TCA'][$childTableName][
'ctrl'][
'transOrigPointerField'];
171 foreach ($connectedUidsOfLocalizedOverlay as $localizedUid) {
173 $uidOfDefaultLanguageRecord = $localizedRecord[$fieldNameWithDefaultLanguageUid];
174 if (in_array($uidOfDefaultLanguageRecord, $connectedUidsOfDefaultLanguageRecord)) {
176 $connectedUidsOfDefaultLanguageRecord = array_diff($connectedUidsOfDefaultLanguageRecord, array($uidOfDefaultLanguageRecord));
178 $compiledChild = $this->compileChild($result, $fieldName, $localizedUid);
179 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $compiledChild;
183 foreach ($connectedUidsOfDefaultLanguageRecord as $defaultLanguageUid) {
186 $compiledChild = $this->compileChild($result, $fieldName, $defaultLanguageUid);
187 $compiledChild[
'isInlineDefaultLanguageRecordInLocalizedParentContext'] =
true;
188 $result[
'processedTca'][
'columns'][$fieldName][
'children'][] = $compiledChild;
206 protected function addForeignSelectorAndUniquePossibleRecords(array $result, $fieldName)
208 if (!is_array($result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniqueConfiguration'])) {
212 $selectorOrUniqueConfiguration = $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniqueConfiguration'];
213 $foreignFieldName = $selectorOrUniqueConfiguration[
'fieldName'];
214 $selectorOrUniquePossibleRecords = [];
216 if ($selectorOrUniqueConfiguration[
'config'][
'type'] ===
'select') {
219 'tableName' => $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'foreign_table'],
223 'pageTsConfig' => $result[
'pageTsConfig'],
224 'userTsConfig' => $result[
'userTsConfig'],
228 $foreignFieldName => [
229 'config' => $selectorOrUniqueConfiguration[
'config'],
233 'inlineExpandCollapseStateArray' => $result[
'inlineExpandCollapseStateArray'],
237 $formDataGroup->setProviderList([ TcaSelectItems::class ]);
240 $compilerResult = $formDataCompiler->compile($selectDataInput);
241 $selectorOrUniquePossibleRecords = $compilerResult[
'processedTca'][
'columns'][$foreignFieldName][
'config'][
'items'];
244 $result[
'processedTca'][
'columns'][$fieldName][
'config'][
'selectorOrUniquePossibleRecords'] = $selectorOrUniquePossibleRecords;
257 protected function compileChild(array $result, $parentFieldName, $childUid)
259 $parentConfig = $result[
'processedTca'][
'columns'][$parentFieldName][
'config'];
260 $childTableName = $parentConfig[
'foreign_table'];
264 $inlineStackProcessor->initializeByGivenStructure($result[
'inlineStructure']);
265 $inlineTopMostParent = $inlineStackProcessor->getStructureLevel(0);
271 $formDataCompilerInput = [
273 'tableName' => $childTableName,
274 'vanillaUid' => (int)$childUid,
275 'isInlineChild' =>
true,
276 'inlineStructure' => $result[
'inlineStructure'],
277 'inlineExpandCollapseStateArray' => $result[
'inlineExpandCollapseStateArray'],
278 'inlineFirstPid' => $result[
'inlineFirstPid'],
279 'inlineParentConfig' => $parentConfig,
283 'inlineParentUid' => $result[
'databaseRow'][
'uid'],
284 'inlineParentTableName' => $result[
'tableName'],
285 'inlineParentFieldName' => $parentFieldName,
288 'inlineTopMostParentUid' => $result[
'inlineTopMostParentUid'] ?: $inlineTopMostParent[
'uid'],
289 'inlineTopMostParentTableName' => $result[
'inlineTopMostParentTableName'] ?: $inlineTopMostParent[
'table'],
290 'inlineTopMostParentFieldName' => $result[
'inlineTopMostParentFieldName'] ?: $inlineTopMostParent[
'field'],
296 $mainChild = $formDataCompiler->compile($formDataCompilerInput);
297 if ($parentConfig[
'foreign_selector'] && $parentConfig[
'appearance'][
'useCombination']) {
314 $intermediateUid = $intermediate[
'databaseRow'][$parentConfig[
'foreign_selector']][0];
315 $combinationChild = $this->compileChild($intermediate, $parentConfig[
'foreign_selector'], $intermediateUid);
316 return $combinationChild;
329 $newConnectedUids = [];
330 foreach ($connectedUids as $uid) {
335 if ($workspaceVersion !==
false) {
340 $uid = $workspaceVersion[
'uid'];
343 $newConnectedUids[] = $uid;
345 return $newConnectedUids;
358 protected function resolveConnectedRecordUids(array $parentConfig, $parentTableName, $parentUid, $parentFieldValue)
361 if (empty($parentConfig[
'MM'])) {
366 $relationHandler->registerNonTableValues = (bool)$parentConfig[
'allowedIdValues'];
367 $relationHandler->start($parentFieldValue, $parentConfig[
'foreign_table'], $parentConfig[
'MM'], $parentUid, $parentTableName, $parentConfig);
368 $foreignRecordUids = $relationHandler->getValueArray();
369 $resolvedForeignRecordUids = [];
370 foreach ($foreignRecordUids as $aForeignRecordUid) {
371 if ($parentConfig[
'MM'] || $parentConfig[
'foreign_field']) {
372 $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
374 foreach ($directlyConnectedIds as $id) {
375 if ((
int)$aForeignRecordUid === (int)$id) {
376 $resolvedForeignRecordUids[] = (int)$aForeignRecordUid;
381 return $resolvedForeignRecordUids;
396 if ($liveDefaultId === null) {
397 $liveDefaultId = $uid;
399 return $liveDefaultId;