在控制器中访问分页器对象

Access Paginator object in controller

我正在使用 cakePHP 2.5,我想在控制器中访问 $this->Paginator->hasNext(),但它是通过异常访问的。

    $type = array('featured', 'newest', 'trending');

    foreach($type as $each)
    {
        $conditions = array('Product.status'=>'1', "is_$each" => '1');
        $this->Product->recursive = 1;

        //retrieve and set final result set
        $this->paginate = array(
                                'fields' => array('Product.*'),
                                'conditions' => $conditions,
                                'limit' => $page_limit,
                                'page' => $page,
                                'order' => "$order_by $order_by_sort",
                            );
        $products[$each] = $this->paginate('Product');
    }

在我的页面上,我想显示 3 种类型的产品 featured/trending/newest。最初我默认加载第一页,然后当用户向下滚动时,我将调用 ajax 并像明智地附加下一页。但是,如果到达最后一页,那么我想停止 ajax 调用(因为通过 404 not found error 的未知页面)。

为了克服这个问题,我阻止 AJAX 调用未知页面。还要确保第一页不是最后一页!!

希望我的详细信息有意义!

我无法在任何 forum/document 上找到任何答案。如果有任何重复,请指导我或指出我。

MVC 违规

$this->Paginator->hasNext()

这是 帮助程序 的一种方法。 Helpers 被认为在控制器中使用,因为这违反了 MVC 模式和 不良做法。如果您认为 必须这样做,那您就错了:修复您的体系结构,它被设计破坏了。

正确的解决方案

Return 分页状态以及 AJAX 响应中的数据:

$this->set('pagination', $this->request->paging['Product']);
$this->set('products', $result);
$this->set('_serialize', ['products', 'pagination']);

您可以根据数据更改视图状态:

if (pagination.Product.nextPage == true) { /*... */ }

您不需要(也不能*)访问控制器中的助手。

看看the source code for hasNext which is just calling the helper function _hasPage,它只是检查参数数组。

分页器参数为all available in the controller:

$paging = array(
    'page' => $page,
    'current' => count($results),
    'count' => $count,
    'prevPage' => ($page > 1),
    'nextPage' => ($count > ($page * $limit)),
    'pageCount' => $pageCount,
    'order' => $order,
    'limit' => $limit,
    'options' => Hash::diff($options, $defaults),
    'paramType' => $options['paramType']
);

所以从问题中的代码来看:

 $this->request['paging']['Product']['nextPage']

是你要找的信息(每次调用都会被覆盖paginate.

考虑您的应用程序设计。

除非您拥有完全相同数量的特色记录、最新记录和热门记录 - 最好为每种类型请求一个 ajax。另请参阅 this related question,了解有关实现无限滚动类型页面的更多信息。

* 几乎一切皆有可能,但您当然不需要在控制器中使用助手