• 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pagination and segment URIs

#1
I began writing a webapp in Codigniter 4 and currently, i'm stuck with the pagination.
I created a controller, a model an a view to retrieve database entries für usergroups and used CI's built-in pagination-library.
UsergroupsModel:
Code:
<?php namespace App\Models;

use CodeIgniter\Model;

class UsergroupsModel extends Model{

    protected $table = 'roles';
    protected $allowedFields = [];
    protected $beforeInsert = ['beforeInsert'];
    protected $beforeUpdate = ['beforeUpdate'];
   

    public function getGroups(){
        $db = \Config\Database::connect();

        $builder = $db->table('roles');
        $query   = $builder->get();

        $results = $query->getResultArray();
        return $results;
    }

}

Controller (Usergroups):
Code:
<?php namespace App\Controllers;
use App\Models\UsergroupsModel;

class Usergroups extends BaseController
{
    public function index()
    {
        //Helper laden
        helper(['form','template','userrights']);
        $data = [];
        $data['template'] = get_template();
        $data['info'] = [
            "active" => "menu_dash",
            "title" => "Dashboard",
            "icon" => "fab fa-fort-awesome fa-lg",
                        "sub" => "Frontend",
        ];
       
        //Check Permissions
        $data['userrights'] = get_userrights(session()->get('id'));
        if($data['userrights'][1] == 1)
        {
            foreach($data['userrights'] as $key => $value){
            $data['userrights'][$key] =  '1';
            }
        }
        else
        {
            $data['userrights'] = $data['userrights'];
        }

        $model = new UsergroupsModel;
        $model->getGroups();
        $pager = \Config\Services::pager();

        $data['usergroups'] = $model->paginate(5);
        $data['pager'] = $model->pager;

        //Create Views
        echo view($data['template'].'/templates/header', $data);
        echo view($data['template'].'/backend/navigation');
        echo view($data['template'].'/templates/sidebar');
        echo view($data['template'].'/backend/usergroups');
        echo view($data['template'].'/templates/footer');   
    }

      
    //--------------------------------------------------------------------

}

In the view, i got my pagination by using
Code:
<?= $pager->links() ?>

The default pagination works fine, but i get an URI like https://DOMAIN.DE/usergroups?page=2
In the official Codeigniter 4 docs for the pagination, you can find the following:
Quote:Specifying the URI Segment for Page It is also possible to use a URI segment for the page number, instead of the page query parameter. >Simply specify the segment number to use as the fourth argument. URIs generated by the pager would then >look like https://domain.tld/model/[pageNumber] instead of https://domain.tld/model?page=[pageNumber].:
::
$users = $userModel->paginate(10, ‘group1’, null, 3); Please note: $segment value cannot be greater than the number of URI segments plus 1.
So in my controller i changed
Code:
$data['usergroups'] = $model->paginate(5);

to
Code:
$data['usergroups'] = $model->paginate(5,'test',0,2);

and in the view i added 'test' as a parameter.
Code:
<?= $pager->links('test') ?>

In the Routes i added
Code:
$routes->get('usergroups/(:num)', 'Usergroups::index/$1');

and in the Controller i changed the index-function to
Code:
public function index($segment = null)

The URIs generated from the pagination now look like this:
https://DOMAIN.DE/usergroups/2
but it does not change anything in the entries and the pagination itself alway sticks to page 1.
I think, i can not use CI's built in library when switching to segment-URIs and thus i need to create a manual pagination.

Can somebody help me to fix this problem?
Reply

#2
By the looks of things, there are a bug in 4.0.3, as the development version have changed how that feature works. And as of now (for you) it's broken. You need to load it manually for now.
https://codeigniter.com/user_guide/libra...e-manually

PHP Code:
$data['usergroups'] = $model->paginate(5'test', (int) $segment); 
Reply

#3
Great, that did the trick!

In the controller, i changed the function to

Code:
public function index($page = 1)

and the $data['usergroups']
to


Code:
$data['usergroups'] = $model->paginate(5, 'test', $page, 2);


Works like a charm Smile
Reply

#4
Great that it worked out for you, don't have an release date for then this is fixed and you don't need to manually assign it anymore.
Reply


Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


  Theme © 2014 iAndrew  
Powered By MyBB, © 2002-2020 MyBB Group.