Article:
Phân trang
2037
ngocdaothanh.myopenid.com 149Updated over 2 years ago |

Khi trang web có hàng chục phần tử cùng loại (bài viết v.v.) trở lên, lúc hiển thị cần phân trang (pagination) để người dùng dễ đọc.
Một chút lịch sử: nhân loại chỉ mới biết phân sách thành trang từ khoảng 500 năm nay khi kĩ thuật in ấn trở nên phổ biến. Trước đó, sách được cuộn lại thành trục chứ không đóng thành quyển như hiện nay. Dấu tích lịch sử này hiện có thể tìm thấy trong tiếng Nhật: người Nhật dùng đơn vị 本 dùng để đếm những vật thuôn dài (như chai lọ) để đếm sách.
Phân tích giao diện
Giao diện gồm có bản thân trang và thanh công cụ để chuyển sang trang khác. Xem hình trên và dùng thử chuyển trang trên trang web này, sẽ thấy thanh công cụ có đặc điểm sau:
- Hiện danh sách kết nối các đến các trang
- Luôn hiện liên kết đến trang đầu tiên và cuối cùng
- Các trang trung gian nếu nhiều quá thì hiện dấu 3 chấm
- Liên kết để đi tới trang tiếp theo hoặc trang trước đó có cũng được không có cũng được (như chỗ chuyển trang ở mục lục)
- Số của trang hiện tại cần tô đậm để biết đang ở trang bao nhiêu
- Trường hợp có rất nhiều trang, có thể có cả 2 dấu 3 chấm ở 2 bên số trang hiện tại (số lượng trang từ dấu 3 chấm này đến dấu 3 chấm kia gọi là cửa sổ (window)
Ngoài ra cần xác định thêm:
- Đối với phần tử cùng trang: hiện theo thứ tự mới đến cũ hay cũ đến mới?
- Khi hiện lần đầu, hiện trang đầu tiên hay trang cuối cùng?
Giải pháp kĩ thuật
Thơ duyên của Xuân Diệu có đoạn:
Em bước điềm nhiên không vướng chân,
Anh đi lững đững chẳng theo gần,
Vô tâm nhưng giữa bài thơ dịu
Anh với em như một cặp vần.
Phân tích giao diện dành cho designer, giải pháp kĩ thuật dành cho programer, đôi bên quả là cặp vần
Phân trang là kĩ thuật căn bản của lập trình web, hầu hết trang web đều có tính năng này. Dễ dàng suy ra có nhiều thư viện có sẵn cho phép thực hiện tính năng phân trang. Ruby có vài thư viện nổi tiếng: classic_pagination, will_paginate, pagination_find, merb_paginate.
Câu hỏi thường gặp: Làm sao để phân ngay đến trang cuối cùng nếu khi thư viện chỉ nhận tham số đầu vào là total_entries (tổng số phần tử của tất cả các trang), page (trang hiện tại, bắt đầu từ 1), per_page (số phần tử tối đa trong một trang)?
Trả lời: Mấu chốt là tự tính toán ra được tham số page, page = (total_entries == 0)? 1 : (total_entries - 1)/per_page + 1
Vài gợi ý nếu muốn tự phân trang, không dùng thư viện có sẵn:
- Cần 2 phần, nên viết thành 2 hàm: (1) phần lấy các phần tử từ cơ sở dữ liệu (controller/model) và (2) phần hiển thị trang và thanh công cụ (view)
- Khi lấy phần tử từ cơ sở dữ liệu quan hệ, câu lệnh SQL cần dùng LIMIT để giới hạn số phần tử trong một trang và OFFSET để nhảy đến trang cần thiết
Hoài cổ
Xem phim cổ cổ một chút thi thoảng có thể bắt gặp thi sĩ đọc thơ cả cuộn, rất ấn tượng. Có thể tạo ấn tượng tương tự cho trang web bằng dùng Ajax để cho người dùng kéo xuống dưới mãi mà không phải chuyển trang. Như vậy trang web không cần hiện thanh công cụ xấu xí kia. Tham khảo endless pageless.
149