当我搜索我的列表时,我会得到一些分页结果,但当我去第二页时,我的搜索是 打破因为它是一个获取请求,我通过post方法获得搜索结果。
注意:为了获取搜索结果,我不想通过get request(即查询字符串参数)提交表单,也不希望将表单数据存储在会话中
有没有办法得到满足上述条件的结果?
答案 0 :(得分:1)
您想要实施the PRG Pattern。
Post / Redirect / Get(PRG)是一种Web开发设计模式 防止一些重复的表单提交,创建更直观 用户代理(用户)的界面。 PRG实现了书签和 以可预测的方式刷新按钮,不会创建重复 表格提交。
The CakeDC Search plugin使得在CakePHP中很容易做到。
答案 1 :(得分:0)
仅使用“POST”调用很难做到这一点。您需要将POST转换为GET调用。
查看我制作的this post或clone it from github
希望这有帮助
编辑:
使用我的git repo。如果你想要url querystrings而不是命名参数:
page
,sort
和direction
至this->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');
}
希望你理解背后的逻辑。