我已经在控制器/索引中创建了一个带有POST操作的小型搜索和过滤器表单,该表单向自己POST了要分页的条件和字段($this->paginate($conditions)
)。
这对第一页很有用,但是在后续页面中,过滤条件会丢失。分页passedArgs
很好地支持GET变量。
是否有一种不复杂的方法将POST条件传递给其他分页页面?
我看过的方法是通过会话传递$conditions
,这不是没有分配会话的复杂性,也不是在再次提交表单时取消设置会话(对过滤条件的更多改进)用户)。
另一种方法是将$conditions
作为带有url_encode
的序列化字符串作为GET参数传递。
是否有更好的'蛋糕'方式来实现这一点passedArgs
。会话和url_encode
看起来不像蛋糕风格。
谢谢
答案 0 :(得分:3)
是否有一种不复杂的方式来通过 发布条件给其他分页 网页?
不。
有没有一个很好的蛋糕方式来做到这一点 更像是passArgs,sessions和url 编码看起来不像蛋糕风格。
只有一种方式,无论是蛋糕还是蛋糕。
必须使用GET方法进行搜索。
通过QUERY STRING传递的参数。
因此,使用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开发生活更加轻松和有趣。
谢谢大家。