[BUGFIX] Remove wrong break; statement in rootline check
[Packages/TYPO3.CMS.git] / typo3 / sysext / frontend / Classes / Hooks / TreelistCacheUpdateHooks.php
index 4c2ada6..34a8560 100644 (file)
@@ -15,11 +15,13 @@ namespace TYPO3\CMS\Frontend\Hooks;
  */
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Database\Connection;
+use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
- * Class that hooks into TCEmain and listens for updates to pages to update the
+ * Class that hooks into DataHandler and listens for updates to pages to update the
  * treelist cache
  */
 class TreelistCacheUpdateHooks
@@ -30,11 +32,11 @@ class TreelistCacheUpdateHooks
      *
      * @var array
      */
-    private $updateRequiringFields = array(
+    private $updateRequiringFields = [
         'pid',
         'php_tree_stop',
         'extendToSubpages'
-    );
+    ];
 
     /**
      * Constructor, adds update requiring fields to the default ones
@@ -57,27 +59,26 @@ class TreelistCacheUpdateHooks
     }
 
     /**
-     * waits for TCEmain commands and looks for changed pages, if found further
+     * waits for DataHandler commands and looks for changed pages, if found further
      * changes take place to determine whether the cache needs to be updated
      *
-     * @param string $status TCEmain operation status, either 'new' or 'update'
+     * @param string $status DataHandler operation status, either 'new' or 'update'
      * @param string $table The DB table the operation was carried out on
      * @param mixed $recordId The record's uid for update records, a string to look the record's uid up after it has been created
-     * @param array $updatedFields Array of changed fiels and their new values
-     * @param DataHandler $tceMain TCEmain parent object
-     * @return void
+     * @param array $updatedFields Array of changed fields and their new values
+     * @param DataHandler $dataHandler DataHandler parent object
      */
-    public function processDatamap_afterDatabaseOperations($status, $table, $recordId, array $updatedFields, DataHandler $tceMain)
+    public function processDatamap_afterDatabaseOperations($status, $table, $recordId, array $updatedFields, DataHandler $dataHandler)
     {
-        if ($table == 'pages' && $this->requiresUpdate($updatedFields)) {
+        if ($table === 'pages' && $this->requiresUpdate($updatedFields)) {
             $affectedPagePid = 0;
             $affectedPageUid = 0;
-            if ($status == 'new') {
+            if ($status === 'new') {
                 // Detect new pages
                 // Resolve the uid
-                $affectedPageUid = $tceMain->substNEWwithIDs[$recordId];
+                $affectedPageUid = $dataHandler->substNEWwithIDs[$recordId];
                 $affectedPagePid = $updatedFields['pid'];
-            } elseif ($status == 'update') {
+            } elseif ($status === 'update') {
                 // Detect updated pages
                 $affectedPageUid = $recordId;
                 // When updating a page the pid is not directly available so we
@@ -98,10 +99,9 @@ class TreelistCacheUpdateHooks
      * @param string $table The record's table
      * @param int $recordId The record's uid
      * @param array $commandValue The commands value, typically an array with more detailed command information
-     * @param DataHandler $tceMain The TCEmain parent object
-     * @return void
+     * @param DataHandler $dataHandler The DataHandler parent object
      */
-    public function processCmdmap_postProcess($command, $table, $recordId, $commandValue, DataHandler $tceMain)
+    public function processCmdmap_postProcess($command, $table, $recordId, $commandValue, DataHandler $dataHandler)
     {
         $action = (is_array($commandValue) && isset($commandValue['action'])) ? (string)$commandValue['action'] : '';
         if ($table === 'pages' && ($command === 'delete' || ($command === 'version' && $action === 'swap'))) {
@@ -110,7 +110,7 @@ class TreelistCacheUpdateHooks
             $affectedPagePid = $affectedRecord['pid'];
 
             // Faking the updated fields
-            $updatedFields = array();
+            $updatedFields = [];
             if ($command === 'delete') {
                 $updatedFields['deleted'] = 1;
             } else {
@@ -127,7 +127,7 @@ class TreelistCacheUpdateHooks
     }
 
     /**
-     * waits for TCEmain commands and looks for moved pages, if found further
+     * waits for DataHandler commands and looks for moved pages, if found further
      * changes take place to determine whether the cache needs to be updated
      *
      * @param string $table Table name of the moved record
@@ -135,12 +135,11 @@ class TreelistCacheUpdateHooks
      * @param int $destinationPid The record's destination page id
      * @param array $movedRecord The record that moved
      * @param array $updatedFields Array of changed fields
-     * @param DataHandler $tceMain TCEmain parent object
-     * @return void
+     * @param DataHandler $dataHandler DataHandler parent object
      */
-    public function moveRecord_firstElementPostProcess($table, $recordId, $destinationPid, array $movedRecord, array $updatedFields, DataHandler $tceMain)
+    public function moveRecord_firstElementPostProcess($table, $recordId, $destinationPid, array $movedRecord, array $updatedFields, DataHandler $dataHandler)
     {
-        if ($table == 'pages' && $this->requiresUpdate($updatedFields)) {
+        if ($table === 'pages' && $this->requiresUpdate($updatedFields)) {
             $affectedPageUid = $recordId;
             $affectedPageOldPid = $movedRecord['pid'];
             $affectedPageNewPid = $updatedFields['pid'];
@@ -153,7 +152,7 @@ class TreelistCacheUpdateHooks
     }
 
     /**
-     * Waits for TCEmain commands and looks for moved pages, if found further
+     * Waits for DataHandler commands and looks for moved pages, if found further
      * changes take place to determine whether the cache needs to be updated
      *
      * @param string $table Table name of the moved record
@@ -162,12 +161,11 @@ class TreelistCacheUpdateHooks
      * @param int $originalDestinationPid (negative) page id th page has been moved after
      * @param array $movedRecord The record that moved
      * @param array $updatedFields Array of changed fields
-     * @param DataHandler $tceMain TCEmain parent object
-     * @return void
+     * @param DataHandler $dataHandler DataHandler parent object
      */
-    public function moveRecord_afterAnotherElementPostProcess($table, $recordId, $destinationPid, $originalDestinationPid, array $movedRecord, array $updatedFields, DataHandler $tceMain)
+    public function moveRecord_afterAnotherElementPostProcess($table, $recordId, $destinationPid, $originalDestinationPid, array $movedRecord, array $updatedFields, DataHandler $dataHandler)
     {
-        if ($table == 'pages' && $this->requiresUpdate($updatedFields)) {
+        if ($table === 'pages' && $this->requiresUpdate($updatedFields)) {
             $affectedPageUid = $recordId;
             $affectedPageOldPid = $movedRecord['pid'];
             $affectedPageNewPid = $updatedFields['pid'];
@@ -190,7 +188,7 @@ class TreelistCacheUpdateHooks
         $requiresUpdate = false;
         $updatedFieldNames = array_keys($updatedFields);
         foreach ($updatedFieldNames as $updatedFieldName) {
-            if (in_array($updatedFieldName, $this->updateRequiringFields)) {
+            if (in_array($updatedFieldName, $this->updateRequiringFields, true)) {
                 $requiresUpdate = true;
                 break;
             }
@@ -199,13 +197,12 @@ class TreelistCacheUpdateHooks
     }
 
     /**
-     * Calls the cache maintainance functions according to the determined actions
+     * Calls the cache maintenance functions according to the determined actions
      *
      * @param int $affectedPage uid of the affected page
      * @param int $affectedParentPage parent uid of the affected page
      * @param array $updatedFields Array of updated fields and their new values
      * @param array $actions Array of actions to carry out
-     * @return void
      */
     protected function processClearCacheActions($affectedPage, $affectedParentPage, $updatedFields, array $actions)
     {
@@ -228,7 +225,7 @@ class TreelistCacheUpdateHooks
         // From time to time clean the cache from expired entries
         // (theoretically every 1000 calls)
         $randomNumber = rand(1, 1000);
-        if ($randomNumber == 500) {
+        if ($randomNumber === 500) {
             $this->removeExpiredCacheEntries();
         }
     }
@@ -238,20 +235,28 @@ class TreelistCacheUpdateHooks
      * gets called after creating a new page and after moving a page
      *
      * @param int $affectedParentPage Parent page id of the changed page, the page to start clearing from
-     * @return void
      */
     protected function clearCacheForAllParents($affectedParentPage)
     {
         $rootLine = BackendUtility::BEgetRootLine($affectedParentPage);
-        $rootLineIds = array();
+        $rootLineIds = [];
         foreach ($rootLine as $page) {
             if ($page['uid'] != 0) {
                 $rootLineIds[] = $page['uid'];
             }
         }
         if (!empty($rootLineIds)) {
-            $rootLineIdsImploded = implode(',', $rootLineIds);
-            $this->getDatabaseConnection()->exec_DELETEquery('cache_treelist', 'pid IN(' . $rootLineIdsImploded . ')');
+            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
+                ->getQueryBuilderForTable('cache_treelist');
+            $queryBuilder
+                ->delete('cache_treelist')
+                ->where(
+                    $queryBuilder->expr()->in(
+                        'pid',
+                        $queryBuilder->createNamedParameter($rootLineIds, Connection::PARAM_INT_ARRAY)
+                    )
+                )
+                ->execute();
         }
     }
 
@@ -260,11 +265,17 @@ class TreelistCacheUpdateHooks
      * in the treelist
      *
      * @param int $affectedPage ID of the changed page
-     * @return void
      */
     protected function clearCacheWhereUidInTreelist($affectedPage)
     {
-        $this->getDatabaseConnection()->exec_DELETEquery('cache_treelist', $this->getDatabaseConnection()->listQuery('treelist', $affectedPage, 'cache_treelist'));
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
+            ->getQueryBuilderForTable('cache_treelist');
+        $queryBuilder
+            ->delete('cache_treelist')
+            ->where(
+                $queryBuilder->expr()->inSet('treelist', $queryBuilder->quote($affectedPage))
+            )
+            ->execute();
     }
 
     /**
@@ -273,40 +284,53 @@ class TreelistCacheUpdateHooks
      *
      * @param int $affectedPage Uid of the changed page
      * @param int $expirationTime
-     * @return void
      */
     protected function setCacheExpiration($affectedPage, $expirationTime)
     {
-        $this->getDatabaseConnection()->exec_UPDATEquery('cache_treelist', $this->getDatabaseConnection()->listQuery('treelist', $affectedPage, 'cache_treelist'), array(
-            'expires' => $expirationTime
-        ));
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
+            ->getQueryBuilderForTable('cache_treelist');
+        $queryBuilder
+            ->update('cache_treelist')
+            ->where(
+                $queryBuilder->expr()->inSet('treelist', $queryBuilder->quote($affectedPage))
+            )
+            ->set('expires', $expirationTime)
+            ->execute();
     }
 
     /**
      * Removes all expired treelist cache entries
-     *
-     * @return void
      */
     protected function removeExpiredCacheEntries()
     {
-        $this->getDatabaseConnection()->exec_DELETEquery('cache_treelist', 'expires <= ' . $GLOBALS['EXEC_TIME']);
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
+            ->getQueryBuilderForTable('cache_treelist');
+        $queryBuilder
+            ->delete('cache_treelist')
+            ->where(
+                $queryBuilder->expr()->lte(
+                    'expires',
+                    $queryBuilder->createNamedParameter($GLOBALS['EXEC_TIME'], \PDO::PARAM_INT)
+                )
+            )
+            ->execute();
     }
 
     /**
      * Determines what happened to the page record, this is necessary to clear
      * as less cache entries as needed later
      *
-     * @param string $status TCEmain operation status, either 'new' or 'update'
+     * @param string $status DataHandler operation status, either 'new' or 'update'
      * @param array $updatedFields Array of updated fields
      * @return string List of actions that happened to the page record
      */
     protected function determineClearCacheActions($status, $updatedFields)
     {
-        $actions = array();
-        if ($status == 'new') {
+        $actions = [];
+        if ($status === 'new') {
             // New page
             $actions['allParents'] = true;
-        } elseif ($status == 'update') {
+        } elseif ($status === 'update') {
             $updatedFieldNames = array_keys($updatedFields);
             foreach ($updatedFieldNames as $updatedFieldName) {
                 switch ($updatedFieldName) {
@@ -341,7 +365,7 @@ class TreelistCacheUpdateHooks
                         }
                         break;
                     default:
-                        if (in_array($updatedFieldName, $this->updateRequiringFields)) {
+                        if (in_array($updatedFieldName, $this->updateRequiringFields, true)) {
                             $actions['uidInTreelist'] = true;
                         }
                 }
@@ -349,14 +373,4 @@ class TreelistCacheUpdateHooks
         }
         return $actions;
     }
-
-    /**
-     * Returns the database connection
-     *
-     * @return \TYPO3\CMS\Core\Database\DatabaseConnection
-     */
-    protected function getDatabaseConnection()
-    {
-        return $GLOBALS['TYPO3_DB'];
-    }
 }