【Laravel-admin】Laravel-admin便利な拡張機能(Extension)たち紹介7
概要
私がLaravel-adminで構築する際に基本的に追加する拡張機能を紹介します。
最終回の今日は、「grid-sortable」を紹介します。
「【Laravel-admin】Laravel-admin便利な拡張機能(Extension)たち紹介1」
Laravel-Admin構築までの環境構築は、以下の記事を参考にしてください。
「【Laravel】MacにLaravelインストールしてみた(Virtalbox + Vagrant + homestead) 」
「【Laravel-admin】Laravel-adminインストールしてみた」
環境
MacBook Air (Retina, 13-inch, 2020)
メモリ: 16 GB
macOS: Big Sur バージョン 11.6.1
仮想環境
VirtualBox 6.1.28
Vagrant 2.2.19
Laravel/Homestead 11.5.0 ( Ubuntu 20.04.3 LTS, PHP 8.0.11 )
Laravel Framework 8.70.2
mysql Ver 8.0.26-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))
encore/laravel-admin ^1.8
grid-sortable拡張機能を追加
grid-sortableを追加・紹介していきたいと思います。
参考
Link: https://github.com/laravel-admin-extensions/grid-sortable
Install
composer require laravel-admin-ext/grid-sortable -vvv
公開状態にします。
php artisan vendor:publish --provider="Encore\Admin\GridSortable\GridSortableServiceProvider"
実行すると、vendor配下のAssetsが、公開ディレクトリへコピーされます。
Copied Directory [/vendor/laravel-admin-ext/grid-sortable/resources/assets] To [/public/vendor/laravel-admin-ext/grid-sortable]
Publishing complete.
grid-sortableを適用する
テーブル作成
マイグレーションを使って、テーブルの作成
マイグレーションについては、公式サイトに解説されています。
Link: https://readouble.com/laravel/5.5/ja/migrations.html
ファイル名は、これまで作成してきたテーブルのファイル名に合わせてみました。
FileName: database/migrations/2021_11_23_000000_create_test_movies_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTestMoviesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('test_movies', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->integer('director');
$table->string('describe');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('test_movies');
}
}
マイグレーションを実行
php artisan migrate
”test_movies"が作成されたことを確認する。
mysql> show tables;
+------------------------+
| Tables_in_laraadmindb |
+------------------------+
| admin_config |
| admin_menu |
| admin_operation_log |
| admin_permissions |
| admin_role_menu |
| admin_role_permissions |
| admin_role_users |
| admin_roles |
| admin_user_permissions |
| admin_users |
| failed_jobs |
| migrations |
| password_resets |
| personal_access_tokens |
| test_movies |
| users |
+------------------------+
16 rows in set (0.01 sec)
モデルを作成する
以下のコマンドを実行することで、以下の場所にモデルが作成されます。
FileName: app/Models/TestMovies.php
php artisan make:model Models/TestMovies
作成されたモデル。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TestMovies extends Model
{
use HasFactory;
}
コントローラを作成する
以下のコマンドを実行して、先ほど作成したモデルとの関連付けをしながらコントローラを作成します。
FileName: app/Admin/Controllers/TestModelsController.php
php artisan admin:make TestModelsController --model='App\Models\TestMovies'
ルーティング設定する
”$router->resource('test-movies’, TestModelsController::class);”を追加
FileName: app/Admin/routes.php
<?php
use Illuminate\Routing\Router;
Admin::routes();
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => config('admin.route.middleware'),
'as' => config('admin.route.prefix') . '.',
], function (Router $router) {
$router->get('/', 'HomeController@index')->name('home');
$router->resource('test-movies', TestModelsController::class);
});
アクセスしてみる。
Url: http://laravel-admin.test/admin/test-movies
適当にデータをエントリーします。
ここからが本題ですね。
この画面に"grid-sortable"を適用してみます。
テーブルに"grid-sortable"用の並び替えカラムを追加します。
マイグレーションファイルをコマンドで作成してみます。
*お気づきだろうか、、、alterするならさっきのcreateで追加しとけっ!って感じですね。。。
テーブルを変更する
以下のコマンドを実行するとタイムスタンプがファイル名の頭についてファイルが生成されます。
FileName: database/migrations/YYYY_MM_DD_hhmmss_create_test_movies_table_alter.php
php artisan make:migration create_test_movies_table_alter --table=test_movies
ファイルを開いて、生成時、ロールバック時の記述をしていきます。
今回は、カラム"director"を “order_column"に名称を変更してみたいと思います。
マイグレーションファイルを開き、以下のようにup()とdown()メソッド内のSchema::table内に名称変更の処理を記述します。
$table->renameColumn('{変更前カラム名称}', '{変更後カラム名称}');
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTestMoviesTableAlter extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('test_movies', function (Blueprint $table) {
// カラム名称を変更する.
$table->renameColumn('director', 'order_column');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('test_movies', function (Blueprint $table) {
// カラム名称を戻す.
$table->renameColumn('order_column','director');
});
}
}
変更を反映します。
php artisan migrate
変更前と変更後を載せます。
mysql> DESCRIBE test_movies;
+--------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | | NULL | |
| director | int | NO | | NULL | |
| describe | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+--------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> DESCRIBE test_movies;
+--------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | | NULL | |
| order_column | int | NO | | NULL | |
| describe | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+--------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
テーブルを変更しただけだと、LaravelAdmin画面で見るとカラム名称が変わったのでこんな感じになります。
なんとエラーにはならないのですよ。。。
コントローラを修正する
1."director"を “order_column"に名称を変更
2."Director"を"Sort Order" にラベルを変更
修正箇所は、3箇所ありました。
grid(), detail(), form()メソッド内
FileName: app/Admin/Controllers/TestModelsController.php
修正したら確認してみます。
モデルを修正する
1.参照に以下を追加
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;
2.参照から以下を削除
use Illuminate\Database\Eloquent\Factories\HasFactory;
3.クラスに"implements Sortable"インターフェース追加
4."use HasFactory;"を"use SortableTrait;"に変更
5.グローバル変数に $sortable 定義を追加
FIleName: app/Models/TestMovies.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;
class TestMovies extends Model implements Sortable
{
use SortableTrait;
public $sortable = [
'order_column_name' => 'order_column',
'sort_when_creating' => true,
];
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;
class TestMovies extends Model implements Sortable
{
use HasFactory;
public $sortable = [
'order_column_name' => 'order_column',
'sort_when_creating' => true,
];
}
コントローラを修正する
1. grid()メソッド内のnew Grid後に以下を追加する。
$grid->sortable();
FileName: app/Admin/Controllers/TestModelsController.php
protected function grid()
{
$grid = new Grid(new TestMovies());
$grid->sortable();
修正したら確認してみます。
モデル作ったりコントロール作ったりと盛りだくさんな内容になってしまいました。
お疲れ様でした。
並び替え処理がこれくらいのコーディングで適応できるなら大変助かりますね。
7回に渡って、やってきた紹介したい拡張機能シリーズは、如何だったでしょうか。
読者の皆様に少しでも役立ててもらえればと思います。
それでは、この辺で