Search code examples
phpcakephpcakephp-2.5paginator

Access Paginator object in controller


I am using cakePHP 2.5 and I want to access $this->Paginator->hasNext() in controller, but it through exception.

    $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');
    }

On my page, I want to display 3 type of product featured/trending/newest. Initially I load first page by default, then when user scroll down then I will call ajax and append next page like wise. But if last page is reached then I want to stop ajax call (because unknown page through 404 not found error).

To overcome that, I prevent AJAX call for unknown pages. And also make sure that first page isn't last!!

Hope my details make sense!

I could not find any answer on any forum/document. Please guide me or point me if it's duplicate of any.


Solution

  • You don't need to (and cannot*) access a helper in the controller.

    Take a look at the source code for hasNext which is just calling the helper function _hasPage, which is simply checking the parameters array.

    The paginator parameters are 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']
    );
    

    So from the code in the question:

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

    Is the information you're looking for (it will be overwritten each time you call paginate.

    Consider your application design.

    Unless you have exactly the same number of featured, newest and trending records - it'd be better to have one ajax request for each type. Also see this related question, for more information on implementing infinite-scroll type pages.

    * Almost anything is possible, you certainly should not need to use a helper in a controller though.