Thứ Ba, 28 tháng 10, 2008

Phân trang tìm kiếm trong cakephp 1.1

Việc phân trang trong cakephp 1.1 đã được tôi đề cập ở bài trước vì vậy tôi sẽ không hướng dẫn chi tiết các bạn cách làm phân trang trong cakephp 1.1 nữa. Các bạn có thể xem lại tại http://i-php.net/2008/10/pagination-phan-trang-trong-cakephp-11x/. Ở bài viết này tôi chỉ đi hướng dẫn cách phân trang khi tìm kiếm mà thôi. (Tất nhiên là dựa vào cách phân trang ở bài viết trước rồi).

Với các PaginationHelper và PaginationComponent ở bài trước chỉ có thể giúp chúng ta phân trang một cách bình thường mà thôi. Nhưng khi chúng ta thêm vào điều kiện tìm kiếm thì chức năng phân trang sẽ chạy sai. Nguyên nhân là do khi chúng ta thực hiện phân trang thì các biến của trang sẽ được truyền qua URL theo phương thức GET. Vì vậy mà các điều kiện lọc ở form sẽ không được truyền vào , và khi khởi tạo lại trang thì nó sẽ chỉ hiểu các điều kiện truyền từ phương thức GET, do vậy phân trang không còn chính xác nữa.

Đề giải quyết vấn đề trên có rất nhiều phương pháp, trong đó có 2 phương pháp mà tôi được biết đó là truyền các điều kiện còn lại lên trên URL theo phương thức GET hoặc là truyền điều kiện lọc theo phương thức POST đồng thời truyền các tham số phân trang lên URL theo phương thức GET. Cách đầu tiên có một nhược điểm rất lớn là do các tham số sẽ được truyền hết lên trên URL do đó URL trông sẽ rất xấu và dài, đồng thời nhược điểm lớn nhất khi truyền tham số trên URL là URL chỉ cho phép dài nhất là 256 ký tự mà thôi, do vậy khi tìm kiếm với khối lượng lớn dữ liệu điều kiện thì phương pháp này sẽ không khả thi. Do vậy tôi chọn phương pháp thứ 2 là truyền dữ liệu lọc theo phương thức POST đồng thời truyền các tham sô phân trang trên URL theo phương thức GET.
Cách thức thực hiện:

Trong phần phân trang ở trước, công việc phân trang sẽ thực hiện thông qua phương thức GET tức là các link sẽ chứa các tham số phân trang.và việc phân trang sẽ dựa hoàn toàn vào các tham số đó.

Giờ đây, khi ấn vào các link đó thay vì kích hoạt các link đó chúng ta sẽ gọi ra một hàm javascript thông qua sự kiện onclick. Chúng ta sẽ submit dữ liệu theo phương thức POST thay vì phương thức GET đồng thời truyền lên  URL các tham số phân trang. Như vậy sau khi submit chúng ta sẽ có cả dữ liệu lấy từ phương thức POST và phương thức GET.
Các bước thực hiện:

- Đầu tiên, chúng ta sẽ thêm sự kiện 'onclick' vào tất cả các link phân trang. Chúng ta mở file '/app/views/helpers/pagination.php', chúng ta tìm đến 'function _generateLink ()', di chuyển đến cuối hàm và thay đổi đoạn source code sau:
return $this->Html->link(
$title,
$url,
NULL,
NULL,
$escapeTitle)

thành
$options['onclick'] = "return paginator_number('form', '{$this->Html->url($url)}')";

return $this->Html->link(
$title,
$url,
$option,
NULL,
$escapeTitle

Ở trên, chúng ta đã gọi ra hàm javascript la 'paginator_number' với 2 tham số truyền và là tên form, mà cụ thể trong trường này tên form là 'form', tham số thứ 2 là url cần link đến và các tham số phân trang (giá trị này sẽ tự sinh ra, chúng ta không cần thay đổi). Điều đáng chú ý ở đây là để chạy được thì các bạn sẽ phải để tên form là 'form', nếu là tên form khác thì chương trình sẽ không chạy.

- Tiếp đến chúng ta sẽ thêm hàm sau:
function paginator_number(element, url )
{
$(element).attr("action",url);
$(element).submit();
return false;
}

Hàm javascript này sẽ được thêm vào layout. Các bạn chú ý các viết hàm javascipt trên là viết thông qua jquery. Nếu các bạn chưa có thì nhơ tải jquery về nhé. Chúc các bạn thành công.

Không có nhận xét nào:

Đăng nhận xét