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 ?
7 trang |
Chia sẻ: luyenbuizn | Lượt xem: 1326 | Lượt tải: 0
Nội dung tài liệu Zend Framework: Sử dụng lớp Zend_Paginator để phân trang, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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.
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.
Các file đính kèm theo tài liệu này:
- zend_framewor7_7068.pdf