Пагінація в CodeЗапальник 4 з прикладом
⚡ Розумний підсумок
Пагінація в CodeIgniter розбиває великі набори результатів бази даних на невеликі сторінки з зручною навігацією за допомогою вбудованої бібліотеки пагінації. У цьому покроковому посібнику наведено робочий приклад, який запитує таблицю авторів, налаштовує обмеження на сторінку та відображає нумеровані посилання навігації.

Бази даних – це живі сутності. Вони зростають з плином часу. Під час розробки додатків нам потрібно враховувати безліч записів, які користувачам доведеться переглядати. Пагінація дозволяє нам розбити результати на невеликі, зручні для керування частини. На наступному зображенні показано приклад пагінації на Google пошук.
У цьому посібнику ви дізнаєтесь, як розбивати результати бази даних на сторінки в CodeIgniter використовує бібліотеку пагінації. Цей посібник передбачає, що ви знайомі з основами CodeАктивний запис Igniter. Якщо ви ще не знаєте, можете прочитати попередні навчальні посібники. Інше припущення полягає в тому, що ви вже завантажили 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 для зв'язку з базою даних.
Відкрийте application/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Модель пагінації бази даних Igniter
Створіть нову модель Authors_model у програмі/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() {…} викликає метод батьківського конструктора
- Публічна функція get_count() {…} повертає загальну кількість записів у таблиці бази даних. Це потрібно для нумерації сторінок.
- public function get_authors($limit, $start) {…} визначає метод, який буде використано для отримання результатів з бази даних. Ми передаємо ліміт та початкову точку. Ліміт визначає загальну кількість записів, які будуть повернуті, тоді як start визначає кількість записів, які слід пропустити.
Ось і все з нашою моделлю бази даних. Тепер давайте створимо маршрути, які відповідатимуть на наші результати з розбивкою на сторінки.
CodeМаршрути пагінації Igniter
Відкрийте файл маршрутів у application/config/routes.php
Додайте наступний маршрут
$route['authors/(:num)'] = 'authors';
ТУТ,
- Ми визначаємо маршрут авторів, який приймає необов'язковий параметр числа. Необов'язковий параметр визначається за допомогою відкриваючих та закриваючих дужок. Визначений маршрут викликає метод index у контролері авторів.
Тепер перейдемо до контролера для наших результатів з розбивкою на сторінки.
CodeКонтролер пагінації Igniter
Створіть новий файл Authors.php у каталозі application/controllers
Додайте наступний код
<?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); } }
ТУТ,
- class Authors extends 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(); встановлює загальну кількість рядків, які потрібно розбити на сторінки. Значення отримується з моделі авторів шляхом виклику методу get_count.
- $config[“per_page”] = 10; визначає рядки, які мають відображатися на сторінці
- $config[“uri_segment”] = 2; визначає URL сегмент, що містить значення, яке буде використано для пропуску записів
- $this->pagination->initialize($config); ініціалізує бібліотеку пагінації, використовуючи значення масиву конфігурації, які ми визначили
- $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; перевіряє, чи встановлено номер пропуску у другому сегменті URI, і якщо він не встановлено, то змінній $page присвоюється значення 0
- $data[“links”] = $this->pagination->create_links(); створює посилання на розбивку сторінок і призначає їх ключу links змінної масиву $data.
- $data['authors'] = $this->authors_model->get_authors($config[“per_page”], $page); отримує записи авторів з розбивкою на сторінки та призначає їх ключу authors масиву $data
- $this->load->view('authors/index', $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.
Примітка: шлях до програми має збігатися зі шляхом завантаження CodeЗапалювач. Ви можете використовувати будь-який вільний порт на вашому комп'ютері. Необов'язково використовувати порт 3000.
Відкрийте веббраузер і завантажте наступне URL
http://localhost:3000/authors
Ви повинні отримати результати, подібні до наведених нижче
Як налаштувати CodeПосилання на сторінки Igniter
За замовчуванням метод create_links() виводить прості теги прив'язки. Ви можете обгорнути ці посилання у власну розмітку, щоб вони відповідали CSS-фреймворку, такому як Bootstrap або Bulma. Додайте ключі стилізації до того ж масиву $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';
Найкорисніші ключі конфігурації описані нижче.
- повне_відкриття_тегу / повне_закриття_тегу: розмітка, яка обгортає весь набір посилань, ідеально підходить для або контейнер.
- num_tag_open / num_tag_close: розмітка навколо кожного посилання на пронумеровану сторінку.
- cur_tag_open / cur_tag_close: розмітка навколо номера поточної активної сторінки.
- наступне_посилання / попереднє_посилання: текст або символи, що використовуються для кнопок «наступний» та «попередній».
Оскільки стилізація повністю знаходиться в конфігурації, ви можете змінити стиль пагінації в усьому застосунку, редагуючи один масив, не торкаючись логіки контролера.


