July 17, 2013

Zend Framework 2: Paginator with NULL adapter


Tiếp nối theo chuỗi bài viết về ZF2, hôm nay mình giới thiệu mọi người cách phân trang data với Adapter NULL được cung cấp trong Zend. Có lẽ khi mọi người tìm kiếm cách phân trang với ZF2 thì đều có nhiều cách, đa số sẽ dùng TableGateWay, nhưng bài hướng dẫn trước của mình lại dùng PDO để truy xuất database nên cũng sẽ có bạn thắc mắc cách xử lý thế nào. ZF2 cũng hiểu điều này nên cung cấp 1 loại Adapter đặc biệt - Adapter NULL - dùng cho chuyện phân trang với PDO.

Việc này cũng không quá khó khăn, đầu tiên, chúng ta cần khai báo 2 namespace mới trong ZF2 để thực hiện việc phân trang dữ liệu như hình bên dưới.
Sử dụng namespace cho việc phân trang dữ liệu trong ZF2
Ở đây, mọi người để ý sẽ thấy tại dòng được high-light đó là 2 namespace dùng cho việc phân trang trong ZF2, đặc biệt lưu ý ở đây mình dùng Zend\Paginator\Adapter\Null và alias thành PageNull vì nếu không sẽ bị nhầm lẫn thành NULL của PHP. Việc này được thực hiện tại Controller của ứng dụng.

Tiếp theo, chúng ta thực hiện việc xử lý phân trang trong action như bên hình bên dưới.
Xử lý phân trang
Ở đây, có 2 phần riêng biệt. Phần không high-light code tức là một đoạn script nhỏ, lấy Model (phần này dùng tương tác Database để lấy dữ liệu lên), việc này không có gì đặc biệt và cũng không liên quan tới phân trang cho bài viết này.

Phần thứ 2, phần được high-light code, phần này chính là trọng tâm của bài này. Cụ thể như sau
$paginator = new Paginator(new PageNull($importedData['total']));

Tại đây chúng ta khai báo một đối tượng Paginator và tham số truyền vào là PageNull (tức là Zend\Paginator\Adapter\Null khai báo bên trên). Có một lưu ý đó là khi khai báo đối tượng PageNull thì chúng ta cần truyền vào TỔNG SỐ DỮ  LIỆU nhận được từ database. Việc lấy TỒNG SỐ DỮ LIỆU này không quá khó với tất cả chúng ta ở đây, nên mình sẽ không nói về điều này.

Việc xử lý cuối cùng tại Controller - Action đó là truyền dữ liệu phân trang qua cho tầng view như sau:
Truyền dữ liệu ra tầng view
Ở đây, mình tạo đối tượng ViewModel và assign dữ liệu paginator vào đây. Mọi người nhớ return đối tượng này ở cuối action để tầng view nhận được thông tin.

Bây giờ chuyển qua tầng view, chúng ta sẽ dùng 1 view helper của ZF2 để phát sinh ra tầng phân trang như hình bên dưới. Lưu ý, đoạn code bên dưới viết trong tầng view.
Dùng view helper render phân trang
Để hiển thị phân trang, chúng ta dùng view helper paginationControl như hình trên. Trong helper này có 4 tham số như sau:
  1. Đối tượng paginator đã được tạo từ controller và assign sang view
  2. Kiểu paginate (thú thật là có 4 kiểu, nhưng mình chưa tìm thấy sự khác biệt gì cho 4 kiểu này nên chỗ này mình xem mạn phép không đề cập)
  3. Mapping tới file phtml (file view) để render phân trang
  4. Các giá trị cần assign cho Paginator
Và cuối cùng, chúng ta tạo tầng view theo đúng mapping trong tham số thứ 3 bên trên như hình:
Tầng view cho pagination control
Bây giờ bạn hãy thụ hưởng kết quả mà mình làm với phân trang trong ZF2.

Xem thêm các bài viết khác về Zend Framework 2 tại tmquang6805.blogspot.com
Xem cách truy xuất database thông qua PDO với ZF2

1 comment:

  1. anh chỉ em cách dùng tablegateway để phân trang với?

    ReplyDelete