Pagination dans CodeIgniter: Le guide complet
French (Français) translation by Soleil (you can also view the original English article)
L'avantage d'utiliser tout framework d'application Web à pile complète est que vous n'avez pas à vous soucier des tâches courantes telles que le traitement des entrées, la validation de formulaire, etc., car le framework fournit déjà des wrappers pour ces fonctionnalités. Ainsi, cela vous permet de vous concentrer sur la logique métier de l'application plutôt que de réinventer la roue encore et encore.
Aujourd'hui, nous allons explorer une bibliothèque importante dans le framework CodeIgniter, la bibliothèque de pagination.
Permettez-moi de souligner les sujets que nous allons couvrir au cours de cet article:
- Démonstration de la pagination de base
- Explorez les options de personnalisation
- Configuration de la pagination
Démonstration de la pagination de base
Dans cette section, nous allons passer à un exemple qui montre l'utilisation de la pagination dans CodeIgniter. C'est la meilleure façon de comprendre comment les choses fonctionnent.
Dans notre exemple, nous allons construire une liste d'utilisateurs assez simple dans laquelle nous allons récupérer les enregistrements de la table MySQL des utilisateurs. Pour que cet exemple soit exécuté avec succès, assurez-vous de disposer des champs uid
et uname
dans votre table users.
Avec cette mise en place, nous sommes prêts à rouler.
Allez-y et créez un fichier contrôleurs controllers/Paging.php
avec le contenu suivant.
1 |
<?php
|
2 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
3 |
|
4 |
class Paging extends CI_Controller { |
5 |
public function __construct() |
6 |
{
|
7 |
parent::__construct(); |
8 |
|
9 |
// load Pagination library
|
10 |
$this->load->library('pagination'); |
11 |
|
12 |
// load URL helper
|
13 |
$this->load->helper('url'); |
14 |
}
|
15 |
|
16 |
public function index() |
17 |
{
|
18 |
// load db and model
|
19 |
$this->load->database(); |
20 |
$this->load->model('Users'); |
21 |
|
22 |
// init params
|
23 |
$params = array(); |
24 |
$limit_per_page = 1; |
25 |
$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; |
26 |
$total_records = $this->Users->get_total(); |
27 |
|
28 |
if ($total_records > 0) |
29 |
{
|
30 |
// get current page records
|
31 |
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); |
32 |
|
33 |
$config['base_url'] = base_url() . 'paging/index'; |
34 |
$config['total_rows'] = $total_records; |
35 |
$config['per_page'] = $limit_per_page; |
36 |
$config["uri_segment"] = 3; |
37 |
|
38 |
$this->pagination->initialize($config); |
39 |
|
40 |
// build paging links
|
41 |
$params["links"] = $this->pagination->create_links(); |
42 |
}
|
43 |
|
44 |
$this->load->view('user_listing', $params); |
45 |
}
|
46 |
|
47 |
public function custom() |
48 |
{
|
49 |
// load db and model
|
50 |
$this->load->database(); |
51 |
$this->load->model('Users'); |
52 |
|
53 |
// init params
|
54 |
$params = array(); |
55 |
$limit_per_page = 2; |
56 |
$page = ($this->uri->segment(3)) ? ($this->uri->segment(3) - 1) : 0; |
57 |
$total_records = $this->Users->get_total(); |
58 |
|
59 |
if ($total_records > 0) |
60 |
{
|
61 |
// get current page records
|
62 |
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $page*$limit_per_page); |
63 |
|
64 |
$config['base_url'] = base_url() . 'paging/custom'; |
65 |
$config['total_rows'] = $total_records; |
66 |
$config['per_page'] = $limit_per_page; |
67 |
$config["uri_segment"] = 3; |
68 |
|
69 |
// custom paging configuration
|
70 |
$config['num_links'] = 2; |
71 |
$config['use_page_numbers'] = TRUE; |
72 |
$config['reuse_query_string'] = TRUE; |
73 |
|
74 |
$config['full_tag_open'] = '<div class="pagination">'; |
75 |
$config['full_tag_close'] = '</div>'; |
76 |
|
77 |
$config['first_link'] = 'First Page'; |
78 |
$config['first_tag_open'] = '<span class="firstlink">'; |
79 |
$config['first_tag_close'] = '</span>'; |
80 |
|
81 |
$config['last_link'] = 'Last Page'; |
82 |
$config['last_tag_open'] = '<span class="lastlink">'; |
83 |
$config['last_tag_close'] = '</span>'; |
84 |
|
85 |
$config['next_link'] = 'Next Page'; |
86 |
$config['next_tag_open'] = '<span class="nextlink">'; |
87 |
$config['next_tag_close'] = '</span>'; |
88 |
|
89 |
$config['prev_link'] = 'Prev Page'; |
90 |
$config['prev_tag_open'] = '<span class="prevlink">'; |
91 |
$config['prev_tag_close'] = '</span>'; |
92 |
|
93 |
$config['cur_tag_open'] = '<span class="curlink">'; |
94 |
$config['cur_tag_close'] = '</span>'; |
95 |
|
96 |
$config['num_tag_open'] = '<span class="numlink">'; |
97 |
$config['num_tag_close'] = '</span>'; |
98 |
|
99 |
$this->pagination->initialize($config); |
100 |
|
101 |
// build paging links
|
102 |
$params["links"] = $this->pagination->create_links(); |
103 |
}
|
104 |
|
105 |
$this->load->view('user_listing', $params); |
106 |
}
|
107 |
}
|
Ensuite, nous aurons besoin d’un fichier de modèle models/Users.php
qui récupère les enregistrements de la table users.
1 |
<?php
|
2 |
// models/Users.php
|
3 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
4 |
|
5 |
class Users extends CI_Model |
6 |
{
|
7 |
function __construct() |
8 |
{
|
9 |
parent::__construct(); |
10 |
}
|
11 |
|
12 |
public function get_current_page_records($limit, $start) |
13 |
{
|
14 |
$this->db->limit($limit, $start); |
15 |
$query = $this->db->get("users"); |
16 |
|
17 |
if ($query->num_rows() > 0) |
18 |
{
|
19 |
foreach ($query->result() as $row) |
20 |
{
|
21 |
$data[] = $row; |
22 |
}
|
23 |
|
24 |
return $data; |
25 |
}
|
26 |
|
27 |
return false; |
28 |
}
|
29 |
|
30 |
public function get_total() |
31 |
{
|
32 |
return $this->db->count_all("users"); |
33 |
}
|
34 |
}
|
Enfin, créons un fichier view à views/user_listing.php
qui affiche la liste des utilisateurs.
1 |
<!-- views/user_listing.php -->
|
2 |
<html>
|
3 |
<head>
|
4 |
<title>Paging Example-User Listing</title> |
5 |
</head>
|
6 |
|
7 |
<body>
|
8 |
<div class="container"> |
9 |
<h1 id='form_head'>User Listing</h1> |
10 |
|
11 |
<?php if (isset($results)) { ?> |
12 |
<table border="1" cellpadding="0" cellspacing="0"> |
13 |
<tr>
|
14 |
<th>ID</th> |
15 |
<th>NAME</th> |
16 |
</tr>
|
17 |
|
18 |
<?php foreach ($results as $data) { ?> |
19 |
<tr>
|
20 |
<td><?php echo $data->uid ?></td> |
21 |
<td><?php echo $data->uname ?></td> |
22 |
</tr>
|
23 |
<?php } ?> |
24 |
</table>
|
25 |
<?php } else { ?> |
26 |
<div>No user(s) found.</div> |
27 |
<?php } ?> |
28 |
|
29 |
<?php if (isset($links)) { ?> |
30 |
<?php echo $links ?> |
31 |
<?php } ?> |
32 |
</div>
|
33 |
</body>
|
34 |
</html>
|
Maintenant, allez-y et accédez à notre page personnalisée à l'adresse http://votre-site-code-allumeur/paging/index et vous devriez voir la liste des utilisateurs avec la pagination! Alors ça y est, on l'a fait! Ne vous inquiétez pas, je ne vous quitterai pas de si tôt, car nous allons maintenant disséquer chaque partie du code.
Nous allons commencer avec le fichier de modèle models/Users.php
, car cela s'appelle quelque chose à partir de nos méthodes de contrôleur. Il existe deux méthodes importantes, get_current_page_records
et get_total
, que notre modèle implémente afin de générer les liens de pagination.
Passons à la méthode get_total
. Il est utilisé pour compter le nombre d'enregistrements dans la table des utilisateurs.
1 |
public function get_total() |
2 |
{
|
3 |
return $this->db->count_all("users"); |
4 |
}
|
Ensuite, il y a une méthode get_current_page_records
.
1 |
public function get_current_page_records($limit, $start) |
2 |
{
|
3 |
$this->db->limit($limit, $start); |
4 |
$query = $this->db->get("users"); |
5 |
|
6 |
if ($query->num_rows() > 0) |
7 |
{
|
8 |
foreach ($query->result() as $row) |
9 |
{
|
10 |
$data[] = $row; |
11 |
}
|
12 |
|
13 |
return $data; |
14 |
}
|
15 |
|
16 |
return false; |
17 |
}
|
Vous devez noter deux arguments importants dans la méthode get_current_page_records
. Le premier argument, $limit
, est utilisé pour spécifier le nombre d'enregistrements qui seront renvoyés lors de l'exécution de la requête. Et le deuxième argument, $start
, agit comme index de départ de l'enregistrement.
Donc, comme vous pouvez le constater, étant donné les valeurs de $start
et $limit,
nous pouvons récupérer les enregistrements par page. C’est l’essence même de la pagination, et entre temps, nous avons mis en œuvre la méthode la plus importante de cet article!
C'était donc notre modèle, simple et élégant!
Pour aller de l’avant, reportons notre attention sur le fichier du contrôleur. Allez-y et récupérez le code de la méthode constructeur.
1 |
public function __construct() |
2 |
{
|
3 |
parent::__construct(); |
4 |
|
5 |
// load Pagination library
|
6 |
$this->load->library('pagination'); |
7 |
|
8 |
// load URL helper
|
9 |
$this->load->helper('url'); |
10 |
}
|
Pour pouvoir utiliser la pagination dans CodeIgniter, la première chose à faire est de charger la bibliothèque de pagination. Et nous pouvons le faire en utilisant $this->load->library('pagination')
.
Nous avons également chargé l'URL helper afin de pouvoir utiliser les fonctions d'assistance globale fournies par cet assistant.
Nous sommes maintenant prêts à passer au cœur de notre contrôleur: la méthode de l'index
.
1 |
public function index() |
2 |
{
|
3 |
// load db and model
|
4 |
$this->load->database(); |
5 |
$this->load->model('Users'); |
6 |
|
7 |
// init params
|
8 |
$params = array(); |
9 |
$limit_per_page = 1; |
10 |
$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; |
11 |
$total_records = $this->Users->get_total(); |
12 |
|
13 |
if ($total_records > 0) |
14 |
{
|
15 |
// get current page records
|
16 |
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); |
17 |
|
18 |
$config['base_url'] = base_url() . 'paging/index'; |
19 |
$config['total_rows'] = $total_records; |
20 |
$config['per_page'] = $limit_per_page; |
21 |
$config["uri_segment"] = 3; |
22 |
|
23 |
$this->pagination->initialize($config); |
24 |
|
25 |
// build paging links
|
26 |
$params["links"] = $this->pagination->create_links(); |
27 |
}
|
28 |
|
29 |
$this->load->view('user_listing', $params); |
30 |
}
|
Pour commencer, nous nous assurons que la base de données est chargée correctement. Ensuite, nous chargeons le modèle Users
afin de pouvoir utiliser les méthodes du modèle.
1 |
$this->load->database(); |
2 |
$this->load->model('Users'); |
Ensuite, nous initialisons quelques variables importantes.
1 |
// init params
|
2 |
$params = array(); |
3 |
$limit_per_page = 1; |
4 |
$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; |
5 |
$total_records = $this->Users->get_total(); |
La variable $limit_per_page
définit la limite par page. Bien sûr, vous pouvez le définir comme vous le souhaitez; il est mis à 1 pour le moment à titre d'exemple.
La variable $start_index
contient l'index de départ de l'enregistrement MySQL. Lorsque CodeIgniter crée les liens de pagination, il ajoute l'index de départ de la page en tant que troisième segment de l'URL par défaut. Vous pouvez modifier ce comportement par défaut, mais nous réserverons cette option à la dernière section de cet article, où nous discuterons des options de personnalisation.
Enfin, nous appelons la méthode get_total
du modèle Users pour obtenir le nombre total d'enregistrements de la table users, qui est attribuée à la variable $total_records
.
Ensuite, nous récupérons les enregistrements de la page actuelle en utilisant la méthode get_current_page_records
.
1 |
// get current page records
|
2 |
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); |
Avant de pouvoir créer des liens de pagination, nous devons initialiser la configuration de pagination minimale à l'aide de la méthode initialize
de la bibliothèque de pagination.
1 |
$config['base_url'] = base_url() . 'paging/index'; |
2 |
$config['total_rows'] = $total_records; |
3 |
$config['per_page'] = $limit_per_page; |
4 |
$config["uri_segment"] = 3; |
5 |
|
6 |
$this->pagination->initialize($config); |
Et c'est l'ensemble des paramètres minimum pour construire les liens de pagination.
- base_url: l'URL qui sera utilisée lors de la création des liens de pagination
- total_rows: Nombre total d'enregistrements
- per_page: Nombre d'enregistrements par page
Enfin, nous utilisons la méthode create_links
pour créer des liens de pagination.
1 |
// build paging links
|
2 |
$params["links"] = $this->pagination->create_links(); |
Le reste n'est que la formalité d'appeler notre vue user_listing
et de rendre le résultat! Exécutez l'URL http://votre-code-site-allumeur/paging/index pour afficher la liste des utilisateurs avec les liens de pagination.
Voilà donc un exemple de pagination à la fois simple et utile que vous pouvez étendre pour répondre à vos besoins.
Dans la section suivante, nous verrons comment personnaliser la pagination par défaut en termes d’apparence et de fonctionnalité.
Explorer les options de personnalisation
Dans cette section, nous allons explorer les options disponibles que vous pouvez utiliser si vous souhaitez personnaliser les liens de pagination par défaut.
URI segment
Bien que la bibliothèque de pagination CodeIgniter détecte automatiquement le paramètre relatif à la pagination à partir de l'URL, vous pouvez définir une valeur personnalisée si vous avez un modèle d'URL différent.
1 |
$config["uri_segment"] = 4; |
Nombre de liens numériques
L'option num_links
vous permet de définir le nombre de liens numériques à afficher avant et après le numéro de page actif dans les liens de pagination.
1 |
$config['num_links'] = 2; |
Numéro de page en tant que segment d'URI
Lorsque vous accédez au segment d'URI de pagination, il s'agit d'un index de départ par défaut. Par exemple, si vous avez dix enregistrements par page, le segment d'URI de pagination est 20 pour la troisième page. À la place, si vous souhaitez afficher les numéros de page réels dans les liens de pagination, vous pouvez définir use_page_numbers
sur TRUE
.
1 |
$config['use_page_numbers'] = TRUE; |
Bien sûr, vous devez vous assurer de calculer le bon index de départ en fonction du numéro de page que vous récupérez à partir de l'URL.
Préserver la chaîne de requête
Le plus souvent, vous vous retrouvez dans la situation où vous souhaitez conserver les paramètres de chaîne de requête qui ne sont pas liés à la pagination. Vous pouvez utiliser l'option reuse_query_string
pour activer cette fonction.
1 |
$config['reuse_query_string'] = TRUE; |
Voici quelques options que vous pouvez utiliser pour modifier la fonctionnalité de pagination par défaut. Ensuite, nous examinerons quelques autres options vous permettant de modifier l’affichage des liens de pagination.
Étiquette d'emballage
Si vous souhaitez envelopper le code de pagination avec une autre balise HTML, vous pouvez le faire en utilisant les options full_tag_open
et full_tag_close
.
1 |
$config['full_tag_open'] = '<div class="pagination">'; |
2 |
$config['full_tag_close'] = '</div>'; |
Cela pourrait être vraiment utile si vous souhaitez appliquer un style personnalisé aux liens de pagination.
Premier, Dernier, Suivant et Précédent
Si vous souhaitez modifier le texte qui sera affiché pour les premier, dernier, suivant et précédent liens, vous pouvez également le faire.
1 |
$config['first_link'] = 'First Page'; |
2 |
$config['last_link'] = 'Last Page'; |
3 |
$config['next_link'] = 'Next Page'; |
4 |
$config['prev_link'] = 'Prev Page'; |
En outre, si vous souhaitez envelopper ces liens individuels avec n’importe quelle balise HTML, vous pouvez le faire de la même manière que nous l’avons fait pour envelopper tout le code de pagination.
1 |
$config['first_tag_open'] = '<span class="firstlink">'; |
2 |
$config['first_tag_close'] = '</span>'; |
3 |
|
4 |
$config['last_tag_open'] = '<span class="lastlink">'; |
5 |
$config['last_tag_close'] = '</span>'; |
6 |
|
7 |
$config['next_tag_open'] = '<span class="nextlink">'; |
8 |
$config['next_tag_close'] = '</span>'; |
9 |
|
10 |
$config['prev_tag_open'] = '<span class="prevlink">'; |
11 |
$config['prev_tag_close'] = '</span>'; |
Lien actif et lien numérique
Parfois, vous souhaitez styler le lien actif différemment. Vous pouvez le faire en appliquant les balises wrapper comme indiqué ci-dessous.
1 |
$config['cur_tag_open'] = '<span class="curlink">'; |
2 |
$config['cur_tag_close'] = '</span>'; |
De la même manière, si vous souhaitez envelopper des liens numériques avec quelque chose:
1 |
$config['num_tag_open'] = '<span class="numlink">'; |
2 |
$config['num_tag_close'] = '</span>'; |
Et cela met fin à l'histoire de la personnalisation. En fait, vous pouvez aller de l'avant et consulter l'exemple de personnalisation à l'adresse http://votre-site-code-allumeur/paging/custom déjà inclus dans notre fichier de contrôleur!
Configuration de pagination
Vous êtes maintenant au courant de la configuration requise pour configurer une pagination correcte avec une liste de modèles. Et la plupart du temps, vous souhaitez que le site reste le même. Qu'allez-vous faire pour y parvenir? Vous pourriez être tenté de copier le code de configuration et de le coller dans chaque action nécessitant la configuration de la pagination.
En fait, il existe une meilleure façon de gérer ce scénario. Vous pouvez créer un fichier de configuration de pagination dans application/config/pagination.php
et utiliser la variable $config
pour définir vos paramètres
1 |
<?php
|
2 |
$config['per_page'] = 10; |
3 |
$config["uri_segment"] = 3; |
4 |
|
5 |
$config['full_tag_open'] = '<div class="pagination">'; |
6 |
$config['full_tag_close'] = '</div>'; |
7 |
|
8 |
$config['first_link'] = 'First Page'; |
9 |
$config['first_tag_open'] = '<span class="firstlink">'; |
10 |
$config['first_tag_close'] = '</span>'; |
11 |
|
12 |
$config['last_link'] = 'Last Page'; |
13 |
$config['last_tag_open'] = '<span class="lastlink">'; |
14 |
$config['last_tag_close'] = '</span>'; |
15 |
|
16 |
$config['next_link'] = 'Next Page'; |
17 |
$config['next_tag_open'] = '<span class="nextlink">'; |
18 |
$config['next_tag_close'] = '</span>'; |
19 |
|
20 |
$config['prev_link'] = 'Prev Page'; |
21 |
$config['prev_tag_open'] = '<span class="prevlink">'; |
22 |
$config['prev_tag_close'] = '</span>'; |
23 |
|
24 |
$config['cur_tag_open'] = '<span class="curlink">'; |
25 |
$config['cur_tag_close'] = '</span>'; |
26 |
|
27 |
$config['num_tag_open'] = '<span class="numlink">'; |
28 |
$config['num_tag_close'] = '</span>'; |
Sur cette base, la méthode d'action index
révisée devrait ressembler à ceci:
1 |
public function index() |
2 |
{
|
3 |
// load db and model
|
4 |
$this->load->database(); |
5 |
$this->load->model('Users'); |
6 |
|
7 |
// init params
|
8 |
$params = array(); |
9 |
$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; |
10 |
$total_records = $this->Users->get_total(); |
11 |
|
12 |
// load config file
|
13 |
$this->config->load('pagination', TRUE); |
14 |
$settings = $this->config->item('pagination'); |
15 |
$settings['total_rows'] = $this->Users->get_total(); |
16 |
$settings['base_url'] = base_url() . 'paging/config'; |
17 |
|
18 |
if ($total_records > 0) |
19 |
{
|
20 |
// get current page records
|
21 |
$params["results"] = $this->Users->get_current_page_records($settings['per_page'], $start_index); |
22 |
|
23 |
// use the settings to initialize the library
|
24 |
$this->pagination->initialize($settings); |
25 |
|
26 |
// build paging links
|
27 |
$params["links"] = $this->pagination->create_links(); |
28 |
}
|
29 |
|
30 |
$this->load->view('user_listing', $params); |
31 |
}
|
Bien entendu, les variables total_rows
et base_url
changent d'une action à l'autre. Vous devez donc les définir explicitement dans chaque action.
Pour ce faire, vous devez commencer par charger la configuration de pagination.
1 |
$this->config->load('pagination', TRUE); |
2 |
$settings = $this->config->item('pagination'); |
Ensuite, vous pouvez remplacer les paramètres spécifiques à l'action.
1 |
$settings['total_rows'] = $this->Users->get_total(); |
2 |
$settings['base_url'] = base_url() . 'paging/config'; |
Et vous en avez fini avec ça!
C'était donc l'histoire de la configuration de la pagination, et cela termine également cet article!
Conclusion
Aujourd'hui, nous avons parcouru la bibliothèque de pagination dans CodeIgniter.
Dans la première partie de cet article, j'ai montré comment utiliser la bibliothèque de pagination en fournissant un exemple très simple mais utile.
Nous avons ensuite abordé les options de personnalisation à votre disposition lors de la configuration de la pagination.
Enfin, nous avons discuté de la configuration de la pagination dans la dernière section.
CodeIgniter est une plate-forme PHP puissante. Que vous commenciez ou que vous commenciez avec la prochaine version, n'oubliez pas de consulter également ce que nous avons à votre disposition.
J'aimerais connaître vos commentaires sous forme de questions et de commentaires à l'aide du flux ci-dessous!