[!!!][TASK] Remove sys_domain.forced database field 40/54540/8
authorBenni Mack <benni@typo3.org>
Fri, 3 Nov 2017 10:43:48 +0000 (11:43 +0100)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Wed, 8 Nov 2017 09:34:36 +0000 (10:34 +0100)
The DB setting "sys_domain.forced" is confusing and does not make sense
nowadays, especially with nested domain records - where the rootline is now
correctly traversed with the RootLine utility.

Resolves: #82926
Releases: master
Change-Id: I874c54aeb03c0b62c9a1cebc9d629cee7550ec0b
Reviewed-on: https://review.typo3.org/54540
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Daniel Gorges <daniel.gorges@b13.de>
Tested-by: Daniel Gorges <daniel.gorges@b13.de>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
typo3/sysext/backend/Tests/Functional/Utility/Fixtures/sys_domain.xml
typo3/sysext/core/Documentation/Changelog/master/Breaking-82926-RemovedDatabaseFieldSysDomainForcedFlag.rst [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Deprecation-82926-DomainRelatedApiMethodInTSFE.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/frontend/Classes/Typolink/PageLinkBuilder.php
typo3/sysext/frontend/Configuration/TCA/sys_domain.php
typo3/sysext/frontend/Resources/Private/Language/locallang_tca.xlf
typo3/sysext/frontend/Tests/Functional/Controller/TypoScriptFrontendControllerTest.php
typo3/sysext/frontend/Tests/Functional/Tca/DomainVisibleFieldsTest.php
typo3/sysext/frontend/ext_tables.sql
typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php

index ba49fcf..87123b5 100644 (file)
@@ -6,7 +6,6 @@
         <tstamp>1487563944</tstamp>
         <hidden>0</hidden>
         <domainName>example.com</domainName>
-        <forced>1</forced>
     </sys_domain>
     <sys_domain>
         <uid>2</uid>
@@ -16,6 +15,5 @@
         <domainName>www.example.net</domainName>
         <redirectTo>http://example.com/</redirectTo>
         <redirectHttpStatusCode>301</redirectHttpStatusCode>
-        <forced>0</forced>
     </sys_domain>
 </dataset>
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-82926-RemovedDatabaseFieldSysDomainForcedFlag.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82926-RemovedDatabaseFieldSysDomainForcedFlag.rst
new file mode 100644 (file)
index 0000000..a8de437
--- /dev/null
@@ -0,0 +1,44 @@
+.. include:: ../../Includes.txt
+
+===========================================================
+Breaking: #82926 - Removed database field sys_domain.forced
+===========================================================
+
+See :issue:`82926`
+
+Description
+===========
+
+The database field "sys_domain.forced" (Checkbox "Always prepend this domain in links" in Domain Records)
+and its functionality has been removed.
+
+Previously, setting the checkbox allowed to prepend a specific domain to TypoLink-generated links, but only
+if the visiting HTTP_HOST did not match any of other domain records on the same page (without redirect).
+
+It was however, only partially useful, as - depending on which HTTP_HOST the site was accessed the first time,
+and thus, the links were generated and written to cache - resulting in ambiguous cache entries.
+
+Impact
+======
+
+Custom links having multiple domains in one pagetree without redirects and the forced flag will
+not force a certain domain anymore via TypoLink.
+
+
+Affected Installations
+======================
+
+Installations using this flag (can be checked with a simple SQL query ``SELECT uid, pid, domainName
+FROM sys_domain WHERE forced=1``) and using that on purpose with a lot of non-redirect domains
+for the same page tree.
+
+
+Migration
+=========
+
+If a site has a special use-case, hooks for page link generation can be used to prepend specific domains to links.
+
+Also, if queries are made against sys_domain in third-party extensions, ensure this field is not selected or
+evaluated anymore, in order to avoid SQL errors.
+
+.. index:: Database, PHP-API, NotScanned
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82926-DomainRelatedApiMethodInTSFE.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82926-DomainRelatedApiMethodInTSFE.rst
new file mode 100644 (file)
index 0000000..206ad25
--- /dev/null
@@ -0,0 +1,33 @@
+.. include:: ../../Includes.txt
+
+=======================================================
+Deprecation: #82926 - Domain-related API method in TSFE
+=======================================================
+
+See :issue:`82926`
+
+Description
+===========
+
+The method ``TypoScriptFrontendController->getDomainNameForPid()`` has been marked as deprecated.
+
+
+Impact
+======
+
+Calling the method will trigger a deprecation warning.
+
+
+Affected Installations
+======================
+
+Any third-party extension using this method to retrieve a domain name for a given Page ID.
+
+
+Migration
+=========
+
+Use the method ``TypoScriptFrontendController->getDomainDataForPid()`` which returns more
+data from a domain record as array.
+
+.. index:: PHP-API, FullyScanned
\ No newline at end of file
index 08d6d03..f580b40 100644 (file)
@@ -4331,7 +4331,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
             $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_domain');
             $queryBuilder->setRestrictions(GeneralUtility::makeInstance(DefaultRestrictionContainer::class));
             $result = $queryBuilder
-                ->select('uid', 'pid', 'domainName', 'forced')
+                ->select('uid', 'pid', 'domainName')
                 ->from('sys_domain')
                 ->where(
                     $queryBuilder->expr()->eq(
@@ -4343,17 +4343,10 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 ->execute();
 
             while ($row = $result->fetch()) {
-                // if there is already an entry for this pid, check if we should overwrite it
-                if (isset($sysDomainData[$row['pid']])) {
-                    // There is already a "forced" entry, which must not be overwritten
-                    if ($sysDomainData[$row['pid']]['forced']) {
-                        continue;
-                    }
-
-                    // The current domain record is also NOT-forced, keep the old unless the new one matches the current request
-                    if (!$row['forced'] && !$this->domainNameMatchesCurrentRequest($row['domainName'])) {
-                        continue;
-                    }
+                // If there is already an entry for this pid, we should not override it
+                // Except if it is the current domain
+                if (isset($sysDomainData[$row['pid']]) && !$this->domainNameMatchesCurrentRequest($row['domainName'])) {
+                    continue;
                 }
 
                 // as we passed all previous checks, we save this domain for the current pid
@@ -4361,7 +4354,6 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                     'uid' => $row['uid'],
                     'pid' => $row['pid'],
                     'domainName' => rtrim($row['domainName'], '/'),
-                    'forced' => $row['forced'],
                 ];
             }
             $runtimeCache->set($entryIdentifier, $sysDomainData);
@@ -4385,8 +4377,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
 
     /**
      * Obtains domain data for the target pid. Domain data is an array with
-     * 'pid', 'domainName' and 'forced' members (see sys_domain table for
-     * meaning of these fields.
+     * 'pid' and 'domainName' members (see sys_domain table for meaning of these fields).
      *
      * @param int $targetPid Target page id
      * @return mixed Return domain data or NULL
@@ -4420,9 +4411,11 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      *
      * @param int $targetPid Target page id
      * @return mixed Return domain name or NULL if not found
+     * @deprecated will be removed in TYPO3 v10, as getDomainDataForPid could work
      */
     public function getDomainNameForPid($targetPid)
     {
+        trigger_error('This method will be removed in TYPO3 v10, use $TSFE->getDomainDataForPid() instead.', E_USER_DEPRECATED);
         $domainData = $this->getDomainDataForPid($targetPid);
         return $domainData ? $domainData['domainName'] : null;
     }
index fe40f61..5391792 100644 (file)
@@ -142,7 +142,8 @@ class PageLinkBuilder extends AbstractTypolinkBuilder
                 }
             }
 
-            $targetDomain = $tsfe->getDomainNameForPid($page['uid']);
+            $targetDomainRecord = $tsfe->getDomainDataForPid($page['uid']);
+            $targetDomain = $targetDomainRecord ? $targetDomainRecord['domainName'] : null;
             // Do not prepend the domain if it is the current hostname
             if (!$targetDomain || $tsfe->domainNameMatchesCurrentRequest($targetDomain)) {
                 $targetDomain = '';
index 58782d4..27ffcf1 100644 (file)
@@ -71,21 +71,13 @@ return [
                 'type' => 'check',
                 'default' => 0
             ]
-        ],
-        'forced' => [
-            'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:sys_domain.forced',
-            'exclude' => true,
-            'config' => [
-                'type' => 'check',
-                'default' => 0
-            ]
         ]
     ],
     'types' => [
         '1' => [
             'showitem' => '
                 --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
-                    domainName,--palette--;;1, prepend_params, forced,
+                    domainName,--palette--;;1, prepend_params,
                 --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
                     hidden,
                 --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended,
index c5be983..3c5069f 100644 (file)
                        <trans-unit id="sys_domain.prepend_params">
                                <source>Transfer parameters to Redirect URL:</source>
                        </trans-unit>
-                       <trans-unit id="sys_domain.forced">
-                               <source>Always prepend this domain in links:</source>
-                       </trans-unit>
                        <trans-unit id="sys_template">
                                <source>Template</source>
                        </trans-unit>
index 03ab52e..e8ad6b4 100644 (file)
@@ -100,19 +100,16 @@ class TypoScriptFrontendControllerTest extends \TYPO3\TestingFramework\Core\Func
                 'uid' => '1',
                 'pid' => '1',
                 'domainName' => 'typo3.org',
-                'forced' => 0,
             ],
             'foo.bar' => [
                 'uid' => '2',
                 'pid' => '1',
                 'domainName' => 'foo.bar',
-                'forced' => 0,
             ],
             'example.com' => [
                 'uid' => '3',
                 'pid' => '1',
                 'domainName' => 'example.com',
-                'forced' => 0,
             ],
         ];
 
@@ -145,65 +142,6 @@ class TypoScriptFrontendControllerTest extends \TYPO3\TestingFramework\Core\Func
     }
 
     /**
-     * @param string $currentDomain
-     * @test
-     * @dataProvider getSysDomainCacheDataProvider
-     */
-    public function getSysDomainCacheReturnsForcedDomainRecord($currentDomain)
-    {
-        GeneralUtility::flushInternalRuntimeCaches();
-
-        $_SERVER['HTTP_HOST'] = $currentDomain;
-        $domainRecords = [
-            'typo3.org' => [
-                'uid' => '1',
-                'pid' => '1',
-                'domainName' => 'typo3.org',
-                'forced' => 0,
-            ],
-            'foo.bar' => [
-                'uid' => '2',
-                'pid' => '1',
-                'domainName' => 'foo.bar',
-                'forced' => 1,
-            ],
-            'example.com' => [
-                'uid' => '3',
-                'pid' => '1',
-                'domainName' => 'example.com',
-                'forced' => 0,
-            ],
-        ];
-
-        $connection = (new ConnectionPool())->getConnectionForTable('sys_domain');
-
-        $sqlServerIdentityDisabled = false;
-        if ($connection->getDatabasePlatform() instanceof SQLServerPlatform) {
-            $connection->exec('SET IDENTITY_INSERT sys_domain ON');
-            $sqlServerIdentityDisabled = true;
-        }
-
-        foreach ($domainRecords as $domainRecord) {
-            $connection->insert(
-                'sys_domain',
-                $domainRecord
-            );
-        }
-
-        if ($sqlServerIdentityDisabled) {
-            $connection->exec('SET IDENTITY_INSERT sys_domain OFF');
-        }
-
-        GeneralUtility::makeInstance(CacheManager::class)->getCache('cache_runtime')->flush();
-        $expectedResult = [
-            $domainRecords[$currentDomain]['pid'] => $domainRecords['foo.bar'],
-        ];
-        $actualResult = $this->tsFrontendController->_call('getSysDomainCache');
-
-        $this->assertEquals($expectedResult, $actualResult);
-    }
-
-    /**
      * @param string $tablePid
      * @param int $now
      * @return int
index dba4ab2..ccfab84 100644 (file)
@@ -25,8 +25,7 @@ class DomainVisibleFieldsTest extends \TYPO3\TestingFramework\Core\Functional\Fu
         'domainName',
         'redirectTo',
         'redirectHttpStatusCode',
-        'prepend_params',
-        'forced',
+        'prepend_params'
     ];
 
     /**
index ec08969..23a2737 100644 (file)
@@ -152,7 +152,6 @@ CREATE TABLE sys_domain (
        redirectHttpStatusCode int(4) unsigned DEFAULT '301' NOT NULL,
        sorting int(10) unsigned DEFAULT '0' NOT NULL,
        prepend_params int(10) DEFAULT '0' NOT NULL,
-       forced tinyint(3) unsigned DEFAULT '0' NOT NULL,
 
        PRIMARY KEY (uid),
        KEY parent (pid),
index e73abe9..e720b6c 100644 (file)
@@ -1374,4 +1374,11 @@ return [
             'Breaking-82832-UseAtDaemonDroppedFromScheduler.rst',
         ],
     ],
+    'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->getDomainNameForPid' => [
+        'numberOfMandatoryArguments' => 0,
+        'maximumNumberOfArguments' => 0,
+        'restFiles' => [
+            'Deprecation-82926-DomainRelatedApiMethodInTSFE.rst',
+        ],
+    ],
 ];