2013-07-25 24 views
6

Tôi đang sử dụng Zend \ Paginator để tạo tập hợp kết quả được phân trang. Điều này hoạt động tốt, tuy nhiên, sau khi thêm một hình thức tìm kiếm, tôi không thể có được hai để chơi độc đáo với nhau.Làm cách nào để giữ lại thông số truy vấn trong URL phân trang trong ZF2?

URL được tạo ra bởi các hình thức tìm kiếm trên trang này là:

user/index/?searchTerm=hello 

Làm thế nào để sửa đổi cấu hình paginator Zend để nó giữ lại searchterm trong URL sản xuất?

Tôi đã hy vọng cho một cái gì đó như:

user/index/page/4/?searchTerm=hello 

tôi đang thiếu gì?


Tuyến mô-đun cấu hình được định nghĩa như sau:

'user' => array(
    'type' => 'Zend\Mvc\Router\Http\Segment', 
    'options' => array(
     'route' => '/user[/[:action[/]]][[id/:id]][/[page/:page]]', 
     'defaults' => array(
      'controller' => 'Application\Controller\User', 
      'action'  => 'index', 
      'id'   => null, 
     ), 

     // the below was added to try and get the searchTerm query to be retained 
     'may_terminate' => true, 
     'child_routes' => array(
      'searchTerm' => array(
       'type' => 'Query', 
      ), 
     ), 
    ), 
), 

Các pagination được xây dựng sử dụng này trong giao diện:

echo $this->paginationControl(
     $this->users, 'sliding', array('paginator', 'User'), array('route' => 'user', 'action' => 'index') 
    ); 

Pagination mẫu đoạn:

<li> 
     <a href="<?php echo $this->url($this->route, array('action' => $this->action, 'page' => $this->next), true); ?>"> 
      Next &raquo; 
     </a> 
    </li> 

(Tôi đã ở dưới ấn tượng mà đi qua truethird parameter to url() would retain the query params.)

Trả lời

2

Bây giờ tôi thấy thông số thứ ba đó là url() đang làm gì. Tôi có thể đơn giản hóa các liên kết pagination và loại bỏ các 'hành động' chủ chốt như sau:

<a href="<?php echo $this->url($this->route, array('page' => $this->next), true); ?>"> 

hành động của trang được kết hợp như một phần của URL (do đó param thứ ba là true) đó là lý do mà làm việc. Cùng một mã thông báo, tôi có thể thay đổi tuyến đường này:

'route' => '/user[/[:action[/]]][[id/:id]][/[page/:page]][/[search/:search]]', 

Sau đó, search sẽ được giữ lại trong liên kết pagination.

Nếu tôi sửa đổi biểu mẫu tìm kiếm để gửi qua JavaScript, tôi có thể tạo URL tìm kiếm và hướng người dùng đến đó.

Simple jQuery ví dụ cho cách tiếp cận rằng:

$(".search-form").submit(function() { 
    var baseUrl = $(this).attr('action'), 
     search = $(this).find('.search').val(); 

    window.location = baseUrl + '/search/' + search; 

    return false; 
}); 

Một lựa chọn khác sẽ được chuyển hướng đến con đường current/route/search/term trong bộ điều khiển nếu nó nhận được một truy vấn searchterm.

Tôi đăng câu trả lời này như một câu trả lời nhưng tôi mở ra các giải pháp tốt hơn.