Я создал небольшую поисковую форму и форму формы фильтра в контроллере / индексе, который присваивает ей условия и поля для разбивки на страницы ($ this-> paginate ($ conditions))
Однако это хорошо для первой страницы, на последующих страницах условия фильтрации исчезают. pagination passArgs хорошо поддерживает переменные.
Есть ли сложный способ передать условия сообщения другим страницам с разбивкой на страницы?
Метод, который я рассмотрел, – это передать условия $ session в сеансе, который не имеет сложности при назначении сеанса и отменяет сеанс при отправке формы еще раз (больше уточнений для критериев фильтра пользователем). Другой метод передает условия $ as serialized string url_encode как параметр get.
Есть ли хороший торт, чтобы сделать это больше, как passArgs, сеансы и кодировка url не похожи на стиль торта.
благодаря
Есть ли сложный способ передать условия сообщения другим страницам с разбивкой на страницы?
Неа.
Есть ли хороший торт, чтобы сделать это больше, как passArgs, сеансы и кодировка url не похожи на стиль торта.
Есть только один способ, неважно, торт или не торт.
Поиск должен выполняться с использованием метода GET.
Параметры передаются через 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.
Спасибо всем.