Browse Source

Split paging params building into smaller methods for easy overriding.

ADmad 6 years ago
parent
commit
c02272f840

+ 99 - 31
src/Datasource/Paginator.php

@@ -250,55 +250,123 @@ class Paginator implements PaginatorInterface
      */
     protected function buildParams(array $data)
     {
-        $defaults = $data['defaults'];
-        $count = $data['count'];
-        $numResults = $data['numResults'];
-        $requestedPage = $page = $data['options']['page'];
         $limit = $data['options']['limit'];
 
-        $order = (array)$data['options']['order'];
-        $sortDefault = $directionDefault = false;
-        if (!empty($defaults['order']) && count($defaults['order']) === 1) {
-            $sortDefault = key($defaults['order']);
-            $directionDefault = current($defaults['order']);
-        }
+        $paging = [
+            'count' => $data['count'],
+            'current' => $data['numResults'],
+            'perPage' => $limit,
+            'page' => $data['options']['page'],
+            'requestedPage' => $data['options']['page'],
+        ];
+
+        $paging = $this->addPageCountParams($paging, $data);
+        $paging = $this->addStartEndParams($paging, $data);
+        $paging = $this->addPrevNextParams($paging, $data);
+        $paging = $this->addSortingParams($paging, $data);
+
+        $paging += [
+            'limit' => $data['defaults']['limit'] != $limit ? $limit : null,
+            'scope' => $data['options']['scope'],
+            'finder' => $data['finder'],
+        ];
 
+        return $paging;
+    }
+
+    /**
+     * Add "page" and "pageCount" params.
+     *
+     * @param array $params Paging params.
+     * @param array $data Paginator data.
+     * @return array Updated params.
+     */
+    protected function addPageCountParams(array $params, array $data)
+    {
+        $page = $params['page'];
         $pageCount = 0;
-        if ($count !== null) {
-            $pageCount = max((int)ceil($count / $limit), 1);
+
+        if ($params['count'] !== null) {
+            $pageCount = max((int)ceil($params['count'] / $params['perPage']), 1);
             $page = min($page, $pageCount);
-        } elseif ($numResults === 0 && $requestedPage > 1) {
+        } elseif ($params['current'] === 0 && $params['requestedPage'] > 1) {
             $page = 1;
         }
 
+        $params['page'] = $page;
+        $params['pageCount'] = $pageCount;
+
+        return $params;
+    }
+
+    /**
+     * Add "start" and "end" params.
+     *
+     * @param array $params Paging params.
+     * @param array $data Paginator data.
+     * @return array Updated params.
+     */
+    protected function addStartEndParams(array $params, array $data)
+    {
         $start = $end = 0;
-        if ($numResults > 0) {
-            $start = (($page - 1) * $limit) + 1;
-            $end = $start + $numResults - 1;
+
+        if ($params['current'] > 0) {
+            $start = (($params['page'] - 1) * $params['perPage']) + 1;
+            $end = $start + $params['current'] - 1;
         }
 
-        $paging = [
-            'finder' => $data['finder'],
-            'requestedPage' => $requestedPage,
-            'page' => $page,
-            'current' => $numResults,
-            'count' => $count,
-            'perPage' => $limit,
-            'start' => $start,
-            'end' => $end,
-            'prevPage' => $page > 1,
-            'nextPage' => $count === null ? true : ($count > ($page * $limit)),
-            'pageCount' => $pageCount,
+        $params['start'] = $start;
+        $params['end'] = $end;
+
+        return $params;
+    }
+
+    /**
+     * Add "prevPage" and "nextPage" params.
+     *
+     * @param array $params Paginator params.
+     * @param array $data Paging data.
+     * @return array Updated params.
+     */
+    protected function addPrevNextParams(array $params, array $data)
+    {
+        $params['prevPage'] = $params['page'] > 1;
+        if ($params['count'] === null) {
+            $params['nextPage'] = true;
+        } else {
+            $params['nextPage'] = $params['count'] > ($params['page'] * $params['perPage']);
+        }
+
+        return $params;
+    }
+
+    /**
+     * Add sorting / ordering params.
+     *
+     * @param array $params Paginator params.
+     * @param array $data Paging data.
+     * @return array Updated params.
+     */
+    protected function addSortingParams(array $params, array $data)
+    {
+        $defaults = $data['defaults'];
+        $order = (array)$data['options']['order'];
+        $sortDefault = $directionDefault = false;
+
+        if (!empty($defaults['order']) && count($defaults['order']) === 1) {
+            $sortDefault = key($defaults['order']);
+            $directionDefault = current($defaults['order']);
+        }
+
+        $params += [
             'sort' => $data['options']['sort'],
             'direction' => isset($data['options']['sort']) ? current($order) : null,
-            'limit' => $defaults['limit'] != $limit ? $limit : null,
             'sortDefault' => $sortDefault,
             'directionDefault' => $directionDefault,
-            'scope' => $data['options']['scope'],
             'completeSort' => $order,
         ];
 
-        return $paging;
+        return $params;
     }
 
     /**

File diff suppressed because it is too large
+ 15 - 1364
tests/TestCase/Datasource/PaginatorTest.php


File diff suppressed because it is too large
+ 1376 - 0
tests/TestCase/Datasource/PaginatorTestTrait.php


+ 8 - 1
tests/TestCase/Datasource/SimplePaginatorTest.php

@@ -9,7 +9,7 @@
  *
  * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  * @link          http://cakephp.org CakePHP(tm) Project
- * @since         3.5.0
+ * @since         3.9.0
  * @license       http://www.opensource.org/licenses/mit-license.php MIT License
  */
 namespace Cake\Test\TestCase\Datasource;
@@ -20,6 +20,13 @@ use Cake\ORM\Entity;
 
 class SimplePaginatorTest extends PaginatorTest
 {
+    /**
+     * Don't load data for fixtures for all tests
+     *
+     * @var bool
+     */
+    public $autoFixtures = false;
+
     public function setUp()
     {
         parent::setUp();