访问控制器中的Paginator对象

时间:2015-10-09 09:05:26

标签: php cakephp cakephp-2.5 paginator

我正在使用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调用。并确保第一页不会持续!!

希望我的细节有意义!

我找不到任何论坛/文件的答案。如果它与任何内容重复,请指导我或指出我。

2 个答案:

答案 0 :(得分:1)

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

看一下刚刚调用the source code for hasNextthe 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,了解有关实现无限滚动类型页面的更多信息。

*几乎所有东西都是可能的,你当然不需要在控制器中使用帮助器

答案 1 :(得分:-1)

MVC违规

  

$这 - > Paginator-> hasNext()

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

正确的解决方案

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

$a = '"0","46","","","","Abc CDE ApS                   ","","","","","81602832            ","","","","","","","","","","" '

# delete all ' "'
While($a -like '* "*')
{
    $a = $a -replace ' "', '"'
}

# delete last character
$a = $a.subString(0,$a.length-1)

# whrite it into the console
echo ""
echo $a

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

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