PHP Online

Zend Framework

Zend Framework: Sử dụng lớp Zend_Paginator để phân trang

Tiếp theo trong loạt bài tìm hiểu về thư viện Zend Framework. Trong bài này, chúng ta sẽ cùng tìm hiểu về lớp zend_Paginator và sử dụng nó kết hợp với các thao tác trên cơ sở dữ liệu để thực hiện các thao tác phân trang cho ứng dụng như thế nào ?

Phân trang là kỹ thuật có lẽ đã không còn xa lạ gì với những ai đã và đang viết web. Việc phân trang sẽ giúp cho ứng dụng của bạn thao tác nhanh hơn và gọn hơn mỗi khi đổ dữ liệu ra bên ngoài, vì thế có thể xem nó là một lớp quan trọng trong mọi ứng dụng hiện nay.

Trước hết ta thực hiện việc khởi tạo và khai báo thông tin kết nối cơ sở dữ liệu.
Kế đến ta khai báo kết nối trong file application.ini
Tại thư mục models ta tạo file user.php với nội dung bên dưới để thực hiện việc hiển thị thông tin ra bên ngoài. (Xem lại bài tương tác với cơ sở dữ liệu với Zend_Db_Table)
Tiếp tục tại thư mục controllers ta tạo file tên UserController.php với nội dung:
Tại controller này ta thực hiện việc cấu hình phân trang như sau:
+ Trước tiên ta nạp model user vào để gọi phương thức listall().
+ Tiếp tục ta khởi tạo lớp Zend_Paginatior và truyền tham số lấy được từ model qua. Tham số này là một cái mảng liệt kê toàn bộ thành viên có trong bảng.
+ Kế tới ta cấu hình số lượng dữ liệu hiển thị trên trang. Cụ thể trong bài ta đang quy ước là 3 dòng dữ liệu trên 1 trang.
+ Ta cấu hình hiển thị 1 lần chỉ 3 trang.
+ Lấy trang hiện hành và mặc định sẽ là trang một.
+ Đưa tham số trang hiện hành vào phương thức setCurrentPageNumber()
+ Cuối cùng, ta đổ dữ liệu ra view.

Tiếp tục ta tạo view index.phtml tại thư mục: views/script/user/
Công việc của file view này là nhận dữ liệu từ controller và thực hiện việc lặp đỗ dữ liệu ra bên ngoài bằng lệnh foreach().
Ở phần cuối ta có thêm đoạn lệnh sau:
Đây là phần ta nạp 1 file phtml với mục đích hiển thị các liên kết tới, lùi, số trang của ứng dụng.
Tại views/scripts/user tạo file pagination.phtml như cấu hình ở trên với nội dung:
Sau khi hoàn tất, chạy ứng dụng ta sẽ thấy kết quả hiển thị như bên dưới.
Kết quả zend paginator
Về mặt cơ bản thì Zend_Paginator làm công việc đưa tất cả record của câu truy vấn vào trong 1 mảng dữ liệu. Sau đó nó phân trang trực tiếp từ dữ liệu trong mảng này. Điều này trên thực tế thì chỉ có thể đáp ứng được với mô hình dữ liệu nhỏ, vì nếu dùng với hàng trăm ngàn dòng dữ liệu thì có lẽ việc đem chúng đổ vào mảng thôi cũng là điều không đơn giản.

Nhóm phát triển Zend Framework cũng hiểu những khó khăn từ phía người sử dụng về điều này, nên các phiên bản sau này của zend đã hỗ trợ thêm nhiều phương thức nhằm giải quyết bài toán này.

Đó là sử dụng thêm phương thức bên dưới với các tham số truyền vào, trước khi gọi lớp Zend_Paginator.
Để thực hiện nó, trước hết ta thay đổi phương thức listall() trong model User như sau:
Như bạn thấy, phương thức listall() của chúng ta giờ đây không còn là fetchall() nữa rồi. Mà công việc của nó chỉ là thực hiện việc chọn bảng, chọn số lượng cột để hiển thị.

Kế tới tại UserController.php ta sửa lại như sau:
Ta truyền phương thức listall() vào lớp Zend_Paginator_Adapter_DbSelect. Tại đó, tự nó sẽ biết phải lấy dữ liệu như thế nào. Cuối cùng, thay vì ta dù ng Zend_Paginator::factory() thì nay ta khởi tạo hẳn một phương thức và truyền dữ liệu mà ta đã cấu hình ở trên vào.

Chạy ứng dụng, bạn sẽ thấy kết quả giống với lúc ta dùng ở trên.
Vậy liệu chúng có khác gì không ?. Vì dẫu sao cả hai cùng làm công việc hiển thị toàn bộ dữ liệu cơ mà ?.

Giờ bạn hãy mở file index.phtml ra và thêm vào dòng lệnh sau để xem kiến trúc bên trong mảng của data trước khi đổ ra có gì nhé.
Và kết quả thật sự bất ngờ phải không nào, trong mảng dữ liệu của chúng ta hoàn toàn không có dòng nào liên quan đến dữ liệu có trong bảng cả. Vậy Zend_Paginator tự hiểu và tự giới hạn dữ liệu trả về giúp cho chúng ta. Ngay trên manual của Zend Framework cũng nhấn mạnh về điều này khi bạn sử dụng thêm lớp Zend_Paginator_Adapter_DbSelect().
 
Additionally these adapters do not fetch all records from the database in order to count them. Instead, the adapters manipulates the original query to produce the corresponding COUNT query. Paginator then executes that COUNT query to get the number of rows.This does require an extra round-trip to the database, but this is many times faster than fetching an entire result set and using count(). Especially with large collections of data.
 
Phần bôi đen màu đỏ là phần tôi muốn các bạn chú ý khi tham khảo đoạn thông tin trên từ manual của Zend Framework.

Tải toàn bộ mã nguồn của bài học tại đây

Như vậy, qua phần này. Tôi đã hướng dẫn các bạn bước đầu làm quen và tìm hiểu được lớp Zend_Paginator, từ đó sử dụng chúng cho công việc phân trang dữ liệu trong ứng dụng. Tiếp tục ở bài sau, chúng ta sẽ cùng tìm hiểu về lớp Zend_Form, đồng thời dùng nó để xây dựng các biểu mẫu nhập liệu như thế nào.

(Bùi Quốc Huy)
18773
Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé.

Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này

Ý kiến cho bài viết này.