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

时间:2013-07-25 08:23:15

标签: php zend-framework2 zend-paginator

我使用Zend \ Paginator构建分页结果集。这样做很好,但是,在添加搜索表单后,我无法让两者很好地一起玩。

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

user/index/?searchTerm=hello

如何修改Zend paginator配置,以便在生成的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作为third parameter to url() would retain the query params传递。)

1 个答案:

答案 0 :(得分:2)

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

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

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

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