codeigniter4 / CodeIgniter4

Open Source PHP Framework (originally from EllisLab)
https://codeigniter.com/
MIT License
5.3k stars 1.89k forks source link

Bug: [Pagination] Undefined variable $pager #6360

Closed reactmore closed 2 years ago

reactmore commented 2 years ago

PHP Version

8.0

CodeIgniter4 Version

4.2.3

CodeIgniter4 Installation Method

Composer (using codeigniter4/appstarter)

Which operating systems have you tested for this bug?

Windows

Which server did you use?

apache

Database

MySQL 5.6

What happened?

After update from version 4.2.1 pagination gives error message ErrorException Undefined variable $pager APPATH\Views\admin\includes\_pagination.php at line 1

$pager variable is not detected in my custom pagination file then I found the change at this line if I return to this line to code version 4.2.1 its no problem

Steps to Reproduce

Controller :

public function editTranslationLang($id)
    {
        $data['title'] = trans('edit_translations');
        $data['language'] = $this->languageModel->getLanguage($id);
        if (empty($data['language'])) {
            return redirect()->to(adminUrl('language-settings'));
        }
        $numRows = $this->languageModel->getTranslationCount($data['language']->id);
        // call pagination custom helper and set offset to model
        $pager = paginate($this->perPage, $numRows);
        $data['translations'] = $this->languageModel->getTranslationsPaginated($data['language']->id, $this->perPage, $pager->offset);

        echo view('admin/language/translations', $data);

    }

Custom Helper :

//custom Pagination
if (!function_exists('paginate')) {
    function paginate($perPage, $total)
    {
        $page = @intval(inputGet('page'));
        if (empty($page) || $page < 1) {
            $page = 1;
        }
        $pager = \Config\Services::pager();
        $pager->makeLinks($page, $perPage, $total);
        $pager->page = $page;
        $pager->offset = ($page - 1) * $perPage;
        return $pager;
    }
}

Expected Output

Pagination is Showing

Anything else?

Version 4.2.1 Version 4.2.1 Version 4.2.3 ERROR

kenjis commented 2 years ago

It seems you don't pass $pager to your view. So it is natural the error Undefined variable $pager.

I don't get what you do. Can you show us minimum code to reproduce the error? The code you wrote does not work on my environment.

reactmore commented 2 years ago

It seems you don't pass $pager to your view. So it is natural the error Undefined variable $pager.

I don't get what you do. Can you show us minimum code to reproduce the error? The code you wrote does not work on my environment.

in the previous version the variable was passed

this is the code https://github.com/reactmore/pagination-codeigniter

kenjis commented 2 years ago

@reactmore Thank you for the code.

I don't know why you wrote such code, but you still did not pass $pager to your view.

In the previous versions $pager was passed, but it was a bug.

Workaround:

--- a/app/Controllers/Home.php
+++ b/app/Controllers/Home.php
@@ -3,6 +3,8 @@
 namespace App\Controllers;

 use App\Models\UsersModel;
+use CodeIgniter\Pager\PagerRenderer;
+use Config\Services;

 class Home extends BaseController
 {
@@ -14,6 +16,8 @@ class Home extends BaseController
         $pager = paginate(20, $numRows);
         $data['users'] = $usersModel->getUsersPaginated(20, $pager->offset);

+        $data['pager'] = new PagerRenderer(Services::pager()->getDetails());
+
         return view('welcome_message', $data);
     }
 }
kenjis commented 2 years ago

I recommend you use the framework functionality.

--- a/app/Config/Pager.php
+++ b/app/Config/Pager.php
@@ -21,7 +21,7 @@ class Pager extends BaseConfig
      * @var array<string, string>
      */
     public $templates = [
-        'default_full'   => 'CodeIgniter\Pager\Views\default_full',
+        'default_full'   => 'App\Views\_pagination',
         'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
         'default_head'   => 'CodeIgniter\Pager\Views\default_head',
     ];
diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php
index a31d6fc..02011c3 100644
--- a/app/Controllers/Home.php
+++ b/app/Controllers/Home.php
@@ -10,9 +10,10 @@ class Home extends BaseController
     {
         $usersModel = new UsersModel();

-        $numRows = $usersModel->getUsersCount();
-        $pager = paginate(20, $numRows);
-        $data['users'] = $usersModel->getUsersPaginated(20, $pager->offset);
+        $data = [
+            'users' => $usersModel->paginate(20),
+            'pager' => $usersModel->pager,
+        ];

         return view('welcome_message', $data);
     }
diff --git a/app/Models/UsersModel.php b/app/Models/UsersModel.php
index 393aa26..60dc861 100644
--- a/app/Models/UsersModel.php
+++ b/app/Models/UsersModel.php
@@ -8,6 +8,8 @@ class UsersModel extends Model
 {
     protected $allowedFields = ['username', 'address'];

+    protected $returnType = 'object';
+
     public function __construct()
     {
         parent::__construct();
diff --git a/app/Views/welcome_message.php b/app/Views/welcome_message.php
index 9dedf74..6f7c1e0 100644
--- a/app/Views/welcome_message.php
+++ b/app/Views/welcome_message.php
@@ -302,7 +302,7 @@

         </div>

-        <?= view('_pagination'); ?>
+        <?= $pager->links() ?>

     </section>
reactmore commented 2 years ago

I recommend you use the framework functionality.

--- a/app/Config/Pager.php
+++ b/app/Config/Pager.php
@@ -21,7 +21,7 @@ class Pager extends BaseConfig
      * @var array<string, string>
      */
     public $templates = [
-        'default_full'   => 'CodeIgniter\Pager\Views\default_full',
+        'default_full'   => 'App\Views\_pagination',
         'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
         'default_head'   => 'CodeIgniter\Pager\Views\default_head',
     ];
diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php
index a31d6fc..02011c3 100644
--- a/app/Controllers/Home.php
+++ b/app/Controllers/Home.php
@@ -10,9 +10,10 @@ class Home extends BaseController
     {
         $usersModel = new UsersModel();

-        $numRows = $usersModel->getUsersCount();
-        $pager = paginate(20, $numRows);
-        $data['users'] = $usersModel->getUsersPaginated(20, $pager->offset);
+        $data = [
+            'users' => $usersModel->paginate(20),
+            'pager' => $usersModel->pager,
+        ];

         return view('welcome_message', $data);
     }
diff --git a/app/Models/UsersModel.php b/app/Models/UsersModel.php
index 393aa26..60dc861 100644
--- a/app/Models/UsersModel.php
+++ b/app/Models/UsersModel.php
@@ -8,6 +8,8 @@ class UsersModel extends Model
 {
     protected $allowedFields = ['username', 'address'];

+    protected $returnType = 'object';
+
     public function __construct()
     {
         parent::__construct();
diff --git a/app/Views/welcome_message.php b/app/Views/welcome_message.php
index 9dedf74..6f7c1e0 100644
--- a/app/Views/welcome_message.php
+++ b/app/Views/welcome_message.php
@@ -302,7 +302,7 @@

         </div>

-        <?= view('_pagination'); ?>
+        <?= $pager->links() ?>

     </section>

So there's the problem, it's going to take a lot of time to convert the query builder to used modeling

thanks for telling me