Giới Thiệu

Pagination, hay phân trang, là một kỹ thuật quan trọng giúp phân chia dữ liệu lớn thành các trang nhỏ hơn, từ đó cải thiện hiệu suất của ứng dụng và trải nghiệm người dùng. CodeIgniter, một trong những framework PHP phổ biến, cung cấp thư viện pagination tích hợp sẵn để xử lý công việc này. Bài viết này sẽ hướng dẫn bạn cách cấu hình và sử dụng phân trang trong CodeIgniter một cách chi tiết và sâu sắc, đồng thời giới thiệu các phương pháp nâng cao để tối ưu hóa việc phân trang.

1. Cài Đặt Pagination Trong CodeIgniter

Để bắt đầu với phân trang trong CodeIgniter, trước tiên bạn cần đảm bảo rằng thư viện pagination đã được tải và sẵn sàng sử dụng. CodeIgniter đã tích hợp sẵn thư viện này, vì vậy bạn chỉ cần cấu hình và sử dụng nó trong controller của mình.

// Trong Controller (ví dụ: application/controllers/Posts.php)
public function __construct()
{
    parent::__construct();
    // Tải thư viện pagination
    $this->load->library('pagination');
}

2. Cấu Hình Phân Trang

Cấu hình phân trang bao gồm việc thiết lập các tham số như URL cơ bản, tổng số bản ghi, số lượng bản ghi trên mỗi trang, và các tùy chọn khác để điều chỉnh giao diện phân trang. Dưới đây là cách cấu hình phân trang trong phương thức của controller.

// Trong Controller
public function index()
{
    // Tổng số bản ghi
    $total_rows = $this->db->count_all('your_table'); // Thay 'your_table' bằng tên bảng của bạn

    // Cấu hình phân trang
    $config['base_url'] = site_url('posts/index'); // URL cơ bản cho phân trang
    $config['total_rows'] = $total_rows; // Tổng số bản ghi
    $config['per_page'] = 10; // Số lượng bản ghi trên mỗi trang
    $config['uri_segment'] = 3; // Segment trong URL để phân trang (ví dụ: /posts/index/2)

    // Tùy chọn hiển thị phân trang (có thể tùy chỉnh theo nhu cầu)
    $config['full_tag_open'] = '';
    $config['full_tag_close'] = '';
    $config['first_link'] = 'Đầu tiên';
    $config['last_link'] = 'Cuối cùng';
    $config['next_link'] = '>';
    $config['prev_link'] = '<';
    $config['cur_tag_open'] = '';
    $config['cur_tag_close'] = '';
    $config['num_tag_open'] = '';
    $config['num_tag_close'] = '';
    $config['prev_tag_open'] = '';
    $config['prev_tag_close'] = '';
    $config['next_tag_open'] = '';
    $config['next_tag_close'] = '';

    // Khởi tạo cấu hình
    $this->pagination->initialize($config);

    // Lấy dữ liệu cho trang hiện tại
    $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
    $data['results'] = $this->your_model->get_data($config['per_page'], $page);

    // Tạo liên kết phân trang
    $data['links'] = $this->pagination->create_links();

    // Nạp view
    $this->load->view('your_view', $data);
}

3. Tạo Phương Thức Trong Model

Để lấy dữ liệu từ cơ sở dữ liệu và phân trang, bạn cần viết một phương thức trong model của bạn. Phương thức này sẽ nhận số lượng bản ghi trên mỗi trang và chỉ mục bắt đầu của trang hiện tại.

// Trong Model (ví dụ: application/models/Your_model.php)
public function get_data($limit, $start)
{
    $this->db->limit($limit, $start); // Giới hạn số lượng bản ghi và chỉ mục bắt đầu
    $query = $this->db->get('your_table'); // Thay 'your_table' bằng tên bảng của bạn
    return $query->result(); // Trả về kết quả dưới dạng mảng đối tượng
}

4. Hiển Thị Kết Quả Trong View

Trong view, bạn cần hiển thị dữ liệu từ cơ sở dữ liệu và các liên kết phân trang. Đây là ví dụ về cách thực hiện:

 

<!-- Trong View (ví dụ: application/views/your_view.php) -->
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <!-- Các cột khác -->
        </tr>
    </thead>
    <tbody>
        <?php foreach ($results as $result): ?>
        <tr>
            <td><?php echo $result->id; ?></td>
            <td><?php echo $result->name; ?></td>
            <!-- Các cột khác -->
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

<!-- Hiển thị liên kết phân trang -->
<?php echo $links; ?>

5. Các Tính Năng Nâng Cao

Tùy Chỉnh Giao Diện Phân Trang: Bạn có thể tùy chỉnh giao diện của phân trang bằng cách thay đổi các thẻ HTML và CSS trong cấu hình. Dưới đây là ví dụ về cách tùy chỉnh giao diện phân trang:

$config['full_tag_open'] = '<nav><ul class="pagination custom-pagination">';
$config['full_tag_close'] = '</ul></nav>';
$config['first_link'] = '<i class="fas fa-angle-double-left"></i>';
$config['last_link'] = '<i class="fas fa-angle-double-right"></i>';
$config['next_link'] = '<i class="fas fa-angle-right"></i>';
$config['prev_link'] = '<i class="fas fa-angle-left"></i>';
$config['cur_tag_open'] = '<li class="page-item active"><span class="page-link">';
$config['cur_tag_close'] = '</span></li>';
$config['num_tag_open'] = '<li class="page-item">';
$config['num_tag_close'] = '</li>';
$config['prev_tag_open'] = '<li class="page-item">';
$config['prev_tag_close'] = '</li>';
$config['next_tag_open'] = '<li class="page-item">';
$config['next_tag_close'] = '</li>';

Phân Trang Dựa Trên Các Điều Kiện Tìm Kiếm: Bạn có thể kết hợp phân trang với các điều kiện tìm kiếm để lọc dữ liệu.

// Trong Model
public function get_filtered_data($limit, $start, $search = '')
{
    if (!empty($search)) {
        $this->db->like('name', $search); // Thay 'name' bằng cột tìm kiếm
    }
    $this->db->limit($limit, $start);
    $query = $this->db->get('your_table');
    return $query->result();
}
// Trong Controller
public function index()
{
    $search = $this->input->get('search');
    $total_rows = $this->your_model->count_filtered_data($search);

    // Cấu hình phân trang như trước

    $page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
    $data['results'] = $this->your_model->get_filtered_data($config['per_page'], $page, $search);

    // Tạo liên kết phân trang
    $data['links'] = $this->pagination->create_links();

    // Nạp view
    $this->load->view('your_view', $data);
}

Phân Trang với AJAX: Để nâng cao trải nghiệm người dùng, bạn có thể sử dụng AJAX để tải dữ liệu phân trang mà không cần tải lại toàn bộ trang.

// Trong Controller
public function fetch_data()
{
    $page = $this->input->post('page');
    $search = $this->input->post('search');
    $data['results'] = $this->your_model->get_filtered_data($config['per_page'], $page, $search);
    $data['links'] = $this->pagination->create_links();
    $this->load->view('your_view', $data);
}
<!-- HTML cho phân trang -->
<div id="data-container">
    <!-- Dữ liệu sẽ được tải vào đây -->
</div>
<div id="pagination-links">
    <?php echo $links; ?>
</div>

<!-- JavaScript AJAX -->
<script>
$(document).ready(function() {
    function load_data(page, search) {
        $.ajax({
            url: '<?php echo site_url('posts/fetch_data'); ?>',
            method: 'POST',
            data: {page: page, search: search},
            success: function(data) {
                $('#data-container').html(data);
            }
        });
    }

    $(document).on('click', '.pagination a', function(event) {
        event.preventDefault();
        var page = $(this).attr('data-ci-pagination-page');
        var search = $('#search').val();
        load_data(page, search);
    });

    $('#search').on('keyup', function() {
        var search = $(this).val();
        load_data(0, search);
    });
});
</script>

Kết Luận

Phân trang là một yếu tố thiết yếu trong việc cải thiện hiệu suất và trải nghiệm người dùng của các ứng dụng web. CodeIgniter cung cấp một thư viện phân trang dễ sử dụng và linh hoạt, cho phép bạn tùy chỉnh và mở rộng tính năng phân trang theo nhu cầu cụ thể của ứng dụng. Bằng cách cấu hình thư viện, tùy chỉnh giao diện, và áp dụng các kỹ thuật nâng cao như phân trang với AJAX, tìm kiếm nâng cao, và phân trang theo thời gian thực, bạn có thể tối ưu hóa ứng dụng của mình để đáp ứng nhu cầu của người dùng một cách hiệu quả nhất.