Paginazione personalizzata laravel 5

Vediamo come creare una paginazione personalizzata a partire da una query con Laravel 5

In questo articolo scopriremo come strutturare al meglio un engine di paginazione personalizzata per Laravel 5.

Panoramica

NOTA: la guida è testata e funzionante su laravel versione 5.2+

Questo articolo nasce dall’esigenza di dover creare una paginazione per query custom a cui non sia possibile applicare il parametro ->paginate(X) nel controller.

In quali casi si può verificare questa ipotesi?

Nel mio caso avevo la necessità di “paginare” un array molto lungo, ma di fatto, potete pensare anche ai vari search page dove, con database molto grossi, i result a schermo potrebbero essere molto lunghi e appesantire il vostro sito nel caso non mettiate un’opportuna paginazione.

Implementazione

Per prima cosa andiamo a piazzare in alto al nostro controller queste due righe di codice:

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

In questo modo andiamo a poter “usare” nel nostro controller la classe di Paginazione e di “assemblamento dati” usata da laravel. Per maggiori info vi rimando qui e qui, nel caso vogliate approfondire tutte le funzionalità e potenzialità delle due classi.

A questo punto, sempre nel vostro controller, all’interno della funzione che volete usare andiamo a comporre la query:

/*query che compone l'array o dichiarazione dell'array da passare*/
$result[] = array(
"id"=>$value_temp->id,
"titolo"=>$value_temp->titolo
);
/*FINE query che compone l'array o dichiarazione dell'array da passare*/

Una volta composto l’array da inviare alla vista, andiamo a “spezzettarlo” e creare la paginazione.

//Prendo la pagina corrente e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();

//Nuova collection laravel a partire da array
$collection = new Collection($result);

//Numero elementi per pagina
$perPage = 20;

//Divido il totale per il numero di elementi da visualizzare in pagina
$currentPageResult = $collection->slice( ($currentPage-1) * $perPage, $perPage)->all();

//Creo la paginazione
$paginatedResult= new LengthAwarePaginator($currentPageResult, count($collection), $perPage);

Vi invito a visionare i commenti al codice step by step.

A questo punto abbiamo tutto ciò che ci serve per renderizzare la view:

return view('search',['result' => $paginatedResult]);

Nel file della vista a questo punto possiamo sia accedere ai vari elementi dell’array:

@foreach($result as $item)
{{--Qui potete stampare le informazioni dei vari elementi--}}
@endforeach

Che visualizzare la paginazione dove meglio vi aggrada:

{{--Visualizzo la paginazione--}}
{{ $result->setPath('')->render() }}

NOTA: Senza setPath potreste andare incontro ad un’incongruenza di link quando cliccate le varie pagine (es.pag=2 etc).

Codice completo pronto all’uso

File TuoController.php

/*query che compone l'array*/
$result[] = array(
"id"=>$value_temp->id,
"titolo"=>$value_temp->titolo
);
/*FINE query che compone l'array*/

//Prendo la pagina corrente e.g. &page=6
$currentPage = LengthAwarePaginator::resolveCurrentPage();

//Nuova collection laravel a partire da array
$collection = new Collection($result);

//Numero elementi per pagina
$perPage = 20;

//Divido il totale per il numero di elementi da visualizzare in pagina
$currentPageResult = $collection->slice( ($currentPage-1) * $perPage, $perPage)->all();

//Creo la paginazione
$paginatedResult= new LengthAwarePaginator($currentPageResult, count($collection), $perPage);

//Vista 
return view('search',['result' => $paginatedResult]);

File tuavista.blade.php

@foreach($result as $item)
{{--Qui potete stampare le informazioni dei vari elementi--}}
@endforeach


{{--Visualizzo la paginazione--}}
{{ $result->setPath('')->render() }}

Conclusioni

Se questo articolo ti è stato utile condividilo sui tuoi socials preferiti o semplicemente lasciami un commento qui sotto!

Ti serve aiuto per il tuo progetto laravel? RICHIEDI CONSULENZA

 

Lascia la tua opinione

×