Базы данных — это живые существа. Они растут с течением времени. При разработке приложений нам необходимо учитывать множество записей, которые пользователям придется просматривать. Нумерация страниц позволяет нам разбивать наши результаты на небольшие управляемые части. На следующем изображении показан пример разбиения на страницы в поиске Google.
В этом руководстве вы узнаете, как разбить на страницы результаты базы данных в CodeIgniter с помощью библиотеки разбивки на страницы. В этом руководстве предполагается, что вы знакомы с основами активной записи CodeIgniter. Если вы этого не сделаете, то вы можете прочитать предыдущие уроки. Другое предположение состоит в том, что вы уже загрузили CodeIgniter.
В этом уроке вы узнаете
- Конфигурация базы данных
- Модель базы данных разбивки на страницы CodeIgniter
- CodeIgniter Пагинация Маршруты
- CodeIgniter Pagination Controller
Конфигурация базы данных
Мы начнем с создания базы данных и вставки в нее фиктивных записей. Это будет база данных с одной таблицей с 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', '[email protected]', '1974-05-21', '1999-09-17 19:17:28'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (2, 'Flavio', 'Lehner', '[email protected]', '1971-10-14', '1998-09-09 00:25:06'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (3, 'Elmira', 'Johns', '[email protected]', '1983-11-28', '2015-02-07 15:56:43'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (4, 'Elza', 'Mitchell', '[email protected]', '1989-03-08', '1992-08-21 00:21:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (5, 'Viva', 'Greenfelder', '[email protected]', '1995-04-17', '2017-04-30 05:55:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (6, 'Maxwell', 'VonRueden', '[email protected]', '1994-07-01', '1996-05-08 23:30:14'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (7, 'Deontae', 'Becker', '[email protected]', '1992-02-19', '2017-07-22 11:49:15'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (8, 'Sylvester', 'Christiansen', '[email protected]', '1990-09-03', '2004-05-08 08:15:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (9, 'Torrey', 'Strosin', '[email protected]', '1999-10-09', '2009-08-30 21:30:44'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (10, 'Kelli', 'Smitham', '[email protected]', '2012-11-07', '1986-01-22 20:52:57'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (11, 'Abigale', 'Schuppe', '[email protected]', '2018-02-18', '1994-05-07 06:26:36'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (12, 'Letha', 'Gleason', '[email protected]', '2009-02-06', '1998-05-25 04:37:54'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (13, 'Sienna', 'Upton', '[email protected]', '2017-08-17', '2009-08-08 19:08:10'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (14, 'Harley', 'Gutkowski', '[email protected]', '1987-11-30', '1998-07-31 11:08:01'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (15, 'Lois', 'Bednar', '[email protected]', '2002-02-11', '2001-07-26 15:04:16'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (16, 'Gail', 'McDermott', '[email protected]', '1987-03-30', '2004-12-15 20:38:29'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (17, 'Sydney', 'Strosin', '[email protected]', '1985-04-29', '2010-08-07 08:50:35'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (18, 'Anne', 'Cremin', '[email protected]', '1976-02-15', '1980-03-25 05:29:41'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (19, 'Norberto', 'Bergnaum', '[email protected]', '1971-03-11', '1993-03-20 23:36:25'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (20, 'Arvid', 'Johns', '[email protected]', '2016-01-03', '1995-04-30 17:07:15'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (21, 'Bernita', 'Fay', '[email protected]', '1983-12-26', '1987-02-23 16:55:28'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (22, 'Gonzalo', 'Gorczany', '[email protected]', '1987-10-19', '2016-10-18 19:25:46'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (23, 'Jackie', 'Klein', '[email protected]', '1971-01-20', '2010-11-16 02:58:05'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (24, 'Andrew', 'Kessler', '[email protected]', '1984-08-07', '1971-12-15 08:46:42'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (25, 'Claire', 'Hudson', '[email protected]', '1984-12-19', '1991-07-04 14:35:53'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (26, 'Prudence', 'Runte', '[email protected]', '2008-12-27', '1985-09-30 04:57:55'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (27, 'Destinee', 'Romaguera', '[email protected]', '1978-11-09', '1997-11-09 19:58:08'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (28, 'Marianna', 'Harvey', '[email protected]', '2013-08-28', '1990-08-06 19:29:19'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (29, 'Eloy', 'Lakin', '[email protected]', '1989-12-08', '1974-03-16 03:21:16'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (30, 'Rubie', 'McClure', '[email protected]', '1987-09-12', '1998-07-02 10:45:36'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (31, 'Marisa', 'Stracke', '[email protected]', '1975-05-28', '1975-03-19 00:57:35'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (32, 'Jacey', 'Beatty', '[email protected]', '1979-12-17', '1971-01-21 16:50:58'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (33, 'Idella', 'Ruecker', '[email protected]', '2009-09-15', '1996-04-19 22:27:31'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (34, 'Dimitri', 'Bednar', '[email protected]', '1998-12-02', '2008-12-30 23:29:57'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (35, 'Elfrieda', 'Smitham', '[email protected]', '2018-07-23', '1972-04-01 07:52:25'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (36, 'Dwight', 'Walter', '[email protected]', '2016-08-15', '1994-07-02 11:06:55'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (37, 'Macie', 'Fay', '[email protected]', '1976-01-29', '2005-12-13 18:44:46'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (38, 'Lori', 'Kshlerin', '[email protected]', '1983-04-08', '1986-01-18 16:03:52'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (39, 'Jeffry', 'Paucek', '[email protected]', '2002-10-02', '2004-03-29 07:06:03'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (40, 'Yvonne', 'Bernhard', '[email protected]', '2017-11-04', '1986-12-15 23:55:23'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (41, 'Ludwig', 'Heathcote', '[email protected]', '1981-02-09', '2000-08-02 20:45:48'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (42, 'Jadyn', 'Wiegand', '[email protected]', '1982-06-16', '1980-12-05 13:09:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (43, 'Ferne', 'Smitham', '[email protected]', '1996-12-17', '1984-11-18 19:26:27'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (44, 'Meta', 'Corkery', '[email protected]', '1972-03-31', '2007-01-20 00:07:31'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (45, 'Toni', 'Wolf', '[email protected]', '2012-04-15', '1973-06-22 12:14:37'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (46, 'Zack', 'Luettgen', '[email protected]', '2003-05-29', '2018-11-19 05:03:21'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (47, 'Kameron', 'Dietrich', '[email protected]', '1973-05-20', '1974-09-16 20:27:17'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (48, 'Zetta', 'Lebsack', '[email protected]', '1996-11-04', '2001-03-06 01:33:01'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (49, 'Benny', 'Hane', '[email protected]', '2008-02-02', '2006-01-27 22:12:39'); INSERT INTO `authors` (`id`, `first_name`, `last_name`, `email`, `birthdate`, `added`) VALUES (50, 'Evans', 'Gleason', '[email protected]', '1999-09-09', '1990-09-26 17:50:11');
Теперь, когда мы успешно создали нашу базу данных и вставили в нее фиктивные записи, давайте настроим наше приложение CodeIgniter для связи с базой данных.
Откройте приложение / 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' => 'openseseme', устанавливает пароль базы данных
- 'database' => 'ci_pagination', указывает имя базы данных.
Мы также будем автоматически загружать библиотеку базы данных при запуске нашего приложения. Давайте сделаем это. Откройте приложение / config / autoload.php
Загрузите библиотеку базы данных, как показано кодом ниже
$autoload['libraries'] = array('database');
Вот и все для конфигурации базы данных.
Давайте теперь работать над моделью базы данных для разбивки на страницы
Модель базы данных разбивки на страницы CodeIgniter
Создайте новую модель 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(); } }
ВОТ,
- защищенный $ table = 'авторы'; определить защищенную переменную, которая определяет имя таблицы базы данных для модели
- публичная функция __construct () {…} вызывает метод родительского конструктора
- public function get_count () {…} возвращает общее количество записей в таблице базы данных. Это необходимо для нумерации страниц
- публичная функция get_authors ($ limit, $ start) {…} определяет метод, который будет использоваться для получения разбитых на страницы результатов из базы данных. Мы будем проходить в пределе и начальной точке. Предел определяет общее количество записей, которые будут возвращены, в то время как начало определяет количество записей, которые должны быть пропущены
вот и все для нашей модели базы данных. Давайте теперь создадим маршруты, которые будут отвечать нашим постраничным результатам.
CodeIgniter Пагинация Маршруты
Откройте файл маршрутов в приложении / config / rout.php
Добавьте следующий маршрут
$route['authors/(:num)'] = 'authors';
ВОТ,
- Мы определяем автора маршрута, который принимает необязательный параметр числа. Необязательный параметр определяется с помощью открывающей и закрывающей скобок. Определенный маршрут вызывает метод индекса в контроллере авторов.
Давайте теперь перейдем к контроллеру для наших разбитых на страницы результатов
CodeIgniter Pagination Controller
Создайте новый файл 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); } }
ВОТ,
- класс Authors extends CI_Controller {…} мы определяем класс Authors, который расширяет класс CI_Controller
- public function __construct () {…} этот метод инициализирует родительский конструктор и загружает помощника url, модель авторов и библиотеку разбиения на страницы.
- public function index () {…} определяет метод, который отвечает нашим авторам маршрута
- $ config ["base_url"] = base_url (). "авторы"; устанавливает URL пагинации, который будет использоваться для генерации ссылок на страницы
- $ config ["total_rows"] = $ this- >hors_model-> get_count (); устанавливает общую строку, которая должна быть разбита на страницы. Значение извлекается из модели авторов путем вызова метода get_count.
- $ config ["per_page"] = 10; определяет строки, которые должны отображаться на странице
- $ config ["uri_segment"] = 2; указывает сегмент URL, который содержит значение, которое будет использоваться для пропуска записей
- $ This-> pagination-> Initialize ($ конфигурации); инициализирует библиотеку разбиения на страницы, используя значение массива config, которое мы определили, и присвоим вышеуказанные значения.
- $ page = ($ this-> uri-> сегмент (2))? $ this-> uri-> сегмент (2): 0; проверяет, был ли установлен номер пропуска во втором сегменте URI, и если он не установлен, то значение 0 присваивается переменной $ page
- $ data ["links"] = $ this-> pagination-> create_links (); создает ссылки пагинации и назначает их ключу ссылки переменной массива $ data.
- data ['hors '] = $ this- >hors_model-> get_authors ($ config ["per_page"], $ page); извлекает постраничные записи авторов и присваивает их ключу авторов переменной массива $ data
- $ this-> load-> view ('авторы / индекс', $ данные); загружает индексное представление в каталог авторов и передает в переменную массива $ data.
Вот и все для нашей модели. Давайте теперь создадим представление, которое будет отображать результаты нашей базы данных.
Создать новый каталог авторов в приложении / views
Создайте новый файл index.php в приложении / views / авторы / 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://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> </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>
ВОТ,
- <? php foreach ($hors as $ author):?> просматривает результаты переменной $ author и выводит результаты в таблицу
- <p> <? php echo $ links; ?> </ p> печатает ссылки на страницы в нижней части таблицы.
Давайте теперь запустим наше приложение и посмотрим результаты
В этом руководстве мы используем встроенный веб-сервер PHP, но вы можете использовать любой веб-сервер, поддерживающий PHP.
Откройте терминал
Запустите следующую команду
cd C:\Sites\ci-app php -S localhost:3000
ВОТ,
- Приведенная выше команда просматривает каталог кода приложения и запускает встроенный сервер через порт 3000.
Примечание. Путь к приложению должен соответствовать пути, по которому вы загрузили CodeIgniter. Для этого вы можете использовать любой свободный номер порта на вашем компьютере. Нет необходимости использовать порт 3000.
Откройте веб-браузер и загрузите следующий URL
Http: // Localhost: 3000 / авторы
Вы должны быть в состоянии получить результаты, подобные следующим
Резюме
В этом руководстве мы рассмотрели основы разбивки на страницы и воспользовались библиотекой разбивки на страницы в CodeIgniter и использовали ее для создания приложения, разбивающего на страницы результаты базы данных.