Как разбить результаты поиска на страницы? - PullRequest
2 голосов
/ 30 марта 2011

Я хочу разбить результаты поиска на страницы, используя 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 ]

2 голосов
/ 31 марта 2011

Поскольку требуется поиск, разбиение на страницы параметра поиска завершится неудачно, поскольку при разбивке на страницы параметр поиска имеет значение null.

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

У меня есть это в верхней части моего поискового действия, и все работает.

1 голос
/ 31 марта 2011
public function search()

Вы уверены, что не ошиблись здесь?Должно быть

public function searchAction()
1 голос
/ 30 марта 2011

Не уверен, что понимаю, но ваша проблема в том, что параметр страницы из URL не попадает в Paginator - например, независимо от того, на какой странице вы находитесь, он всегда показывает первые 20 результатов?

Если это так, пробовали ли вы вручную установить страницу на странице:

$page = $this->_getParam('page', 1);
$paginator->setCurrentPageNumber($page);
0 голосов
/ 31 марта 2011

Вы помещаете свои данные поиска в $response, но создаете экземпляр paginator, используя $data (который является нулевым)

...