<?php | |
/** | |
* Gera a paginação dos itens de um array ou collection. | |
* | |
* @param array|Collection $items | |
* @param int $perPage | |
* @param int $page | |
* @param array $options | |
* | |
* @return LengthAwarePaginator | |
*/ | |
public function paginate($items, $perPage = 15, $page = null, $options = []) | |
{ | |
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1); | |
$items = $items instanceof Collection ? $items : Collection::make($items); | |
return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); | |
} |
All who are facing issue on page >= 2, visit at
https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e
Issue:
{ "current_page": 2, "data": { "3": { "ID": 196, "post_author": 3, "post_date": "2017-11-03 08:45:17", "post_date_gmt": "2017-11-03 08:45:17" } } }
To solve second page issue.
chain with values method $items->forPage($page, $perPage)->values()
Thanks for this :)
how to use this solution in ajax
I solve it
collect( [ 2 => 'Some value', 5 => 'other value' ] )->paginate(15)
https://gist.github.com/freelance-github/fe8488ff19b1a7ed67223b15c7a25b52
@vluzrmos great work man
thanks, this helped a lot
I'm lost. Please how do i use this?
I'm lost. Please how do i use this?
Maybe this example will help you
//Getting current request link
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//Using function on the array
$paginated_list = $this->paginate($array_to_paginate, 20, request('page'), ['path' => $actual_link, ]);
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
$items = $items instanceof Collection ? $items : Collection::make($items);
return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => 'page',
]);
this is exactly what i am searching for @PaulAguirre . thank you for your contribution. stay safe!
awesome
For those who has issues with second page:
where 2nd page data has keys like:
"data": { "5": { "userId": "564110eadcb39832268ea873", "email": "dsdfgdfg@il.com", "isActive": true, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, "6": { "userId": "564110ea2169bc358a3b65c2", "email": "dsdfgdfg@d.com", "isActive": false, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, "7": { "userId": "564110eaee662f30c4bd6772", "email": "dsdfgdfg@dsdfgdfg.com", "isActive": true, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, }
This is because
forPage()
returns an array with keysFix is to add
array_values()
:public function paginateCollection($items, $perPage = 15, $page = null, $options = []) { $page = $page ?: (\Illuminate\Pagination\Paginator::resolveCurrentPage() ?: 1); $items = $items instanceof \Illuminate\Support\Collection ? $items : \Illuminate\Support\Collection::make($items); return new \Illuminate\Pagination\LengthAwarePaginator(array_values($items->forPage($page, $perPage)->toArray()), $items->count(), $perPage, $page, $options); //ref for array_values() fix: https://stackoverflow.com/a/38712699/3553367 }
thank you
Thank you very much. Saved my lyfe!
Better yet, just make a macro.
Collection::macro('paginate', function($perPage = 15, $page = null, $options = []) {
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
if (!isset($options['path'])) {
$options['path'] = '/' . request()->path();
}
return new LengthAwarePaginator(array_values($this->forPage($page, $perPage)->toArray()), $this->count(), $perPage, $page, $options);
});
Thank you very much! This is really helpful
For those who has issues with second page:
where 2nd page data has keys like:
"data": { "5": { "userId": "564110eadcb39832268ea873", "email": "dsdfgdfg@il.com", "isActive": true, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, "6": { "userId": "564110ea2169bc358a3b65c2", "email": "dsdfgdfg@d.com", "isActive": false, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, "7": { "userId": "564110eaee662f30c4bd6772", "email": "dsdfgdfg@dsdfgdfg.com", "isActive": true, "firstName": "dsdfgdfg", "lastName": "dsdfgdfg", "permissionType": "dsdfgdfg" }, }
This is because
forPage()
returns an array with keysFix is to add
array_values()
:public function paginateCollection($items, $perPage = 15, $page = null, $options = []) { $page = $page ?: (\Illuminate\Pagination\Paginator::resolveCurrentPage() ?: 1); $items = $items instanceof \Illuminate\Support\Collection ? $items : \Illuminate\Support\Collection::make($items); return new \Illuminate\Pagination\LengthAwarePaginator(array_values($items->forPage($page, $perPage)->toArray()), $items->count(), $perPage, $page, $options); //ref for array_values() fix: https://stackoverflow.com/a/38712699/3553367 }
Thanks, mate
/**
- Gera a paginação dos itens de um array ou collection.
- @param array|Collection $items
- @param int $perPage
- @param int $page
- @param array $options
- @return LengthAwarePaginator
*/
public function paginate($items, $perPage = 2, $page = null)
{
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
$items = $items instanceof Collection ? $items : Collection::make($items);
return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => 'page',
]);
}
Thanks a lot
please how can it be installed??
Depends on which one you're talking about. For the macro, you put it in your boot() method on AppServiceProvider (or on another service provider if you want). For the general method, you specify a custom collection object for your model and put it on the custom collection.
With the same code, I have two pages, one for search where I enter the search criteria and another to display the results. However, when I click to the second or any other page, the system redirect me first to the search page again to reenter the search criteria then bring the result for that specific page. Could you please help to solve this?
great for this comments thanks to all
Great!! It works just fine. Thanks a lot!!!
Hello to everyone, how can i use ->links()? Thanks in advance
If you have a problem with pagination add values() method:
return new LengthAwarePaginator($items->forPage($page, $perPage)->values(), $count, $perPage, $page, []);
I have a problems when fetch page > 1, $items->forPage($page, $perPage)->values()
. this solved my problems.
This type of pagination can impact performance?
Thanks very much
Laravel 9.x and above
public static function paginate(array|Collection $items, mixed $perPage = null, mixed $page = null, array $options = [], mixed $path = null)
{
$perPage = is_null($perPage) ? 25 : $perPage;
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
$items = $items instanceof Collection ? $items : Collection::make($items);
$paginator = new LengthAwarePaginator(
$items->forPage($page, $perPage),
$items->count(),
$perPage,
$page,
$options
);
if(!is_null($path)) {
$paginator->setPath($path);
}
return $paginator;
}
Basic Example:
// set path dynamically from current route name or url with params
$path = route(request()->route()->getName(), $request->except(['page']));
$invoices = YOUR_HELPER_CLASS_HERE::paginate(
items: $data,
perPage: 10,
path: $path
);
Thank you :)