[BUGFIX] Ensure most site related exceptions are handled
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Form / FormDataProvider / SiteTcaInline.php
index 9b6e540..3f7e7b7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 declare(strict_types = 1);
+
 namespace TYPO3\CMS\Backend\Form\FormDataProvider;
 
 /*
@@ -22,13 +23,14 @@ use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Backend\Form\InlineStackProcessor;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
+use TYPO3\CMS\Core\Exception\SiteNotFoundException;
 use TYPO3\CMS\Core\Site\SiteFinder;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * Special data provider for the sites configuration module.
  *
- * Handle inline children of 'sys_site"
+ * Handle inline children of 'site'
  */
 class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataProviderInterface
 {
@@ -45,8 +47,8 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
             if (!$this->isInlineField($fieldConfig)) {
                 continue;
             }
-            $childTableName = $fieldConfig['config']['foreign_table'];
-            if ($childTableName !== 'sys_site_errorhandling' && $childTableName !== 'sys_site_language') {
+            $childTableName = $fieldConfig['config']['foreign_table'] ?? '';
+            if (!in_array($childTableName, ['site_errorhandling', 'site_language', 'site_route', 'site_base_variant'], true)) {
                 throw new \RuntimeException('Inline relation to other tables not implemented', 1522494737);
             }
             $result['processedTca']['columns'][$fieldName]['children'] = [];
@@ -84,7 +86,7 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
             // If the parent is a page, use the uid(!) of the (new?) page as pid for the child records:
             if ($table === 'pages') {
                 $liveVersionId = BackendUtility::getLiveVersionIdOfRecord('pages', $row['uid']);
-                $pid = $liveVersionId === null ? $row['uid'] : $liveVersionId;
+                $pid = $liveVersionId ?? $row['uid'];
             } elseif ($row['pid'] < 0) {
                 $prevRec = BackendUtility::getRecord($table, abs($row['pid']));
                 $pid = $prevRec['pid'];
@@ -114,16 +116,20 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
         if ($result['command'] === 'edit') {
             $siteConfigurationForPageUid = (int)$result['databaseRow']['rootPageId'][0];
             $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
-            $site = $siteFinder->getSiteByRootPageId($siteConfigurationForPageUid);
+            try {
+                $site = $siteFinder->getSiteByRootPageId($siteConfigurationForPageUid);
+            } catch (SiteNotFoundException $e) {
+                $site = null;
+            }
             $siteConfiguration = $site ? $site->getConfiguration() : [];
             if (is_array($siteConfiguration[$fieldName])) {
                 $connectedUids = array_keys($siteConfiguration[$fieldName]);
             }
         }
 
-        // If we are dealing with sys_site_language, we *always* force a relation to sys_language "0"
+        // If we are dealing with site_language, we *always* force a relation to sys_language "0"
         $foreignTable = $result['processedTca']['columns'][$fieldName]['config']['foreign_table'];
-        if ($foreignTable === 'sys_site_language' && $result['command'] === 'new') {
+        if ($foreignTable === 'site_language' && $result['command'] === 'new') {
             // If new, just add a new default child
             $child = $this->compileDefaultSysSiteLanguageChild($result, $fieldName);
             $connectedUids[] = $child['databaseRow']['uid'];
@@ -140,8 +146,8 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
             }
         }
 
-        // If we are dealing with sys_site_language, we *always* force a relation to sys_language "0"
-        if ($foreignTable === 'sys_site_language' && $result['command'] === 'edit') {
+        // If we are dealing with ite_language, we *always* force a relation to sys_language "0"
+        if ($foreignTable === 'site_language' && $result['command'] === 'edit') {
             // If edit, find out if a child using sys_language "0" exists, else add it on top
             $defaultSysSiteLanguageChildFound = false;
             foreach ($result['processedTca']['columns'][$fieldName]['children'] as $child) {
@@ -256,14 +262,14 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
             'inlineTopMostParentFieldName' => $result['inlineTopMostParentFieldName'] ?: $inlineTopMostParent['field'],
         ];
 
-        if ($parentConfig['foreign_selector'] && $parentConfig['appearance']['useCombination']) {
+        if ($parentConfig['foreign_selector'] && ($parentConfig['appearance']['useCombination'] ?? false)) {
             throw new \RuntimeException('useCombination not implemented in sites module', 1522493097);
         }
         return $formDataCompiler->compile($formDataCompilerInput);
     }
 
     /**
-     * Compile default sys_site_language child using sys_language uid "0"
+     * Compile default site_language child using sys_language uid "0"
      *
      * @param array $result
      * @param string $parentFieldName
@@ -279,7 +285,7 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
         $formDataCompiler = GeneralUtility::makeInstance(FormDataCompiler::class, $formDataGroup);
         $formDataCompilerInput = [
             'command' => 'new',
-            'tableName' => 'sys_site_language',
+            'tableName' => 'site_language',
             'vanillaUid' => $result['inlineFirstPid'],
             'returnUrl' => $result['returnUrl'],
             'isInlineChild' => true,