如何在ZF2中的分页URL中保留查询参数?

bcm*_*cfc 6 php zend-paginator zend-framework2

我正在使用Zend\Paginator来构造分页结果集.这样可以正常工作,但是,在添加搜索表单后,我无法将两者完美地结合在一起.

页面上的搜索表单生成的URL是:

user/index/?searchTerm=hello
Run Code Online (Sandbox Code Playgroud)

如何修改Zend paginator配置,以便在生成的URL中保留searchTerm?

我希望有类似的东西:

user/index/page/4/?searchTerm=hello
Run Code Online (Sandbox Code Playgroud)

我错过了什么?


模块配置路由定义如下:

'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',
            ),
        ),
    ),
),
Run Code Online (Sandbox Code Playgroud)

在视图中使用此构造分页:

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

分页模板片段:

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

(我是路过的印象true作为第三个参数url()将保留查询参数.)

bcm*_*cfc 2

我现在知道第三个参数正在url()做什么。我可以简化分页链接并删除“action”键,如下所示:

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

页面的操作作为 URL 的一部分进行匹配(因为第三个参数为 true),这就是它起作用的原因。出于同样的原因,我可以将路线更改为:

'route' => '/user[/[:action[/]]][[id/:id]][/[page/:page]][/[search/:search]]',
Run Code Online (Sandbox Code Playgroud)

然后search将保留在分页链接中。

如果我修改搜索表单以通过 JavaScript 提交,我可以构建搜索 URL 并将用户引导至该搜索表单。

该方法的简单 jQuery 示例:

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

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

    return false;
});
Run Code Online (Sandbox Code Playgroud)

另一种选择是current/route/search/term如果控制器收到 searchTerm 查询,则重定向到控制器中的路由。

我将此作为答案发布,但我愿意接受更好的解决方案。