6

我正在使用 Zend\Paginator 来构造一个分页结果集。这很好用,但是,在添加搜索表单后,我无法让两者很好地结合在一起。

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

user/index/?searchTerm=hello

如何修改 Zend 分页器配置,使其在生成的 URL 中保留 searchTerm?

我希望有类似的东西:

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

我错过了什么?


模块配置路由定义如下:

'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',
            ),
        ),
    ),
),

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

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

分页模板片段:

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

(我的印象是true作为第三个参数传递到url()将保留查询参数。)

4

1 回答 1

2

我现在看到了第三个参数在url()做什么。我可以简化分页链接并删除“操作”键,如下所示:

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

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

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

然后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;
});

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

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

于 2013-07-25T08:59:54.950 回答