cakePHP paginate с пост-данными без сеансов, сериализация или сообщение для получения

Я создал небольшую поисковую форму и форму формы фильтра в контроллере / индексе, который присваивает ей условия и поля для разбивки на страницы ($ this-> paginate ($ conditions))

Однако это хорошо для первой страницы, на последующих страницах условия фильтрации исчезают. pagination passArgs хорошо поддерживает переменные.

Есть ли сложный способ передать условия сообщения другим страницам с разбивкой на страницы?

Метод, который я рассмотрел, – это передать условия $ session в сеансе, который не имеет сложности при назначении сеанса и отменяет сеанс при отправке формы еще раз (больше уточнений для критериев фильтра пользователем). Другой метод передает условия $ as serialized string url_encode как параметр get.

Есть ли хороший торт, чтобы сделать это больше, как passArgs, сеансы и кодировка url не похожи на стиль торта.

благодаря

Есть ли сложный способ передать условия сообщения другим страницам с разбивкой на страницы?

Неа.

Есть ли хороший торт, чтобы сделать это больше, как passArgs, сеансы и кодировка url не похожи на стиль торта.

Есть только один способ, неважно, торт или не торт.

  1. Поиск должен выполняться с использованием метода GET.

  2. Параметры передаются через QUERY STRING.

Итак, создайте форму поиска с помощью метода = «GET», а затем используйте http_build_query () для сборки строки запроса и используйте ее для создания ссылок на другие страницы.

Будучи немного любопытным, вы можете увидеть пример прямо здесь, на SO:

http://stackoverflow.com/questions/tagged?tagnames=php&page=5&sort=newest&pagesize=50 

Вы можете использовать passArgs.

в контроллере метода:

 if ( empty($this->passedArgs['search']) ){ $this->passedArgs['search'] = $this->data['YourModel']['search']; } if ( empty($this->data) ){ $this->data['YourModel']['search'] = $this->passedArgs['search']; } 

на ваш взгляд:

 $this->Paginator->options(array('url' => $this->passedArgs)); 

Если бы это был я, я бы побежал с твоей идеей сохранить материал в сессии. Затем я добавлю размер страницы в сеанс, чтобы хранить каждую страницу, что позволяет пользователям легко и быстро перемещаться.

 $this->Session->write('Search.page.1.params',$params); $this->Session->write('Search.page.2.params',$params2); 

Чтобы сделать это с помощью Cake, вы, вероятно, захотите написать свой собственный помощник Pagination или плагин. Что вы могли бы использовать в своих контроллерах более эффективно

 $this->MyPages->paginate('MyModel'); 

Я полагаю, эта функциональность также даст вам возможность разрешить пользователям «Сохранить мой поиск», если они этого захотят, поскольку вы можете сбросить параметры сеанса в модель SavedSearch или аналогичную.

Не забудьте еще $this->Session->destroy() перед тем, как начать новый поиск!

Вы также можете использовать шаблон шаблона Post / Redirect / Get для решения этой проблемы, позволяя пользователям добавлять URL-адреса поисковых запросов (без истечения срока их действия в сеансе) и сохранять дружественные URL-адреса. Например:

 function index($searchTerms = null) { // post/redirect/get if (isset($this->data['SearchForm'])) { $this->redirect(array($this->data['SearchForm']['search_terms'])); } // your normal code here. } 

Данные POST-данных поисковой формы в /controller/action но пользователь перенаправляется, а вместо этого GETs /controller/action/search+terms где термины передаются в действие в качестве параметра (т. $searchTerms ).

Если вы просто измените метод /controller/action?data[SearchForm][search_terms]=search+terms формы в GET, вы увидите что-то вроде: /controller/action?data[SearchForm][search_terms]=search+terms

Спасибо Deizel за образец POST / REDIRECT / GET.

Я применил метод GET для публикации данных. Для разбивки на страницы использовалось это
$urlparams = $this->params['url'];unset($urlparams['url']); $paginator->options(array('url' => array('?' => http_build_query($urlparams))));

У нас были несколько флажков и соглашение об именах, где:
foreach ($checkboxes as $chbox ) {

 // used variable variables to generate the data grid table based on selected fields ${'_field'.$chbox} = (isset($this->params['url']['displayfields'][$chbox])?$this->params['url']['displayfields'][$chbox]:1); $options = array('label'=>$chbox,'type'=>'checkbox','value'=> ${'_field'.$chbox}); if ( ${'_field'.$chbox} ) $options['checked'] = 'checked'; echo $form->input('Filter.displayfields['.$chbox.']',$options); 

В методе post соглашение об именах для флажков будет иметь имя Filter.displayfields.checkbox

Это помогает получить массив в $ this-> data или $ this-> params ['url']

Должен существовать постоянный плагин / компонент для разбивки на страницы для cakePHP, чтобы жизнь стала намного проще и интереснее разрабатывать с помощью cakePHP.

Спасибо всем.