Skip to content

makedo/php-paginator

Repository files navigation

Paginator

This is yet another paginator for php. Main idea of this package is to build data source independent paginator, which has an ability to work in several modes:

  • Count skip by id

        $loader = function (int $limit, int $skip): iterable
        {
            //SELECT * from users  WHERE id > $skip LIMIT $limit
        };
        
        $perPage = 100;
        $lastIdOnPreviousPage = 34;
        
        $paginatorFactory = new SkipById($perPage);
      
        $page = $paginatorFactory
            ->createPaginator(new CallableLoader($loader), $lastIdOnPreviousPage)
            ->paginate()
        ;

    In this example you have an ability use id as skip value. As you can see, Loader function accepts id in $skip variable. It should be id of last item on previous page and it comes from client side. For 1st page it should be 0. For $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

    Optionally, you can set $currentPage value, which will be set to $page->currentPage.

  • Count skip by id with total count

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage
           )
           ->paginate()
       ;

    In above example paginator counts skip by id and uses total count for $page->total, $page->totalPages values. For $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

  • Count skip by id with total count and current page

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       $currentPage = 4;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage,
               $currentPage
           )
           ->paginate()
       ;

    In above example paginator counts skip by id and uses total count for $page->total, $page->totalPages, $page->hasNext values. In this case, we know $currentPage value, which in real case comes from client, so we can use total count and $currentPage for counting $page->hasNext except using $perPage + 1 strategy.

  • Count skip by offset

    $loader = function (int $limit, int $skip): iterable
    {
        //SELECT * from users LIMIT $limit OFFSET $skip
    };
    
    $perPage = 100;
    $currentPage = 2;
    
    $paginatorFactory = new SkipByOffset($perPage);
    
    $page = $paginatorFactory
        ->createPaginator(new CallableLoader($loader), $currentPage)
        ->paginate()
    ;

    In above example paginator counts skip as offset according to $perPage and $currentPage values. For counting $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

    • Count skip by offset and use total count

         $loader = function (int $limit, int $skip): iterable {
             //SELECT * from users LIMIT $limit OFFSET $skip
         };
        
         $counter = function (): int {
             //SELECT count(id) from users
         };
         
         $perPage = 100;
         $currentPage = 2;
         
         $paginatorFactory = new SkipByOffsetCountable($perPage);
      
         $page = $paginatorFactory
             ->createPaginator(new CallableLoader($loader), new CallableCounter($counter), $currentPage)
             ->paginate()
         ;

      In above example paginator counts skip by offset and uses total count for $page->total, $page->totalPages, $page->hasNext values.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages