在控制器中访问分页器对象
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,了解有关实现无限滚动类型页面的更多信息。
* 几乎一切皆有可能,但您当然不需要在控制器中使用助手。
我正在使用 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,了解有关实现无限滚动类型页面的更多信息。
* 几乎一切皆有可能,但您当然不需要在控制器中使用助手。