Phân trang trong Codeigniter với ví dụ từng bước

Cơ sở dữ liệu là những thực thể sống. Chúng phát triển theo thời gian. Khi thiết kế ứng dụng, chúng ta cần cân nhắc đến nhiều bản ghi mà người dùng sẽ phải duyệt qua. Phân trang cho phép chúng ta chia nhỏ kết quả thành các phần nhỏ dễ quản lý. Hình ảnh sau đây cho thấy một ví dụ về phân trang trên tìm kiếm của Google.

Phân trang trong Codeigniter

Trong hướng dẫn này, bạn sẽ tìm hiểu cách phân trang kết quả cơ sở dữ liệu trong CodeIgniter bằng thư viện phân trang. Hướng dẫn này giả định rằng bạn đã quen với những kiến ​​thức cơ bản về CodeIgniter Active Record. Nếu không, bạn có thể đọc các hướng dẫn trước đó. Giả định khác được đưa ra là bạn đã tải xuống CodeIgniter.

Cấu hình cơ sở dữ liệu

Chúng ta sẽ bắt đầu với việc tạo cơ sở dữ liệu và chèn một số bản ghi giả vào đó. Nó sẽ là một cơ sở dữ liệu bảng đơn với 50 bản ghi trên đó.

Chạy tập lệnh sau đây với MySQL để tạo bảng tác giả cơ sở dữ liệu. Chèn 50 bản ghi giả.

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');

Bây giờ chúng ta đã tạo cơ sở dữ liệu thành công và chèn các bản ghi giả vào đó, hãy cấu hình ứng dụng CodeIgniter của chúng ta để giao tiếp với cơ sở dữ liệu.

Mở ứng dụng/config/database.php

Đặt các tham số kết nối cơ sở dữ liệu tương tự như sau

$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
);

ĐÂY,

  • 'hostname' => 'localhost', đặt tên máy chủ của cơ sở dữ liệu
  • 'username' => 'root', chỉ định tên cơ sở dữ liệu
  • 'password' => 'openseseme', đặt mật khẩu cơ sở dữ liệu
  • 'database' => 'ci_pagination', chỉ định tên cơ sở dữ liệu.

Chúng tôi cũng sẽ tự động tải thư viện cơ sở dữ liệu khi ứng dụng của chúng tôi khởi động. Hãy làm điều đó. Mở ứng dụng/config/autoload.php

Tải thư viện cơ sở dữ liệu như được hiển thị bằng mã bên dưới

$autoload['libraries'] = array('database');

Thế là xong phần cấu hình cơ sở dữ liệu.

Bây giờ chúng ta hãy làm việc trên mô hình cơ sở dữ liệu để phân trang

Mô hình cơ sở dữ liệu phân trang CodeIgniter

Tạo một mô hình mới Authors_model trong ứng dụng/mô hình

Thêm mã sau đây

<?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();
    }
}

ĐÂY,

  • protected $table = 'tác giả'; xác định một biến được bảo vệ xác định tên bảng cơ sở dữ liệu cho mô hình
  • public function __construct() {…} gọi phương thức khởi tạo gốc
  • public function get_count() {…} trả về tổng số bản ghi trong bảng cơ sở dữ liệu. Đây là một nhu cầu cho mục đích phân trang
  • public function get_authors($limit, $start) {…} xác định một phương thức sẽ được sử dụng để truy xuất các kết quả được phân trang từ cơ sở dữ liệu. Chúng ta sẽ vượt qua giới hạn và điểm bắt đầu. Giới hạn xác định tổng số bản ghi được trả về trong khi phần bắt đầu xác định số lượng bản ghi cần bỏ qua

đó là mô hình cơ sở dữ liệu của chúng tôi. Bây giờ hãy tạo các tuyến đường sẽ phản hồi các kết quả được phân trang của chúng tôi.

Lộ trình phân trang CodeIgniter

Mở tệp tuyến đường trong application/config/routes.php

Thêm tuyến đường sau

$route['authors/(:num)'] = 'authors';

ĐÂY,

  • Chúng tôi định nghĩa một tác giả tuyến đường chấp nhận tham số tùy chọn của số. Tham số tùy chọn được định nghĩa bằng cách sử dụng dấu ngoặc mở và đóng. Tuyến đường được định nghĩa gọi phương thức chỉ mục trong bộ điều khiển Authors.

Bây giờ chúng ta hãy chuyển sang bộ điều khiển để có kết quả được phân trang

Bộ điều khiển phân trang CodeIgniter

Tạo một tệp mới Authors.php trong thư mục ứng dụng/bộ điều khiển

Thêm mã sau đây

<?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);
    }
}

ĐÂY,

  • lớp Tác giả mở rộng CI_Controller {…} chúng ta định nghĩa một lớp Tác giả mở rộng lớp CI_Controller
  • public function __construct() {…} phương thức này khởi tạo hàm tạo gốc và tải trình trợ giúp url, mô hình tác giả và thư viện phân trang.
  • public function index() {…} xác định phương thức phản hồi các tác giả tuyến đường của chúng tôi
    • $config[“base_url”] = base_url() . “tác giả”; đặt URL phân trang sẽ được sử dụng để tạo liên kết phân trang
    • $config[“total_rows”] = $this->authors_model->get_count(); đặt tổng số hàng cần được phân trang. Giá trị được lấy từ mô hình tác giả bằng cách gọi phương thức get_count.
    • $config[“per_page”] = 10; xác định các hàng cần được hiển thị trên mỗi trang
    • $config[“uri_segment”] = 2; chỉ định phân đoạn URL chứa giá trị sẽ được sử dụng để bỏ qua bản ghi
    • $this->pagination->initialize($config); khởi tạo thư viện phân trang bằng cách sử dụng giá trị mảng cấu hình mà chúng tôi đã xác định và gán các giá trị trên.
    • $page = ($this->uri->segment(2)) ? $this->uri->segment(2) : 0; kiểm tra xem số bỏ qua đã được đặt trong phân đoạn thứ hai của URI chưa và nếu nó chưa được đặt thì giá trị 0 sẽ được gán cho biến $page
    • $data[“links”] = $this->pagination->create_links(); tạo các liên kết phân trang và gán chúng cho khóa liên kết của biến mảng $data.
    • data['authors'] = $this->authors_model->get_authors($config[“per_page”], $page); lấy ra các bản ghi tác giả được phân trang và gán chúng cho khóa tác giả của biến mảng $data
    • $this->load->view('tác giả/chỉ mục', $data); tải chế độ xem chỉ mục trong thư mục tác giả và chuyển vào biến mảng $data.

Đó là nó cho mô hình của chúng tôi. Bây giờ hãy tạo chế độ xem sẽ hiển thị kết quả cơ sở dữ liệu của chúng tôi.

Tạo một thư mục mới tác giả trong ứng dụng/lượt xem

Tạo một tệp mới index.php trong ứng dụng/lượt xem/tác giả/index.php

Thêm mã sau đây

<!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>

ĐÂY,

  • lặp qua các kết quả của biến $authors và in kết quả vào bảng
  • in các liên kết phân trang ở cuối bảng của chúng tôi.

Bây giờ hãy bắt đầu ứng dụng của chúng tôi và xem kết quả

Trong hướng dẫn này, chúng tôi đang sử dụng máy chủ web PHP tích hợp, nhưng bạn có thể sử dụng bất kỳ máy chủ web nào hỗ trợ PHP.

Mở thiết bị đầu cuối

Chạy lệnh sau

cd C:\Sites\ci-app
php -S localhost:3000

ĐÂY,

  • Lệnh trên duyệt đến thư mục mã ứng dụng và khởi động máy chủ tích hợp trên cổng 3000.

Lưu ý: đường dẫn ứng dụng phải khớp với đường dẫn bạn đã tải xuống CodeIgniter. Để làm được điều đó, bạn có thể sử dụng bất kỳ số cổng nào miễn phí trên máy tính của mình. Không cần thiết phải sử dụng cổng 3000.

Mở trình duyệt web và tải URL sau

http://localhost:3000/authors

Bạn sẽ có thể nhận được kết quả tương tự như sau

Bộ điều khiển phân trang CodeIgniter

Tổng kết

Trong hướng dẫn này, chúng tôi đã trình bày các khái niệm cơ bản về phân trang và tận dụng thư viện phân trang trong CodeIgniter và sử dụng nó để tạo một ứng dụng phân trang kết quả cơ sở dữ liệu.