我为表启用了分页功能。单击页码会创建一个带有/ page :( page_number)的URL。分页非常适合排序和过滤。
问题是:
结果:结果将从第4页开始显示。我想从第1页开始。
如果搜索结果只有一个页面,这一点尤为重要。然后我收到了一个错误。
传递给BeforeFind,AfterFind,BeforeFilter和AfterFilter的$查询似乎不表示这是分页点击还是搜索或过滤。
答案 0 :(得分:0)
您可以随时使用简单的$this->paginate['YourModel']['page'] = 1;
手动更改控制器中的当前页面,但当然要在调用$this->paginate()
之前。因此,在控制器中,您只需检查当前是否有请求的过滤器/搜索:
if ($filter = $this->request->query('filter')) {
// apply the filter, most likely as a WHERE condition for pagination, not sure what is your case...
// and force to display the first page
$this->paginate['YourModel']['page'] = 1;
}
但是,我在确定首次应用过滤器/搜索时是否存在问题,或者您是否只是将搜索结果浏览到下一页。您可以将此信息存储到会话中,但它不会感觉太聪明。也许比较请求页面和当前页面是否相同,但在修改搜索词时不起作用。所以我认为最简单的方法是添加隐藏的表单字段:
echo $this->Form->hidden('page', array('value' => 1));
因此,当您搜索/过滤它时,它会自动重置页面,而不需要我之前编写的控制器代码。
如果您不使用经典表单提交并通过AJAX执行,您可以附加查询参数page=1
,结果是相同的。希望它能帮助你前进
答案 1 :(得分:0)
哇。我终于通过控制器中的重定向轻松实现了它。
由于我不知道的原因,这不起作用。 $ movieStars填充正确,但有些东西打破了它:
try {
$movieStars = $this->paginate();
} catch (NotFoundException $e) {
// If page results are not found
// For example - we are on page and we search for something
// Results returned for page 7 - but only two results
// Not sure why this doesn't work - $movieStars are properly set and code continues
$request = $this->request;
$theseParams = $this->request->params;
$pageFromParams = $theseParams['named']['page'];
$passedArgs = $this->passedArgs;
$pageFromArgs = $passedArgs['page'];
$breakme = true;
$this->request->params['named']['page'] = '1';
$this->passedArgs['page'] = '1';
$requestHere = $this->request->here;
$requestUrl = $this->request->url;
$newHere = preg_replace('/page:(\d+)/', 'page:1', $requestHere);
$newUrl = preg_replace('/page:(\d+)/', 'page:1', $requestUrl);
$this->request->here = $newHere;
$this->request->url = $newUrl;
$movieStars = $this->paginate();
}
$this->set(compact('movieStars'));
但是这个小的重定向技巧就是这样做的。
try {
$movieStars = $this->paginate();
} catch (NotFoundException $e) {
// finally found easy solution if paginate throws error - redirect to page one
$requestUrl = $this->request->url;
$newUrl = preg_replace('/page:(\d+)/', 'page:1', $requestUrl);
$redirectUrl = preg_replace('/movie_stars\//', '', $newUrl);
$this->redirect($redirectUrl);
}
答案 2 :(得分:0)
您可以手动设置表单操作网址而不是蛋糕自动网址。像这样:$ this-> Form-> create('ModelName',array('url'=> array('action'=>'index'));
因为cakephp auto会生成表单url,并且还会在网址中附加当前查询字符串。
答案 3 :(得分:0)
对我来说,我必须将表单的 url 放在视图中,然后它总是提交到一个干净的 url 并且页面参数消失