Разметка страницы cakePHP с данными постов без сеансов, сериализации или постов для получения - PullRequest
5 голосов
/ 28 мая 2010

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

Это хорошо для первой страницы, однако на последующих страницах условия фильтра теряются. Пагинация passedArgs хорошо поддерживает переменные GET.

Существуют ли несложные способы передачи условий POST на другие страницы, разбитые на страницы?

Метод, который я рассмотрел, состоит в том, чтобы передать $conditions через сеанс, что не без сложностей с назначением сеанса и отменой сеанса при повторной отправке формы (больше уточнений критериев фильтрации пользователем) , Другой метод передает $conditions как сериализованную строку с url_encode в качестве параметра GET.

Есть ли хороший "торт" способ сделать это больше похоже на passedArgs. Сессии и url_encode не похожи на стиль торта.

Спасибо

Ответы [ 5 ]

3 голосов
/ 24 июня 2011

Вы можете использовать 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));
3 голосов
/ 28 мая 2010

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

Нет.

Есть ли хороший торт способ сделать это больше похоже на 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
1 голос
/ 29 мая 2010

Спасибо 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 ) {</p> <pre><code>// 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 name

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

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


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

1 голос
/ 28 мая 2010

Вы также можете использовать шаблон Post / Redirect / Get design pattern , чтобы решить эту проблему, позволяя пользователям создавать закладки для 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.
}

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

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

1 голос
/ 28 мая 2010

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

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

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

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

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

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

...