分页链接打破来自post data cakephp的搜索结果

时间:2014-01-24 12:26:55

标签: cakephp post

当我搜索我的列表时,我会得到一些分页结果,但当我去第二页时,我的搜索是 打破因为它是一个获取请求,我通过post方法获得搜索结果。

注意:为了获取搜索结果,我不想通过get request(即查询字符串参数)提交表单,也不希望将表单数据存储在会话中

有没有办法得到满足上述条件的结果?

3 个答案:

答案 0 :(得分:1)

您想要实施the PRG Pattern

  

Post / Redirect / Get(PRG)是一种Web开发设计模式   防止一些重复的表单提交,创建更直观   用户代理(用户)的界面。 PRG实现了书签和   以可预测的方式刷新按钮,不会创建重复   表格提交。

The CakeDC Search plugin使得在CakePHP中很容易做到。

答案 1 :(得分:0)

仅使用“POST”调用很难做到这一点。您需要将POST转换为GET调用。

查看我制作的this postclone it from github

希望这有帮助

编辑:

使用我的git repo。如果你想要url querystrings而不是命名参数:

  • this line中,而不是foreach构建查询字符串并将其传递给重定向
  • this line中,从查询字符串($ GET)
  • 中获取参数
  • 并在this line中添加pagesortdirectionthis->paginate

我没有测试过它,但它应该是那样的

答案 2 :(得分:0)

我们可以使用补丁来完成。

在视图中:

创建搜索表单:

$this->Form->create('Search', array('url' => array('controller' => 'controller', 'action' => 'index', substr(time(), 2,rand(1, 7) ))) );

注意:在表单操作的末尾附加一个随机数。这将让我们知道何时清除会话。

控制器中的

 public function index( $search = null)
 {        
    $conditions =   array(1 => 1);      
    if( !empty($this->data['Search']['keyword']) && $search)
    {
        $conditions = array('Model.field like' => $this->data['Search']['keyword'] . '%');
        // store search array in session
        $this->Session->write('conditions', $this->data['Search']);
    }           
    if ($search)
    {
        $this->request->data['Search']  =   $this->Session->read('conditions');
        $conditions = array('Model.field like' => $this->data['Search']['keyword'] . '%');    
    }
    else
    {
        $conditions =   array(1 => 1);  
        $this->Session->delete('conditions');
    }    
    $this->paginate= array('limit'=> 10, 'conditions' => $conditions);
    $lists = $this->Paginate('Model');
 }

希望你理解背后的逻辑。