Browse Source

#9848 PaginatorComponent.php ignores maxLimit

Yasuaki Hamano 9 years ago
parent
commit
03960de441

+ 14 - 5
src/Controller/Component/PaginatorComponent.php

@@ -299,13 +299,22 @@ class PaginatorComponent extends Component
         if (isset($defaults[$alias])) {
             $defaults = $defaults[$alias];
         }
-        if (isset($defaults['limit']) &&
-            (empty($defaults['maxLimit']) || $defaults['limit'] > $defaults['maxLimit'])
-        ) {
-            $defaults['maxLimit'] = $defaults['limit'];
+
+        $config = $this->config();
+        $maxLimit = isset($defaults['maxLimit']) ? $defaults['maxLimit'] : $config['maxLimit'];
+        $limit = isset($defaults['limit']) ? $defaults['limit'] : $config['limit'];
+
+        if ($limit > $maxLimit) {
+            $limit = $maxLimit;
+        }
+        if (empty($defaults['limit'])) {
+            $defaults['maxLimit'] = $maxLimit;
+            $defaults['limit'] = $limit;
         }
 
-        return $defaults + $this->config();
+        $defaults['maxLimit'] = $maxLimit;
+        $defaults['limit'] = $limit;
+        return $defaults + $config;
     }
 
     /**

+ 51 - 3
tests/TestCase/Controller/Component/PaginatorComponentTest.php

@@ -480,8 +480,8 @@ class PaginatorComponentTest extends TestCase
         $result = $this->Paginator->mergeOptions('Post', $settings);
         $expected = [
             'page' => 1,
-            'limit' => 200,
-            'maxLimit' => 200,
+            'limit' => 100,
+            'maxLimit' => 100,
             'paramType' => 'named',
             'whitelist' => ['limit', 'sort', 'page', 'direction']
         ];
@@ -494,7 +494,7 @@ class PaginatorComponentTest extends TestCase
         $result = $this->Paginator->mergeOptions('Post', $settings);
         $expected = [
             'page' => 1,
-            'limit' => 20,
+            'limit' => 10,
             'maxLimit' => 10,
             'paramType' => 'named',
             'whitelist' => ['limit', 'sort', 'page', 'direction']
@@ -503,6 +503,54 @@ class PaginatorComponentTest extends TestCase
     }
 
     /**
+     * test getDefaults with limit > maxLimit in code.
+     *
+     * @return void
+     */
+    public function testGetDefaultMaxLimit()
+    {
+        $settings = [
+            'page' => 1,
+            'limit' => 2,
+            'maxLimit' => 10,
+            'order' => [
+                'Users.username' => 'asc'
+            ],
+        ];
+        $result = $this->Paginator->mergeOptions('Post', $settings);
+        $expected = [
+            'page' => 1,
+            'limit' => 2,
+            'maxLimit' => 10,
+            'order' => [
+                'Users.username' => 'asc'
+            ],
+            'whitelist' => ['limit', 'sort', 'page', 'direction']
+        ];
+        $this->assertEquals($expected, $result);
+
+        $settings = [
+            'page' => 1,
+            'limit' => 100,
+            'maxLimit' => 10,
+            'order' => [
+                'Users.username' => 'asc'
+            ],
+        ];
+        $result = $this->Paginator->mergeOptions('Post', $settings);
+        $expected = [
+            'page' => 1,
+            'limit' => 10,
+            'maxLimit' => 10,
+            'order' => [
+                'Users.username' => 'asc'
+            ],
+            'whitelist' => ['limit', 'sort', 'page', 'direction']
+        ];
+        $this->assertEquals($expected, $result);
+    }
+
+    /**
      * Integration test to ensure that validateSort is being used by paginate()
      *
      * @return void