cakePHP paginate与发布数据没有会话,序列化或发布获取

时间:2010-05-28 07:07:17

标签: php cakephp forms post pagination

我已经在控制器/索引中创建了一个带有POST操作的小型搜索和过滤器表单,该表单向自己POST了要分页的条件和字段($this->paginate($conditions))。

这对第一页很有用,但是在后续页面中,过滤条件会丢失。分页passedArgs很好地支持GET变量。

是否有一种不复杂的方法将POST条件传递给其他分页页面?

我看过的方法是通过会话传递$conditions,这不是没有分配会话的复杂性,也不是在再次提交表单时取消设置会话(对过滤条件的更多改进)用户)。 另一种方法是将$conditions作为带有url_encode的序列化字符串作为GET参数传递。

是否有更好的'蛋糕'方式来实现这一点passedArgs。会话和url_encode看起来不像蛋糕风格。

谢谢

5 个答案:

答案 0 :(得分:3)

  

是否有一种不复杂的方式来通过   发布条件给其他分页   网页?

不。

  

有没有一个很好的蛋糕方式来做到这一点   更像是passArgs,sessions和url   编码看起来不像蛋糕风格。

只有一种方式,无论是蛋糕还是蛋糕。

  1. 必须使用GET方法进行搜索。

  2. 通过QUERY STRING传递的参数。

  3. 因此,使用method =“GET”创建搜索表单,然后使用http_build_query()汇编查询字符串并使用它来链接到其他页面。

    有点好奇,你可以在SO上看到一个例子:

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

答案 1 :(得分:3)

您可以使用passedArgs。

在方法控制器中:

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));

答案 2 :(得分:1)

如果是我,我会想到将这些东西保存到会话中。然后我会在会话中添加页面维度,以存储每个页面,从而允许用户轻松地来回走动。

$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()

答案 3 :(得分:1)

您还可以使用Post/Redirect/Get design pattern模式解决此问题,允许用户为搜索的网址添加书签(不会将其作为会话过期)并保持网址友好。例如:

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,但用户被重定向,而是GET /controller/action/search+terms,其中术语作为参数传递到操作中(即。$searchTerms)。

如果您只是将表单提交方法更改为GET,则会看到类似以下内容:/controller/action?data[SearchForm][search_terms]=search+terms

答案 4 :(得分:1)

感谢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);

// 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->数据或$ this-> params ['url']中获取数组

应该有一个持久的分页插件/组件cakePHP将使使用cakePHP开发生活更加轻松和有趣。


谢谢大家。