Как разбивать результаты поиска?

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

Это не работает. Любые предложения, как реализовать пагинацию поиска?

EDIT: У меня есть HomeController с двумя действиями, index и search action. 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;
}

Итак, как вы видите в действии поиска, есть проблема с процессом поиска, когда я разбиваю на страницы. Мне нужно как-то решить, искать или разбивать на страницы. Любые предложения по этому поводу?


person Upvote    schedule 30.03.2011    source источник
comment
Опубликуйте весь код действия, потому что я не могу понять, какой результат процесса маршрутизации вы получаете. Вы используете searchAction или indexAction для разбиения на страницы?   -  person Ololo    schedule 30.03.2011
comment
Я обновил свой вопрос, надеюсь, теперь понятно.   -  person Upvote    schedule 31.03.2011


Ответы (4)


Поскольку требуется поиск, разбиение на страницы параметра поиска завершится ошибкой, потому что при разбивке на страницы параметр поиска имеет значение 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;
}

У меня это вверху моего searchAction и все работает.

person Upvote    schedule 31.03.2011

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

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

$page = $this->_getParam('page', 1);
$paginator->setCurrentPageNumber($page);
person robertlbolton    schedule 30.03.2011
comment
Взгляните на мое обновление. Когда я меняю страницу на две, я получаю вторую страницу, как и ожидалось, навигация с использованием ссылок на страницы не работает, потому что мне нужно как-то изменить searchAction - person Upvote; 31.03.2011
comment
Я не могу разбить результаты поиска на страницы, вот и все. Представьте, что я делаю поиск. тогда маршрут выглядит как mysite.net/home/search. но когда я пытаюсь разбить на страницы, он пытается получить доступ к mysite.net/home/search/page/2, и это не удается, потому что он снова запускает поиск, но он не должен... - person Upvote; 31.03.2011

public function search()

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

public function searchAction()
person Ololo    schedule 30.03.2011
comment
Что вернет $solr-›search(null)? Может ли это привести к отсутствию элементов для разбивки на страницы? - person Ololo; 31.03.2011

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

person Tomáš Fejfar    schedule 31.03.2011