Seitenumbruch in CodeIgniter: Der vollständige Leitfaden
German (Deutsch) translation by Wei Zhang (you can also view the original English article)
Der Vorteil eines Full-Stack-Webanwendungsframeworks besteht darin, dass Sie sich keine Gedanken über die üblichen Aufgaben wie Eingabeverarbeitung, Formularüberprüfung und Ähnliches machen müssen, da das Framework bereits Wrapper für diese Funktionen bereitstellt. So können Sie sich auf die Geschäftslogik der Anwendung konzentrieren, anstatt das Rad immer wieder neu zu erfinden.
Heute werden wir eine wichtige Bibliothek im CodeIgniter-Framework erkunden - die Paginierungsbibliothek.
Lassen Sie mich die Themen hervorheben, die wir im Verlauf dieses Artikels behandeln werden:
- Demonstration des grundlegenden Paging
- Erkunden Sie die Anpassungsoptionen
- Seitenumbruch Konfiguration
Demonstration des grundlegenden Paging
In diesem Abschnitt wird ein Beispiel erläutert, das die Verwendung der Seitennumerierung in CodeIgniter veranschaulicht. Es ist der beste Weg zu verstehen, wie die Dinge insgesamt funktionieren.
In unserem Beispiel erstellen wir eine ziemlich einfache Benutzerliste, in der wir Datensätze aus der MySQL-Tabelle des Benutzers abrufen. Stellen Sie sicher, dass Sie die Felder "uid
" und "uname
" in Ihrer Benutzertabelle haben, um dieses Beispiel erfolgreich auszuführen.
Damit sind wir bereit zu rollen.
Gehen Sie voran und erstellen Sie eine Controller-Datei controllers/Paging.php
mit den folgenden Inhalten.
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 |
}
|
Als Nächstes benötigen wir eine Modelldatei models/Users.php
, die Datensätze aus der Benutzertabelle abruft
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 |
}
|
Schließlich erstellen wir eine View-Datei unter views/user_listing.php
, die den Benutzereintrag anzeigt.
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>
|
Nun, gehen Sie weiter und rufen Sie unsere benutzerdefinierte Seite unter http://your-Code-igniter-site/paging/index und Sie sollten die Benutzerliste zusammen mit der Paginierung sehen! Also, das war's, wir haben es geschafft! Mach dir keine Sorgen, ich werde dich nicht so bald verlassen, da wir jetzt anfangen werden, jeden Teil des Codes zu analysieren.
Wir beginnen mit der Modelldatei models / Users.php
, da diese von unseren Controller-Methoden aufgerufen wird. Es gibt zwei wichtige Methoden, get_current_page_records
und get_total
, die unser Modell implementiert, um die Paginierungslinks zu erstellen.
Lassen Sie uns die Methode get_total
durchlaufen. Es wird verwendet, um die Anzahl der Datensätze in der Benutzertabelle zu zählen.
1 |
public function get_total() |
2 |
{
|
3 |
return $this->db->count_all("users"); |
4 |
}
|
Als nächstes gibt es eine Methode 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 |
}
|
Es gibt zwei wichtige Argumente, die Sie in der Methode get_current_page_records
beachten sollten. Das erste Argument $limit
wird verwendet, um die Anzahl der Datensätze anzugeben, die während der Abfrage zurückgegeben werden. Und das zweite Argument, $start
, fungiert als Startindex des Datensatzes.
Wie Sie sehen, können wir mit den Werten von $start
und $limit
Datensätze nach Seite abrufen. Das ist die Essenz von Paging, und mittlerweile haben wir die wichtigste Methode dieses Artikels implementiert!
Also, das war unser Modell - einfach und elegant!
Bewegen wir uns weiter, schauen wir uns die Controller-Datei an. Mach weiter und schnapp dir den Code der Konstruktormethode.
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 |
}
|
Um die Seitennummerierung in CodeIgniter zu verwenden, müssen Sie zunächst die Paginierungsbibliothek laden. Und wir können es tun, indem wir $this->load->library('pagination')
benutzen.
Wir haben auch den URL-Helper geladen, so dass wir globale Hilfsfunktionen verwenden können, die von diesem Helfer bereitgestellt werden.
Jetzt sind wir bereit, durch das Herz unseres Controllers zu gehen - die index
-Methode.
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 |
}
|
Zunächst stellen wir sicher, dass die Datenbank korrekt geladen ist. Danach laden wir das Users
-Modell, damit wir die Modellmethoden verwenden können.
1 |
$this->load->database(); |
2 |
$this->load->model('Users'); |
Als nächstes initialisieren wir ein paar wichtige Variablen.
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(); |
Die Variable $limit_per_page
definiert das Limit pro Seite. Natürlich können Sie es so einstellen, wie Sie es wünschen; Zum Beispiel ist es auf 1 gesetzt.
Die Variable $start_index
enthält den Startindex des MySQL-Datensatzes. Wenn CodeIgniter die Seitenumbruch-Links erstellt, hängt es standardmäßig den Startindex der Seite als drittes Segment in der URL an. Sie können dieses Standardverhalten ändern, aber das ist etwas, was wir für den letzten Abschnitt dieses Artikels reservieren, wo wir die Anpassungsoptionen besprechen.
Schließlich rufen wir die Methode get_total
des Benutzermodells auf, um die Gesamtdatensätze der Benutzertabelle abzurufen, und sie werden der Variablen $total_records
zugewiesen.
Als nächstes holen wir die Datensätze der aktuellen Seite mit der Methode get_current_page_records
.
1 |
// get current page records
|
2 |
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); |
Bevor wir tatsächlich Paginierungslinks erstellen können, müssen wir die minimale Paging-Konfiguration mit der initialize
-Methode der Paging-Bibliothek initialisieren.
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); |
Und das sind die Mindestparameter zum Erstellen der Seitenumbruch-Links.
- base_url: Die URL, die beim Erstellen von Paginierungslinks verwendet wird
- total_rows: Gesamtanzahl der Datensätze
- per_page: Anzahl der Datensätze pro Seite
Schließlich verwenden wir die Methode create_links
, um Paginierungslinks zu erstellen.
1 |
// build paging links
|
2 |
$params["links"] = $this->pagination->create_links(); |
Der Rest ist nur die Formalität, um unsere View user_listing
aufzurufen und die Ausgabe zu rendern! Führen Sie die URL http://your-code-igniter-site/paging/index aus, um die Benutzerliste zusammen mit den Paginierungslinks anzuzeigen.
Dies ist ein sehr einfaches und nützliches Paginierungsbeispiel, das Sie Ihren Anforderungen entsprechend erweitern können.
Im nächsten Abschnitt erfahren Sie, wie Sie die Standardpaginierung hinsichtlich Aussehen und Funktionalität anpassen können.
Erkunden Sie die Anpassungsoptionen
In diesem Abschnitt werden wir die verfügbaren Optionen untersuchen, die Sie verwenden könnten, wenn Sie die standardmäßigen Seitenumbruch-Links anpassen möchten.
URI-Segment
Obwohl die CodeIgniter-Paging-Bibliothek den Paging-bezogenen Parameter automatisch über die URL erkennt, können Sie einen benutzerdefinierten Wert definieren, wenn Sie ein anderes URL-Muster verwenden.
1 |
$config["uri_segment"] = 4; |
Anzahl der Ziffernlinks
Mit der Option num_links
können Sie die Anzahl der digit-Links festlegen, die vor und nach der aktiven Seitenzahl in den Paginierungslinks angezeigt werden.
1 |
$config['num_links'] = 2; |
Seitenzahl als URI-Segment
Wenn Sie auf das Paging-URI-Segment zugreifen, ist dies standardmäßig ein Startindex. Wenn Sie beispielsweise zehn Datensätze pro Seite haben, beträgt das Paging-URI-Segment 20 für die dritte Seite. Wenn Sie in den Seitenverknüpfungen tatsächliche Seitenzahlen anzeigen möchten, können Sie stattdessen use_page_numbers
auf TRUE
setzen.
1 |
$config['use_page_numbers'] = TRUE; |
Natürlich müssen Sie sicherstellen, dass Sie den richtigen Startindex basierend auf der Seitenzahl berechnen, die Sie von der URL abrufen.
Abfragestring beibehalten
In den meisten Fällen landen Sie in der Situation, in der Sie Abfragezeichenfolgenparameter beibehalten möchten, die nicht mit der Seitennumerierung zusammenhängen. Sie können die Option reuse_query_string
verwenden, um diese Einrichtung zu aktivieren.
1 |
$config['reuse_query_string'] = TRUE; |
Dies waren einige Optionen, mit denen Sie die standardmäßige Seitenumbruchfunktionalität ändern konnten. Als Nächstes betrachten wir einige andere Optionen, mit denen Sie die Art und Weise ändern können, in der Paginierungslinks angezeigt werden.
Wrapper-Tag
Wenn Sie den Paginierungscode mit einem anderen HTML-Tag umbrechen möchten, können Sie dies mit den Optionen full_tag_open
und full_tag_close
tun.
1 |
$config['full_tag_open'] = '<div class="pagination">'; |
2 |
$config['full_tag_close'] = '</div>'; |
Es könnte wirklich nützlich sein, wenn Sie ein benutzerdefiniertes Styling auf die Paginierungslinks anwenden möchten.
Erste, Letzte, Nächste und Vorherige
Wenn Sie den Text ändern möchten, der für den ersten, letzten, nächsten und vorherigen Link angezeigt wird, können Sie das auch tun.
1 |
$config['first_link'] = 'First Page'; |
2 |
$config['last_link'] = 'Last Page'; |
3 |
$config['next_link'] = 'Next Page'; |
4 |
$config['prev_link'] = 'Prev Page'; |
Wenn Sie diese einzelnen Links in ein beliebiges HTML-Tag einfügen möchten, können Sie dies genauso tun, wie wir es getan haben, um den gesamten Paging-Code zu umbrechen.
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>'; |
Aktiver Link und Nummernlink
Manchmal möchten Sie die aktive Verknüpfung anders formatieren. Sie können dies tun, indem Sie Wrapper-Tags wie unten gezeigt anwenden.
1 |
$config['cur_tag_open'] = '<span class="curlink">'; |
2 |
$config['cur_tag_close'] = '</span>'; |
Auf die gleiche Weise, wenn Sie digitale Links mit etwas umhüllen wollen:
1 |
$config['num_tag_open'] = '<span class="numlink">'; |
2 |
$config['num_tag_close'] = '</span>'; |
Und damit endet die Geschichte der Anpassung. In der Tat könnten Sie fortfahren und sich das Anpassungsbeispiel unter http:://your-code-igniter-site/paging/custom ansehen, das bereits in unserer Controller-Datei enthalten ist!
Paging-Konfiguration
Jetzt wissen Sie, welche Konfiguration erforderlich ist, um bei jeder Modellauflistung eine anständige Seitennummerierung einzurichten. Und die meiste Zeit möchten Sie es auf der gesamten Website gleich behalten. Was wirst du tun, um das zu erreichen? Sie könnten versucht sein, den Konfigurationscode zu kopieren und in jede Aktion einzufügen, für die die Paginierungskonfiguration erforderlich ist.
In der Tat gibt es eine bessere Möglichkeit, mit diesem Szenario umzugehen. Sie können eine Paging-Konfigurationsdatei unter application/config/pagination.php
erstellen und die Variable $config
verwenden, um Ihre Einstellungen zu definieren.
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>'; |
Auf dieser Grundlage sollte die überarbeitete index
-Aktionsmethode wie folgt aussehen:
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 |
}
|
Natürlich ändern sich die Variablen total_rows
und base_url
von Aktion zu Aktion, daher müssen Sie sie explizit in jeder Aktion festlegen.
Um dies zu erreichen, müssen Sie zuerst die Paginierungskonfiguration laden.
1 |
$this->config->load('pagination', TRUE); |
2 |
$settings = $this->config->item('pagination'); |
Als Nächstes können Sie die aktionsspezifischen Einstellungen überschreiben.
1 |
$settings['total_rows'] = $this->Users->get_total(); |
2 |
$settings['base_url'] = base_url() . 'paging/config'; |
Und du bist damit fertig!
Das war also die Geschichte der Paginierungskonfiguration, und damit endet auch dieser Artikel!
Fazit
Heute haben wir die Code-Bibliothek in CodeIgniter durchsucht.
Im ersten Teil dieses Artikels habe ich gezeigt, wie Sie die Paginierungsbibliothek verwenden können, indem Sie ein sehr einfaches, aber nützliches Beispiel bereitstellen.
Danach haben wir die Anpassungsoptionen besprochen, die Ihnen zur Verfügung stehen, während Sie die Seitennummerierung einrichten.
Schließlich haben wir im letzten Abschnitt die Paginierungskonfiguration besprochen.
CodeIgniter ist eine leistungsstarke PHP-Plattform. Egal, ob Sie gerade erst anfangen oder mit der nächsten Version beginnen, vergessen Sie nicht, zu überprüfen, was wir für Sie verfügbar haben.
Ich würde gerne Ihr Feedback in Form von Anfragen und Kommentaren mit dem unten stehenden Feed wissen!