如何对搜索结果进行分页?

时间:2011-03-30 17:32:10

标签: zend-framework zend-paginator

我想使用Zend_Paginator对搜索结果进行分页。所以我将数据传递给paginator实例:

$paginator = new Zend_Paginator ( 
           new Zend_Paginator_Adapter_DbSelect ( $data ) 
);

以这种方式返回数据

public function getData($idArray){
        $db = Zend_Db_Table::getDefaultAdapter();
        $selectProgramme = new Zend_Db_Select($db);

        $selectProgramme->from('programme')
                            ->order('id DESC')
                            ->where('id IN(?)', $idArray);

        return $selectProgramme;        
}

$idArray由我的搜索实现提供。这一切都很好,我得到正确的数据和分页链接显示。

但是我无法对结果进行分页,因为分页链接无效。所以正常的分页会有以下链接:

mysite.de/home/index/page/1

在搜索中我现在有

mysite.de/home/search/page/1

这不起作用。有关如何实现搜索分页的任何建议吗?

编辑:我有一个HomeController,有两个操作,索引和搜索操作。 IndexAction显示所有数据,我可以对其进行分页。

public function indexAction(){
    //...
    $paginator = new Zend_Paginator(
                 new Zend_Paginator_Adapter_DbSelect($data)
    );
    $paginator->setItemCountPerPage(16)
              ->setPageRange(20)
              ->setCurrentPageNumber($this->_getParam('page', 1));

    $this->view->data = $paginator;
}

searchActions处理搜索过程:

public function searchAction(){
    $response = $solr->search($this->getRequest()->getParam('search', null));
    //...if items found get the data exactly the same way as in the 
    // index action, using Zend_Paginator_Adapter_DbSelect
    $paginator = new Zend_Paginator(
                 new Zend_Paginator_Adapter_DbSelect($data)
    );
    $paginator->setItemCountPerPage(16)
              ->setPageRange(20)
              ->setCurrentPageNumber($this->_getParam('page', 1));

    $this->view->data = $paginator;
}

因此,就像您在搜索操作中看到的那样,当我进行分页时,搜索过程存在问题。我需要以某种方式决定是否搜索或分页。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

由于搜索需要搜索参数分页将失败,因为在对搜索参数进行分页时为空。

$sreq = $this->getRequest()->getParam('search', null);

因此,每当我们对搜索进行分页时,都需要传递此参数。我使用Zend_Session解决了这个问题:

//get search param
$sreq = $this->getRequest()->getParam('search', null);
//store search param in session for pagination
$search = new Zend_Session_Namespace('PSearch');

if($sreq != null){
    $search->psearch = $sreq;
}else{
   $sreq = $search->psearch;
}

我在searchAction的顶部有这个,一切正常。

答案 1 :(得分:1)

我不确定是否理解,但问题是来自网址的网页参数不是通往Paginator的方式 - 例如无论你在哪个页面,它总是显示前20个结果?

如果是这样,您是否尝试在分页器上手动设置页面:

$page = $this->_getParam('page', 1);
$paginator->setCurrentPageNumber($page);

答案 2 :(得分:1)

public function search()

你确定你没有在这里输入错误吗?应该是

public function searchAction()

答案 3 :(得分:0)

您将搜索数据放入$response,但使用$data创建了分页器实例(为空)