2012-09-10 19 views
8

Tôi đã đọc rằng Pagerfanta là plugin pagination được lựa chọn cho Symfony2, nhưng tôi đang gặp một số vấn đề khiến nó hoạt động chính xác. Tôi đã tải xuống mã cho pagerfanta và PagerfantaBundle và cài đặt chúng như được mô tả trong các WhiteOctober Github readme file và trong this tutorial. Tôi khá chắc chắn các mã trong bộ điều khiển của tôi là okay, nhưng có cái gì đó sai trái với tập tin mẫu của tôi.Cách chính xác để sử dụng Pagerfanta cho pagination trong Symfony2

mã điều khiển của tôi:

public function indexAction($page = null) 
{ 
    ... 
    $query = $em->createQuery('SELECT something FROM some_table'); 
    $adapter = new DoctrineORMAdapter($query); 
    $pager = new Pagerfanta($adapter); 
    $pager->setMaxPerPage(10); 
    if (!$page) $page = 1; 
    try { 
     $pager->setCurrentPage($page); 
    } 
    catch(NotValidCurrentPageException $e) { 
     throw new NotFoundHttpException('Illegal page'); 
    } 
    return $this->render('MyBundle:MyEntity:index.html.twig', array(
     'pager' => $pager, 
    )); 
} 

Trong mẫu của tôi:

... 
<table> 
    {% for object in pager.currentPageResults %} 
    <tr> 
     <td>{{ object.attribute1 }}</td> 
     <td>{{ object.attribute2 }}</td> 
     <td>{{ object.attribute3 }}</td> 
    </tr> 
    {% endfor %} 
</table> 

{% if pager.haveToPaginate %} 
    {{ pagerfanta(pager) }} 
{% endif %} 

Khi tôi đi đến trang web, tôi nhận được một danh sách 10 đối tượng đầu tiên. Tuy nhiên, kết xuất của máy nhắn tin chỉ là PreviousNext dưới dạng một từ (không liên kết và không có trang 1, 2, 3, v.v.).

Nếu tôi thêm ?page=2 vào URL, nó sẽ không hiển thị 10 mục tiếp theo trong danh sách.

tôi không thay đổi tuyến đường từ những gì đang là trước khi tôi thêm mã pagination vì tài liệu nói:

Các tuyến đường được tạo ra tự động cho các tuyến đường hiện tại bằng cách sử dụng biến "trang" để truyền bá số trang.

... nhưng tôi tự hỏi nếu định tuyến không chính xác là một phần của sự cố. Giả sử đây là trường hợp, tôi không chắc chắn làm thế nào để tiến hành với điều này.

Tôi không thể tìm thấy bất kỳ hướng dẫn nào khác mà tôi đã liên kết ở trên, vì vậy sẽ rất tuyệt nếu ai đó đã triển khai thành công điều này có thể chia sẻ chi tiết về cách họ đã làm.

+0

Liệu bạn tuyến đường mẫu bao gồm một thuộc tính trang? tức là '/ articles/{page}' – AdrienBrault

+0

Cập nhật: Có vẻ như có vấn đề với bộ điều khiển. Cụ thể, DocrtineORMAdapter không hoạt động đúng (ví dụ '$ pagerfanta-> getNbResults()' trả về 0 - do đó không có trang nào giữa Prevous và Next). Tài liệu nói rằng tham số được truyền cho hàm tạo có thể là Query hoặc QueryBuilder, nhưng tôi nghi ngờ chỉ có tham số sau là đúng. Khi tôi thay đổi thành '$ pagerfanta = new Pagerfanta (new ArrayAdapter ($ query-> getResult())' nó trả về số kết quả chính xác. @AdrienBrault - Tôi đã thực hiện thay đổi bạn đã đề xuất cho mẫu tuyến đường và bây giờ nó hoạt động, nhưng –

+0

Vì vậy, tôi vẫn còn lại với những câu hỏi về lý do tại sao?page = không được tự động thêm vào route theo tài liệu và tại sao css không được áp dụng (bây giờ paginator trông giống như Before123Next, không có khoảng trống hoặc định dạng) –

Trả lời

6

Tôi nghĩ ứng dụng của bạn không biết cách phân tích cú pháp ?page=2 thành hành động của bộ điều khiển.

Bao gồm {page} trong tuyến đường của bạn (như @AdrienBrault đã trả lời), mà bạn muốn có phân trang.

như thế này:

my_index: 
    pattern: /{page} 
    defaults: { _controller: MyTestBundle:Object:index, page: 1 } 
    requirements: 
    _method: GET 
    page: \d+ 

PagerFantaBundle sẽ (tôi đoán) cố gắng đoán con đường đúng.

Làm việc cho tôi.

+0

Công việc này, nhưng thực tế điều này có thể được thực hiện với các tham số truy vấn OP hỏi. Chỉ cần thêm 'Request $ request' vào action và nhận' $ page' từ phương thức '$ request-> get ('page', 1)' – xPheRe

+0

Yêu cầu 'get' đi qua tất cả các tham số (truy vấn, thuộc tính và yêu cầu). Bạn nên tránh nó khi bạn biết thông số xuất phát từ đâu: trong trường hợp này bạn cần sử dụng '$ request-> query-> get ('page', 1)'. –

1

tôi đã phải sử dụng 'currenPage' thay fo 'trang' trong định tuyến của tôi và tôi tìm thấy một cách để làm điều này:

{{ pagerfanta(pager, 'my_pager_view', {'pageParameter':'[currentPage]'}) }}

Các vấn đề liên quan