Пагинация в CodeIgniter 4 с примером
⚡ Умное резюме
Пагинация в CodeIgniter разбивает большие наборы результатов поиска в базе данных на небольшие страницы с удобной навигацией, используя встроенную библиотеку пагинации. В этом пошаговом руководстве представлен работающий пример, который выполняет запрос к таблице авторов, настраивает ограничения на количество страниц и отображает нумерованные навигационные ссылки.

Базы данных — это живые сущности. Они растут с течением времени. При проектировании приложений необходимо учитывать множество записей, которые пользователям придётся просматривать. Пагинация позволяет разбить результаты на небольшие, управляемые части. На следующем изображении показан пример пагинации. Google поиск.
В этом уроке вы узнаете, как разбивать результаты поиска в базе данных на страницы. CodeИспользование библиотеки пагинации в Igniter. В этом руководстве предполагается, что вы знакомы с основами Igniter. CodeIgniter Active Record. Если вы еще не знакомы с ним, можете ознакомиться с предыдущими руководствами. Также предполагается, что вы уже скачали... CodeВоспламенитель.
Настройка базы данных
Мы начнем с создания базы данных и вставки в нее нескольких фиктивных записей. Это будет однотабличная база данных с 50 записями.
Запустите следующий скрипт для MySQL создать таблицу авторов базы данных. Вставьте 50 фиктивных записей.
CREATE SCHEMA ci_pagination; DROP TABLE IF EXISTS `authors`; CREATE TABLE `authors` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `last_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `birthdate` date NOT NULL, `added` timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (1, 'Brielle', 'O\'Hara', 'alexandre67@example.com', '1974-05-21', '1999-09-17 19:17:28'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (2, 'Flavio', 'Lehner', 'mafalda85@example.net', '1971-10-14', '1998-09-09 00:25:06'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (3, 'Elmira', 'Johns', 'wellington52@example.org', '1983-11-28', '2015-02-07 15:56:43'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (4, 'Elza', 'Mitchell', 'marisol46@example.org', '1989-03-08', '1992-08-21 00:21:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (5, 'Viva', 'Greenfelder', 'era94@example.com', '1995-04-17', '2017-04-30 05:55:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (6, 'Maxwell', 'VonRueden', 'mcassin@example.net', '1994-07-01', '1996-05-08 23:30:14'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (7, 'Deontae', 'Becker', 'rory.kub@example.org', '1992-02-19', '2017-07-22 11:49:15'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (8, 'Sylvester', 'Christiansen', 'erohan@example.org', '1990-09-03', '2004-05-08 08:15:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (9, 'Torrey', 'Strosin', 'adams.luciano@example.net', '1999-10-09', '2009-08-30 21:30:44'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (10, 'Kelli', 'Smitham', 'daniel.catalina@example.com', '2012-11-07', '1986-01-22 20:52:57'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (11, 'Abigale', 'Schuppe', 'andreanne.hayes@example.net', '2018-02-18', '1994-05-07 06:26:36'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (12, 'Letha', 'Gleason', 'eldridge.heaney@example.net', '2009-02-06', '1998-05-25 04:37:54'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (13, 'Sienna', 'Upton', 'monique57@example.org', '2017-08-17', '2009-08-08 19:08:10'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (14, 'Harley', 'Gutkowski', 'breilly@example.net', '1987-11-30', '1998-07-31 11:08:01'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (15, 'Lois', 'Bednar', 'hpouros@example.net', '2002-02-11', '2001-07-26 15:04:16'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (16, 'Gail', 'McDermott', 'reina.kerluke@example.com', '1987-03-30', '2004-12-15 20:38:29'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (17, 'Sydney', 'Strosin', 'dweber@example.net', '1985-04-29', '2010-08-07 08:50:35'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (18, 'Anne', 'Cremin', 'fritz.schmitt@example.com', '1976-02-15', '1980-03-25 05:29:41'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (19, 'Norberto', 'Bergnaum', 'franecki.javon@example.net', '1971-03-11', '1993-03-20 23:36:25'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (20, 'Arvid', 'Johns', 'pschultz@example.org', '2016-01-03', '1995-04-30 17:07:15'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (21, 'Bernita', 'Fay', 'arne96@example.org', '1983-12-26', '1987-02-23 16:55:28'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (22, 'Gonzalo', 'Gorczany', 'velma.huels@example.com', '1987-10-19', '2016-10-18 19:25:46'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (23, 'Jackie', 'Klein', 'gretchen.howe@example.com', '1971-01-20', '2010-11-16 02:58:05'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (24, 'Andrew', 'Kessler', 'collins.faye@example.org', '1984-08-07', '1971-12-15 08:46:42'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (25, 'Claire', 'Hudson', 'madalyn.wunsch@example.org', '1984-12-19', '1991-07-04 14:35:53'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (26, 'Prudence', 'Runte', 'koch.laurie@example.net', '2008-12-27', '1985-09-30 04:57:55'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (27, 'Destinee', 'Romaguera', 'tromp.tiffany@example.com', '1978-11-09', '1997-11-09 19:58:08'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (28, 'Marianna', 'Harvey', 'clovis.schuppe@example.com', '2013-08-28', '1990-08-06 19:29:19'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (29, 'Eloy', 'Lakin', 'wmorissette@example.net', '1989-12-08', '1974-03-16 03:21:16'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (30, 'Rubie', 'McClure', 'haley.louisa@example.net', '1987-09-12', '1998-07-02 10:45:36'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (31, 'Marisa', 'Stracke', 'zachary76@example.org', '1975-05-28', '1975-03-19 00:57:35'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (32, 'Jacey', 'Beatty', 'dahlia.hermann@example.org', '1979-12-17', '1971-01-21 16:50:58'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (33, 'Idella', 'Ruecker', 'elda.reichert@example.com', '2009-09-15', '1996-04-19 22:27:31'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (34, 'Dimitri', 'Bednar', 'freida.parker@example.org', '1998-12-02', '2008-12-30 23:29:57'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (35, 'Elfrieda', 'Smitham', 'padberg.rex@example.org', '2018-07-23', '1972-04-01 07:52:25'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (36, 'Dwight', 'Walter', 'gmosciski@example.org', '2016-08-15', '1994-07-02 11:06:55'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (37, 'Macie', 'Fay', 'uschuppe@example.net', '1976-01-29', '2005-12-13 18:44:46'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (38, 'Lori', 'Kshlerin', 'mhansen@example.net', '1983-04-08', '1986-01-18 16:03:52'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (39, 'Jeffry', 'Paucek', 'alisha35@example.net', '2002-10-02', '2004-03-29 07:06:03'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (40, 'Yvonne', 'Bernhard', 'jaqueline21@example.net', '2017-11-04', '1986-12-15 23:55:23'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (41, 'Ludwig', 'Heathcote', 'marcelino.kirlin@example.org', '1981-02-09', '2000-08-02 20:45:48'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (42, 'Jadyn', 'Wiegand', 'georgianna.swift@example.net', '1982-06-16', '1980-12-05 13:09:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (43, 'Ferne', 'Smitham', 'melany22@example.com', '1996-12-17', '1984-11-18 19:26:27'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (44, 'Meta', 'Corkery', 'xharber@example.com', '1972-03-31', '2007-01-20 00:07:31'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (45, 'Toni', 'Wolf', 'wyman.crystal@example.org', '2012-04-15', '1973-06-22 12:14:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (46, 'Zack', 'Luettgen', 'deion.konopelski@example.org', '2003-05-29', '2018-11-19 05:03:21'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (47, 'Kameron', 'Dietrich', 'ronaldo.torphy@example.com', '1973-05-20', '1974-09-16 20:27:17'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (48, 'Zetta', 'Lebsack', 'timmothy.vandervort@example.com', '1996-11-04', '2001-03-06 01:33:01'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (49, 'Benny', 'Hane', 'leone.lueilwitz@example.net', '2008-02-02', '2006-01-27 22:12:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (50, 'Evans', 'Gleason', 'ccummerata@example.org', '1999-09-09', '1990-09-26 17:50:11');
Теперь, когда мы успешно создали базу данных и добавили в нее фиктивные записи, давайте настроим ее. CodeПриложение Igniter для взаимодействия с базой данных.
Откройте приложение/config/database.php.
Установите параметры подключения к базе данных, аналогичные следующим:
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => 'melody', 'database' => 'ci_pagination', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
ВОТ,
- 'hostname' => 'localhost', устанавливает имя хоста базы данных.
- 'username' => 'root', указывает имя пользователя базы данных.
- 'password' => 'melody', устанавливает пароль к базе данных
- 'database' => 'ci_pagination', указывает имя базы данных.
Мы также будем автоматически загружать библиотеку базы данных при запуске нашего приложения. Давайте это сделаем. Откройте файл application/config/autoload.php
Загрузите библиотеку базы данных, как показано в коде ниже.
$autoload['libraries'] = array('database');
Вот и все, что касается конфигурации базы данных.
Теперь давайте рассмотрим модель базы данных для пагинации.
CodeМодель базы данных с пагинацией для системы зажигания
Создайте новую модель Authors_model в файле application/models.
Добавьте следующий код
<?php class Authors_model extends CI_Model { protected $table = 'authors'; public function __construct() { parent::__construct(); } public function get_count() { return $this->db->count_all($this->table); } public function get_authors($limit, $start) { $this->db->limit($limit, $start); $query = $this->db->get($this->table); return $query->result(); } }
ВОТ,
- protected $table = 'authors'; определяет защищенную переменную, которая хранит имя таблицы базы данных для модели.
- публичная функция __construct() {…} вызывает метод родительского конструктора
- Функция `public function get_count() {…}` возвращает общее количество записей в таблице базы данных. Это необходимо для постраничной навигации.
- public function get_authors($limit, $start) {…} определяет метод, который будет использоваться для получения результатов с постраничной разбивкой из базы данных. Мы передаем параметр limit и начальную точку. limit определяет общее количество возвращаемых записей, а start — количество записей, которые следует пропустить.
На этом наша модель базы данных завершена. Теперь давайте создадим маршруты, которые будут реагировать на результаты, отображаемые на страницах.
CodeМаршруты пагинации Igniter
Откройте файл маршрутов в application/config/routes.php.
Добавьте следующий маршрут
$route['authors/(:num)'] = 'authors';
ВОТ,
- Мы определяем маршрут authors, который принимает необязательный параметр в виде числа. Необязательный параметр определяется с помощью открывающей и закрывающей скобок. Определенный маршрут вызывает метод index в контроллере Authors.
Теперь перейдём к контроллеру для отображения результатов в постраничном режиме.
CodeКонтроллер пагинации зажигателя
Создайте новый файл Authors.php в каталоге приложения/контроллеров.
Добавьте следующий код
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Authors extends CI_Controller { public function __construct() { parent:: __construct(); $this->load->helper('url'); $this->load->model('authors_model'); $this->load->library("pagination"); } public function index() { $config = array(); $config["base_url"] = base_url() . "authors"; $config["total_rows"] = $this->authors_model->get_count(); $config["per_page"] = 10; $config["uri_segment"] = 2; $this->pagination->initialize($config); $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; $data["links"] = $this->pagination->create_links(); $data['authors'] = $this->authors_model->get_authors($config["per_page"], $page); $this->load->view('authors/index', $data); } }
ВОТ,
- класс Authors расширяет CI_Controller {…} мы определяем класс Authors, который расширяет класс CI_Controller
- public function __construct() {…} этот метод инициализирует родительский конструктор и загружает вспомогательный URL-адрес, модель авторов и библиотеку нумерации страниц.
- публичная функция index() {…} определяет метод, который отвечает авторам наших маршрутов
- $config[“base_url”] = base_url() . “authors”; устанавливает пагинацию URL который будет использоваться для генерации ссылок для пагинации.
- $config[“total_rows”] = $this->authors_model->get_count(); устанавливает общее количество строк, которые необходимо разбить на страницы. Значение извлекается из модели authors путем вызова метода get_count.
- $config[“per_page”] = 10; определяет строки, которые должны отображаться на странице
- $config[“uri_segment”] = 2; указывает URL сегмент, содержащий значение, которое будет использоваться для пропуска записей.
- $this->pagination->initialize($config); инициализирует библиотеку пагинации, используя значения массива config, которые мы определили.
- $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; проверяет, задан ли номер пропуска во втором сегменте URI, и если он не задан, то переменной $page присваивается значение 0.
- $data[“links”] = $this->pagination->create_links(); создает ссылки на страницы и присваивает их ключу ссылок переменной массива $data.
- $data['authors'] = $this->authors_model->get_authors($config[“per_page”], $page); извлекает записи об авторах с постраничной разбивкой и присваивает их ключу authors переменной массива $data.
- $this->load->view('авторы/индекс', $data); загружает представление индекса в каталог авторов и передает переменную массива $data.
На этом работа над контроллером завершена. Теперь давайте создадим представление, которое будет отображать результаты из базы данных.
Создайте новый каталог авторов в приложении/представлениях.
Создайте новый файл index.php в application/views/authors/index.php.
Добавьте следующий код
<!DOCTYPE html> <html> <head> <title>CodeIgniter Pagination</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https:0 </head> <body> <div class="container"> <h3 class="title is-3">CodeIgniter Database Pagination</h3> <div class="column"> <table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth"> <thead> <tr> <th>ID</th> <th>Contact Name</th> <th>Contact Number</th> <th>Email</th> <th>City</th> </tr> </thead> <tbody> <?php foreach ($authors as $author): ?> <tr> <td><?= $author->id ?></td> <td><?= $author->first_name ?></td> <td><?= $author->last_name ?></td> <td><?= $author->email ?></td> <td><?= $author->birthdate ?></td> </tr> <?php endforeach; ?> </tbody> </table> <p><?php echo $links; ?></p> </div> </div> </body> </html>
ВОТ,
- Цикл перебирает результаты переменной `$authors` и выводит их в таблицу.
- печатает ссылки на страницы внизу нашей таблицы.
Давайте теперь запустим наше приложение и посмотрим на результаты.
В этом уроке мы используем встроенный веб-сервер PHP, но вы можете использовать любой веб-сервер, поддерживающий PHP.
Откройте терминал
Запустите следующую команду
cd C:\Sites\ci-app php -S localhost:3000
ВОТ,
- Приведенная выше команда переходит в каталог кода приложения и запускает встроенный сервер на порту 3000.
Примечание: путь к приложению должен совпадать с путем, куда вы его скачали. CodeIgniter. Вы можете использовать любой свободный номер порта на вашем компьютере. Использовать порт 3000 необязательно.
Откройте веб-браузер и загрузите следующее. URL
http://localhost:3000/authors
Вы должны быть в состоянии получить результаты, подобные следующим
Как настроить CodeСсылки пагинации Igniter
По умолчанию метод create_links() выводит обычные теги <a>. Вы можете обернуть эти ссылки собственной разметкой, чтобы они соответствовали CSS-фреймворку, например, Bootstrap или Бульма. Добавьте ключи стилей в тот же массив $config перед вызовом метода initialize().
$config['full_tag_open'] = '<nav><ul class="pagination">'; $config['full_tag_close'] = '</ul></nav>'; $config['num_tag_open'] = '<li class="page-item">'; $config['num_tag_close'] = '</li>'; $config['cur_tag_open'] = '<li class="page-item active"><a class="page-link">'; $config['cur_tag_close'] = '</a></li>'; $config['next_link'] = 'Next »'; $config['prev_link'] = '« Previous';
Ниже описаны наиболее полезные ключи конфигурации.
- full_tag_open / full_tag_close: разметка, которая охватывает весь набор ссылок, идеально подходит для или контейнер.
- num_tag_open / num_tag_close: разметка вокруг каждой пронумерованной ссылки на страницу.
- cur_tag_open / cur_tag_close: разметка вокруг номера текущей активной страницы.
- следующая_ссылка / предыдущая_ссылка: Текст или символы, используемые для кнопок «Следующая» и «Предыдущая».
Поскольку стили полностью задаются в конфигурации, вы можете изменить стиль пагинации во всем приложении, отредактировав один массив, не затрагивая логику контроллера.


