Paginering i CodeIgniter 4 med eksempel
⚡ Smart opsummering
Paginering i CodeIgniter opdeler store databaseresultatsæt i små, navigerbare sider ved hjælp af det indbyggede pagineringsbibliotek. Denne gennemgang opbygger et fungerende eksempel, der forespørger en forfattertabel, konfigurerer grænser pr. side og gengiver nummererede navigationslinks.

Databaser er levende enheder. De vokser med tiden. Når vi designer applikationer, skal vi tage højde for de mange poster, som brugerne skal gennemse. Paginering giver os mulighed for at opdele vores resultater i små, håndterbare dele. Følgende billede viser et eksempel på paginering på Google søge.
I denne vejledning lærer du, hvordan du paginerer databaseresultater i CodeIgniter ved hjælp af pagineringsbiblioteket. Denne vejledning forudsætter, at du er bekendt med det grundlæggende i CodeIgniter Active Record. Hvis du ikke kender det endnu, kan du læse de tidligere vejledninger. Den anden antagelse er, at du allerede har downloadet CodeTændingsapparat.
Database konfiguration
Vi starter med at oprette databasen og indsætte nogle dummy-records i den. Det vil være en enkelt tabeldatabase med 50 poster på.
Kør følgende script mod MySQL for at oprette databaseforfattertabellen. Indsæt 50 dummy-poster.
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');
Nu hvor vi har oprettet vores database og indsat dummy-poster i den, lad os konfigurere vores CodeIgniter-applikation til at kommunikere med databasen.
Åbn application/config/database.php
Indstil databaseforbindelsesparametre svarende til følgende
$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 );
HER,
- 'hostname' => 'localhost', indstiller værtsnavnet for databasen
- 'brugernavn' => 'root', angiver databasens brugernavn
- 'password' => 'melody', angiver databaseadgangskoden
- 'database' => 'ci_pagination', angiver databasenavnet.
Vi vil også automatisk indlæse databasebiblioteket, når vores applikation starter. Lad os gøre det. Åbn application/config/autoload.php
Indlæs databasebiblioteket som vist med koden nedenfor
$autoload['libraries'] = array('database');
Det er det for databasekonfigurationen.
Lad os nu arbejde med databasemodellen for pagination.
CodeIgniter Pagineringsdatabasemodel
Opret en ny model Authors_model i application/models
Tilføj følgende kode
<?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(); } }
HER,
- protected $table = 'authors'; definerer en beskyttet variabel, der indeholder databasetabellens navn for modellen
- public funktion __construct() {...} kalder den overordnede konstruktørmetode
- public function get_count() {…} returnerer det samlede antal poster i databasetabellen. Dette er nødvendigt til pagination.
- public function get_authors($limit, $start) {…} definerer en metode, der skal bruges til at hente paginerede resultater fra databasen. Vi indtaster limit og startpunkt. Limit definerer det samlede antal poster, der skal returneres, mens start definerer antallet af poster, der skal springes over.
Det var det for vores databasemodel. Lad os nu oprette de ruter, der skal reagere på vores paginerede resultater.
CodeIgniter Pagineringsruter
Åbn rutefilen i application/config/routes.php
Tilføj følgende rute
$route['authors/(:num)'] = 'authors';
HER,
- Vi definerer en rute for forfattere, der accepterer en valgfri parameter af tallet . Den valgfri parameter defineres ved hjælp af de åbne og lukkede parenteser. Den definerede rute kalder indeksmetoden i forfattercontrolleren.
Lad os nu gå videre til controlleren for vores paginerede resultater.
CodeIgniter Pagineringscontroller
Opret en ny fil Authors.php i application/controllers bibliotek
Tilføj følgende kode
<?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); } }
HER,
- klasse Authors udvider CI_Controller {...} vi definerer en klasse Authors, der udvider CI_Controller-klassen
- public funktion __construct() {...} denne metode initialiserer den overordnede konstruktør og indlæser url-hjælperen, forfattermodellen og pagineringsbiblioteket.
- public function index() {...} definerer metoden, der reagerer på vores ruteforfattere
- $config[“base_url”] = base_url().“authors”; angiver pagineringen URL som vil blive brugt til at generere pagineringslinks
- $config[“total_rows”] = $this->authors_model->get_count(); angiver det samlede antal rækker, der skal pagineres. Værdien hentes fra authors-modellen ved at kalde get_count-metoden.
- $config[“per_side”] = 10; definerer de rækker, der skal vises pr. side
- $config[“uri_segment”] = 2; angiver URL segment, der indeholder den værdi, der skal bruges til at springe poster over
- $this->pagination->initialize($config); initialiserer paginationsbiblioteket ved hjælp af de config-arrayværdier, vi definerede
- $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; kontrollerer om skip-nummeret er angivet i det andet segment af URI'en, og hvis det ikke er angivet, tildeles værdien 0 til variablen $page
- $data[“links”] = $this->pagination->create_links(); opretter pagineringslinkene og tildeler dem til linknøglen i $data array-variablen.
- $data['authors'] = $this->authors_model->get_authors($config[“per_page”], $page); henter de paginerede forfatterposter og tildeler dem til authors-nøglen i arrayvariablen $data
- $this->load->view('authors/index', $data); indlæser indeksvisningen i forfatterbiblioteket og sender array-variablen $data ind.
Det var alt for vores controller. Lad os nu oprette den visning, der viser vores databaseresultater.
Opret en ny mappeforfattere i applikation/visninger
Opret en ny fil index.php i application/views/authors/index.php
Tilføj følgende kode
<!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>
HER,
- Løber gennem resultaterne af variablen $authors og udskriver resultaterne i en tabel
- udskriver pagineringslinkene nederst i vores tabel.
Lad os nu starte vores ansøgning og se resultaterne.
I denne vejledning bruger vi den indbyggede PHP-webserver, men du kan bruge enhver webserver, der understøtter PHP.
Åbn terminalen
Kør følgende kommando
cd C:\Sites\ci-app php -S localhost:3000
HER,
- Ovenstående kommando browser til programkodebiblioteket og starter den indbyggede server på port 3000.
Bemærk: Stien til applikationen skal stemme overens med den sti, hvortil du downloadede CodeIgniter. Du kan bruge et hvilket som helst ledigt portnummer på din computer. Det er ikke nødvendigt at bruge port 3000.
Åbn webbrowseren og indlæs følgende URL
http://localhost:3000/authors
Du bør være i stand til at få resultater svarende til følgende
Sådan tilpasses CodeIgniter Pagineringslinks
Som standard udskriver create_links()-metoden almindelige ankertags. Du kan indpakke disse links i din egen markup, så de matcher et CSS-framework, f.eks. Bootstrap eller Bulma. Tilføj stylingnøglerne til det samme $config-array, før du kalder 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';
De mest nyttige konfigurationsnøgler er beskrevet nedenfor.
- fuld_tag_åben / fuld_tag_lukning: markup, der omslutter hele sættet af links, ideelt til en eller beholder.
- num_tag_åben / num_tag_luk: markup omkring hvert nummereret sidelink.
- cur_tag_open / cur_tag_close: markup omkring det aktuelle, aktive sidetal.
- næste_link / forrige_link: teksten eller symbolerne, der bruges til knapperne næste og forrige.
Fordi stylingen udelukkende findes i konfigurationen, kan du omstyle pagination på tværs af hele applikationen ved at redigere et enkelt array uden at røre din controller-logik.


