LoginSignup
29
39

More than 5 years have passed since last update.

laravelのページネーションにソート機能を追加する

Last updated at Posted at 2018-12-04

やりたいこと

使うもの

やった

composerからインストール

$ composer require kyslik/column-sortable

各種設定

コンフィグファイル追加

$ php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config" 

config/columnsortable.phpが生成される。

providers

config/app.php
'providers' => [

    /*
     * 追加
     */
    Kyslik\ColumnSortable\ColumnSortableServiceProvider::class,
],

実装

Model

config/app.php
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Kyslik\ColumnSortable\Sortable;     // 追加

class User extends Authenticatable
{
    use Notifiable;
    use Sortable;   // 追加

    public $sortable = ['name', 'login_id'];    // ソート対象カラム追加

Controller

UserController.php
use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
    public function index(User $user)
    {
        // sortable()を追加
        $users = $user->sortable()->paginate(10);
        return view('user.index', ['users' => $users]);
    }
}

View

bladeに@sortablelink() を記載するとソートボタンになるっぽい。

@sortablelink('column', 'Title', ['parameter' => 'smile'], ['rel' => 'nofollow'])

第1引数:ソート対象のカラム名
第2引数:表示する文字列(省略するとカラム名を表示)
第3引数:デフォルトのクエリストリング(省略可)
第4引数:追加のアンカータグの属性(省略可)

使い方としては<th> @sortablelink('name', '名前') </th>みたいな感じ。
クリックするとsort=name&direction=descのようなパラメータがついて同じ画面をgetする。

見た目に関して

Font Awesome

このままでも使えるけどソート状態を示すアイコンがほしい。
デフォルトでFont Awesomeに対応してるっぽいのでついでに導入。

index.blade.php
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css">

アイコン指定

ソートするカラム名によってclassの指定が可能。
FontAwesomeのアイコンはここで設定。

fa-はFontAwesome使用のプレフィックスかな?

config/columnsortable.php
<?php

return [

    /*
    spec columns
    */
    'columns'                       => [
        // 文字列
        'alpha'   => [
            'rows'  => ['description', 'email', 'name', 'slug'],
            'class' => 'fa fa-sort-alpha',
        ],
        // 量
        'amount'  => [
            'rows'  => ['amount', 'price'],
            'class' => 'fa fa-sort-amount',
        ],
        // 数値
        'numeric' => [
            'rows'  => ['created_at', 'updated_at', 'level', 'id', 'phone_number'],
            'class' => 'fa fa-sort-numeric',
        ],
    ],

アイコン(asc/desc)

Font Awesome 5から以下の修正が必要。

config/columnsortable.php
    /*
    suffix class that is appended when ascending direction is applied
     */
    // 'asc_suffix'                    => '-asc',
    'asc_suffix'                    => '-up',

    /*
    suffix class that is appended when descending direction is applied
     */
    // 'desc_suffix'                   => '-desc',
    'desc_suffix'                   => '-down',

...って公式に書いてあるけどalphanumericはupとdown逆な気がする。
(自分の感覚がおかしいのか?)
amountは合ってそうだから悩ましい。

sort up のアイコン(amount以外desc感)
sort down のアイコン(amount以外asc感)

めんどくせぇからv4を使おう(思考停止)
もしくはcss自作する必要がありそう。

29
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
39