[BUGFIX] Ensure most site related exceptions are handled
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Form / FormDataProvider / SiteTcaInline.php
index c4cf7d3..3f7e7b7 100644 (file)
@@ -23,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
 {
@@ -46,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'] = [];
@@ -115,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'];
@@ -141,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) {
@@ -264,7 +269,7 @@ class SiteTcaInline extends AbstractDatabaseRecordProvider implements FormDataPr
     }
 
     /**
-     * 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
@@ -280,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,