Pagination-URI в Codeigniter 4

Я начал писать веб-приложение в Codigniter 4, и в настоящее время я застрял с нумерацией страниц.

Я создал контроллер, модель и представление для извлечения записей из базы данных для групп пользователей и использовал встроенную в CI библиотеку разбивки на страницы.

Модель групп пользователей:

<?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;
    }

}

Контроллер (группы пользователей):

<?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');    
    }

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

}

В представлении я получил свою разбивку на страницы, используя

<?= $pager->links() ?>

Разбивка на страницы по умолчанию работает нормально, но я получаю URI типа https://DOMAIN.DE/usergroups?page= 2

В официальной документации Codeigniter 4 для разбивки на страницы вы можете найти следующее:

Указание сегмента URI для страницы Также можно использовать сегмент URI для номера страницы вместо параметра запроса страницы. ›Просто укажите номер сегмента, который будет использоваться в качестве четвертого аргумента. Тогда URI, сгенерированные пейджером, будут выглядеть следующим образом: https://domain.tld/model/%5BpageNumber%5D вместо https://domain.tld/model?page=%5BpageNumber%5D.:

::

$users = $userModel-›paginate(10, ‘group1’, null, 3); Обратите внимание: значение $segment не может превышать число сегментов URI плюс 1.

Итак, в моем контроллере я изменил

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

to

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

и в представлении я добавил «тест» в качестве параметра.

<?= $pager->links('test') ?>

В Маршрутах я добавил

$routes->get('usergroups/(:num)', 'Usergroups::index/$1');

и в контроллере я изменил индексную функцию на

public function index($segment = null)

URI, сгенерированные из разбиения на страницы, теперь выглядят так:

https://DOMAIN.DE/usergroups/2

но это ничего не меняет в записях и сама нумерация страниц всегда липнет к странице 1.

Я думаю, что я не могу использовать встроенную библиотеку CI при переключении на URI сегмента, и поэтому мне нужно создать разбиение на страницы вручную.

Может ли кто-нибудь помочь мне решить эту проблему?


person Michael Böhmländer    schedule 07.07.2020    source источник


Ответы (2)


Похоже, в версии 4.0.3 есть ошибка. поэтому он не может работать из коробки. Но я нашел способ решить эту проблему:

Индексная функция должна выглядеть так:

public function index($page = 1)

и

внутри контроллера $data['usergroups'] должен выглядеть так:

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

где 2 — это сегмент номера страницы в URI.

Работает как шарм.

person Michael Böhmländer    schedule 07.07.2020

В настоящее время у меня была такая же проблема с использованием сегментов в моей разбивке на страницы.

После долгих исследований я обнаружил, что когда вы используете сегменты, связанные с именем группы, в своем кейс-тесте, вы должны присвоить сегмент переменной $ pager

$pager->setSegment(2, 'nameOfGroup');

Вам нужно только изменить первый параметр с номером сегмента, который вы используете, а второй с именем группы, которую вы назначаете.

person Sebastian Osses    schedule 10.06.2021