CakePHP分页和过滤器

时间:2014-01-14 21:50:19

标签: sorting cakephp filter pagination

我为表启用了分页功能。单击页码会创建一个带有/ page :( page_number)的URL。分页非常适合排序和过滤。

问题是:

  • 如果我在第4页
  • 然后执行搜索或过滤

结果:结果将从第4页开始显示。我想从第1页开始。

如果搜索结果只有一个页面,这一点尤为重要。然后我收到了一个错误。

传递给BeforeFind,AfterFind,BeforeFilter和AfterFilter的$查询似乎不表示这是分页点击还是搜索或过滤。

4 个答案:

答案 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 并且页面参数消失