Skip to content

Instantly share code, notes, and snippets.

@alwarren
Last active April 22, 2016 08:56
Show Gist options
  • Save alwarren/b8f285216bf8ec656998045ae9fe3841 to your computer and use it in GitHub Desktop.
Save alwarren/b8f285216bf8ec656998045ae9fe3841 to your computer and use it in GitHub Desktop.
A Laravel 5.2 trait that stores a value in the session that can be used with a form select to set the per page value for a length aware paginator.
<?php
namespace App\Traits;
use Illuminate\Http\Request;
/**
* A Laravel 5.2 trait that stores a value in the session that can be used with
* a form select to set the per page value for a length aware paginator.
*
* @author Al Warren
*
*/
trait PerPageTrait
{
/**
* Determin if the session key needs to be removed
*
* @param string $key
* @param mixed $perPage
* @param number $perPageDefault
*
* @return mixed
*/
public function requestResetsPerPage($key, $perPage, $perPageDefault) {
$result = false;
$perPage = is_numeric( $perPage ) ?( int ) $perPage : $perPage;
if($perPage == $perPageDefault || request()->exists( $key ) && empty( $perPage ))
$result = true;
return $result;
}
/**
* Validate the request value.
*
* @param mixed $perPage
* @param mixed $perPageDefault
* @param number $maxPerPage
*
* @return mixed
*/
public function validPerPageRequest($perPage, $perPageDefault, $maxPerPage) {
if(is_numeric( $perPage ))
$perPage =( int ) substr( $perPage, 0, strlen(( string ) $maxPerPage ) );
if(is_numeric( $perPage ) && $perPage > $maxPerPage)
$perPage = 'all';
if($perPage && ! is_numeric( $perPage ) && $perPage !== 'all')
return false;
return $perPage;
}
/**
* Store the request value in a session if needed and return
* the value, an existing session value, or a default.
*
* @param mixed $perPageDefault
* @param number $maxPerPage
* @param string $key
*
* @return mixed
*/
public function perPageRequest($perPageDefault = 50, $maxPerPage = 49, $key = 'per_page') {
$perPageRequest = strtolower( trim( request()->get( $key ) ) );
if($this->requestResetsPerPage( $key, $perPageRequest, $perPageDefault ))
session()->forget( $key );
$perPage = $this->validPerPageRequest( $perPageRequest, $perPageDefault, $maxPerPage );
if(false === $perPage)
abort( 400, 'Bad Per Page Request' );
$sessionPerPage = request()->session()->get( $key );
if($sessionPerPage && empty( $perPage ))
return $sessionPerPage;
if($perPage !== $perPageDefault)
request()->session()->put( $key, $perPage );
return( $perPage ?: $perPageDefault );
}
}
@alwarren
Copy link
Author

alwarren commented Apr 22, 2016

Controller:

<?php
namespace App\Http\Controllers\Test;

use App\Http\Controllers\Controller;
use App\Traits\PerPageTrait;
use App\User;

class UsersController extends Controller
{
    use PerPageTrait;
    
    public function index()
    {
        $per_page = session('per_page') ?: config('settings.per_page.default');
        
        $users = $per_page == 'all' ? User::all() : User::paginate($per_page) ;
         
        return view('test.users', compact('users', 'per_page'));
    }
    
    public function postPerPage()
    {
        $this->perPageRequest(config('settings.per_page.default'), User::count());
         
        return redirect()->back();
    }
}

Routes:

Route::group(
    ['prefix' => 'test',
        'middleware' => ['auth', 'acl'],
        'is' => 'administrator', // from Kodin ACL (acl)
    ],
    function() {
        Route::get('users', 'Test\UsersController@index');
        Route::post('users', 'Test\UsersController@postPerPage');
    }
);

Form:

<form class="form-inline" action="{{ request()->url() }}" method="post">
    {!! csrf_field() !!}
    <label for="per_page">Per Page:</label>
    <select class="form-control form-control-sm" id="per_page" name="per_page" onchange="this.form.submit()">
        @foreach ( config('settings.per_page.options') as $option )
        <option value="{{ $option }}"{{ $option == $per_page ? ' selected' : '' }}>{{ $option }}</option>
        @endforeach
    </select>
</form>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment