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

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

Это хорошо для первой страницы, однако на последующих страницах, условия фильтра потеряны. Разбиение на страницы passedArgs поддержки ПОЛУЧАЮТ переменные хорошо.

Существуют ли несложные способы передать условия POST другим нумеровавшим страницы страницам?

Метод, на который я посмотрел, должен передать $conditions через сессию, которая не является без сложности присвоения сессии и сбрасывания сессии при представлении формы снова (больше улучшений к критериям фильтра пользователем). Другой метод передает $conditions как сериализированная строка с url_encode как ПОЛУЧИТЬ параметр.

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

Спасибо

5
задан icc97 29 May 2018 в 07:09
поделиться

4 ответа

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

Нет.

Есть ли хороший торт способ сделать это. больше похоже на passArgs, sessions и url encode не похожи на стиль cake.

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

  1. Поиск должен осуществляться методом GET.

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

Итак, сделайте форму поиска с method="GET", а затем используйте http_build_query(), чтобы собрать строку запроса и использовать ее для создания ссылок на другие страницы.

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

http://stackoverflow.com/questions/tagged?tagnames=php&page=5&sort=newest&pagesize=50
3
ответ дан 14 December 2019 в 01:02
поделиться

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

$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() перед началом нового поиска!

1
ответ дан 14 December 2019 в 01:02
поделиться

Для решения этой проблемы можно также использовать паттерн проектирования 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.
}

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

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

1
ответ дан 14 December 2019 в 01:02
поделиться

Спасибо Deizel за шаблон POST / REDIRECT / GET.

Я реализовал метод публикации данных GET. Для разбивки на страницы использовал это
$ urlparams = $ this-> params ['url']; не задано ($ 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 name

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

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


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

1
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: