From 4d2058794ad5f4e230f4d8a4868e321704f55061 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 30 Jun 2022 18:36:49 +0900 Subject: [PATCH 1/2] fix: multiple pagers with models do not work --- system/BaseModel.php | 3 ++- tests/system/Models/PaginateModelTest.php | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/system/BaseModel.php b/system/BaseModel.php index 39bd9ce2cb4c..c437a095407e 100644 --- a/system/BaseModel.php +++ b/system/BaseModel.php @@ -1073,7 +1073,8 @@ public function errors(bool $forceDB = false) */ public function paginate(?int $perPage = null, string $group = 'default', ?int $page = null, int $segment = 0) { - $pager = Services::pager(null, null, false); + // Since multiple models may use the Pager, the Pager must be shared. + $pager = Services::pager(); if ($segment) { $pager->setSegment($segment, $group); diff --git a/tests/system/Models/PaginateModelTest.php b/tests/system/Models/PaginateModelTest.php index ae93f2f6c62b..1f9c40b1fdcc 100644 --- a/tests/system/Models/PaginateModelTest.php +++ b/tests/system/Models/PaginateModelTest.php @@ -79,4 +79,26 @@ public function testPaginatePageOutOfRange(): void $this->model->paginate(1, 'default', 500); $this->assertSame($this->model->pager->getPageCount(), $this->model->pager->getCurrentPage()); } + + public function testMultiplePager(): void + { + $validModel = $this->createModel(ValidModel::class); + $userModel = $this->createModel(UserModel::class); + + $validModel->paginate(1, 'valid'); + $userModel->paginate(1, 'user'); + $pager = $this->model->pager; + + $this->assertSame(4, $validModel->countAllResults()); + $this->assertSame(4, $userModel->countAllResults()); + + $this->assertStringContainsString('?page_valid=1"', $pager->links('valid')); + $this->assertStringContainsString('?page_valid=2"', $pager->links('valid')); + $this->assertStringContainsString('?page_valid=3"', $pager->links('valid')); + $this->assertStringContainsString('?page_valid=4"', $pager->links('valid')); + $this->assertStringContainsString('?page_user=1"', $pager->links('user')); + $this->assertStringContainsString('?page_user=2"', $pager->links('user')); + $this->assertStringContainsString('?page_user=3"', $pager->links('user')); + $this->assertStringContainsString('?page_user=4"', $pager->links('user')); + } } From 3476eb6293bfc050b147b2718f06b54875f3389c Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 30 Jun 2022 21:31:42 +0900 Subject: [PATCH 2/2] test: fix and add test --- tests/system/Models/PaginateModelTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/system/Models/PaginateModelTest.php b/tests/system/Models/PaginateModelTest.php index 1f9c40b1fdcc..a2361b350246 100644 --- a/tests/system/Models/PaginateModelTest.php +++ b/tests/system/Models/PaginateModelTest.php @@ -82,6 +82,8 @@ public function testPaginatePageOutOfRange(): void public function testMultiplePager(): void { + $_GET = []; + $validModel = $this->createModel(ValidModel::class); $userModel = $this->createModel(UserModel::class); @@ -89,6 +91,8 @@ public function testMultiplePager(): void $userModel->paginate(1, 'user'); $pager = $this->model->pager; + $this->assertSame($userModel->pager, $validModel->pager); + $this->assertSame(4, $validModel->countAllResults()); $this->assertSame(4, $userModel->countAllResults());