こんばんは、のるぼるのんです。
前回はlaravel-adminのviewファイルをresourcesディレクトリに移動し、編集できる様にしました。
今回は更に各モデルの一覧画面で使用するviewファイルを変更、個別化できる様にしたいと思います。
前回の内容はこちらを確認してください。
コントローラー追加
Userモデル、usersテーブルを使用して作業したいと思います。
まずはUserControllerを作成します。コンソール上で以下のコマンドを実行します。
1 |
php artisan admin:make UserController --model=App\\User |
コントローラー作成に成功すると、上のコメントが表示されるので、route.php にルーティングを登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php use Illuminate\Routing\Router; Admin::routes(); Route::group([ 'prefix' => config('admin.route.prefix'), 'namespace' => config('admin.route.namespace'), 'middleware' => config('admin.route.middleware'), ], function (Router $router) { $router->get('/', 'HomeController@index')->name('admin.home'); $router->resource('users', UserController::class); // 追加 }); |
作成されたコントローラーの内容を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?php namespace App\Admin\Controllers; use App\User; use Encore\Admin\Controllers\AdminController; use Encore\Admin\Form; use Encore\Admin\Grid; use Encore\Admin\Show; class UserController extends AdminController { /** * Title for current resource. * * @var string */ protected $title = 'App\User'; /** * Make a grid builder. * * @return Grid */ protected function grid() { $grid = new Grid(new User()); $grid->column('id', __('Id')); $grid->column('name', __('Name')); $grid->column('email', __('Email')); $grid->column('email_verified_at', __('Email verified at')); $grid->column('password', __('Password')); $grid->column('remember_token', __('Remember token')); $grid->column('created_at', __('Created at')); $grid->column('updated_at', __('Updated at')); return $grid; } /** * Make a show builder. * * @param mixed $id * @return Show */ protected function detail($id) { $show = new Show(User::findOrFail($id)); $show->field('id', __('Id')); $show->field('name', __('Name')); $show->field('email', __('Email')); $show->field('email_verified_at', __('Email verified at')); $show->field('password', __('Password')); $show->field('remember_token', __('Remember token')); $show->field('created_at', __('Created at')); $show->field('updated_at', __('Updated at')); return $show; } /** * Make a form builder. * * @return Form */ protected function form() { $form = new Form(new User()); $form->text('name', __('Name')); $form->email('email', __('Email')); $form->datetime('email_verified_at', __('Email verified at'))->default(date('Y-m-d H:i:s')); $form->password('password', __('Password')); $form->text('remember_token', __('Remember token')); return $form; } } |
それぞれ、grid()関数で一覧画面を、detail()関数で詳細画面を、form()関数で編集画面を設定しています。
実際には拡張元のAdminController中、index(), show(), edit()がルーティング時にそれぞれ呼び出され、その中でgridなどを呼んでいる形になります。
それではgrid()関数を見ていきましょう。
Grid.phpを確認
改めてgrid()関数を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * Make a grid builder. * * @return Grid */ protected function grid() { $grid = new Grid(new User()); $grid->column('id', __('Id')); $grid->column('name', __('Name')); $grid->column('email', __('Email')); $grid->column('email_verified_at', __('Email verified at')); $grid->column('password', __('Password')); $grid->column('remember_token', __('Remember token')); $grid->column('created_at', __('Created at')); $grid->column('updated_at', __('Updated at')); return $grid; } |
テーブルの初期化や設定値などを記述したGridクラスのインスタンスを作成し、インスタンスに対してカラムやオプションなどを設定していく形です。
今度はGridクラスを実際に見てみましょう。
vendor/encore/laravel-admin/src/Grid.phpになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace Encore\Admin; use Closure; use Encore\Admin\Exception\Handler; use Encore\Admin\Grid\Column; use Encore\Admin\Grid\Concerns; use Encore\Admin\Grid\Displayers; use Encore\Admin\Grid\Exporter; use Encore\Admin\Grid\Exporters\AbstractExporter; use Encore\Admin\Grid\Model; use Encore\Admin\Grid\Row; use Encore\Admin\Grid\Tools; use Encore\Admin\Traits\ShouldSnakeAttributes; use Illuminate\Database\Eloquent\Model as Eloquent; use Illuminate\Database\Eloquent\Relations; use Illuminate\Support\Collection; use Illuminate\Support\Str; use Illuminate\Support\Traits\Macroable; use Jenssegers\Mongodb\Eloquent\Model as MongodbModel; class Grid { // ~~ 省略 ~~ // /** * View for grid to render. * * @var string */ protected $view = 'admin::grid.table'; // ~~ 省略 ~~ // |
この中で$view変数にviewの呼び出し元のファイル名が記載されています。
Grid.phpをオーバーライドして、このファイル名を変更します。
Grid.phpをオーバーライド
Grid.php をオーバーライドしたUserGrid.php を作成し、UserControllerで呼び出します。
ディレクトリは管理しやすいものでお願いします。
app/Admin/Extensions/User/UserGrid.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Admin\Extensions\User; use Closure; use Illuminate\Database\Eloquent\Model as Eloquent; use Encore\Admin\Grid; class UserGrid extends Grid { /** * View for grid to render. * * @var string */ protected $view = 'admin.extensions.users.table'; // ファイル名を変更します /** * Create a new grid instance. * * @param Eloquent $model * @param Closure $builder */ public function __construct(Eloquent $model, Closure $builder = null) { parent::__construct($model, $builder); } } |
resources/admin/extensions/users/table.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<div class="box"> @if(isset($title)) <div class="box-header with-border"> <h3 class="box-title"> {{ $title }}</h3> </div> @endif @if ( $grid->showTools() || $grid->showExportBtn() || $grid->showCreateBtn() ) <div class="box-header with-border"> <div class="pull-right"> {!! $grid->renderColumnSelector() !!} {!! $grid->renderExportButton() !!} {!! $grid->renderCreateButton() !!} </div> @if ( $grid->showTools() ) <div class="pull-left"> {!! $grid->renderHeaderTools() !!} </div> @endif </div> @endif {!! $grid->renderFilter() !!} {!! $grid->renderHeader() !!} <!-- /.box-header --> <div class="box-body table-responsive no-padding"> <table class="table table-hover" id="{{ $grid->tableID }}"> <thead> <tr> @foreach($grid->visibleColumns() as $column) <th {!! $column->formatHtmlAttributes() !!}>{!! $column->getLabel() !!}{!! $column->renderHeader() !!}</th> @endforeach </tr> </thead> @if ($grid->hasQuickCreate()) {!! $grid->renderQuickCreate() !!} @endif <tbody> @if($grid->rows()->isEmpty() && $grid->showDefineEmptyPage()) @include('admin::grid.empty-grid') @endif @foreach($grid->rows() as $row) <tr {!! $row->getRowAttributes() !!}> @foreach($grid->visibleColumnNames() as $name) <td {!! $row->getColumnAttributes($name) !!}> {!! $row->column($name) !!} </td> @endforeach </tr> @endforeach </tbody> {!! $grid->renderTotalRow() !!} </table> </div> {!! $grid->renderFooter() !!} <div class="box-footer clearfix"> {!! $grid->paginator() !!} </div> <!-- /.box-body --> </div> <p> これはusers/table.blade.php です </p> |
UserController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php namespace App\Admin\Controllers; use App\User; use Encore\Admin\Controllers\AdminController; use Encore\Admin\Form; // use Encore\Admin\Grid; // コメントアウト use App\Admin\Extensions\User\UserGrid as Grid; // UserGridの読み込み use Encore\Admin\Show; class UserController extends AdminController { /** * Title for current resource. * * @var string */ protected $title = 'App\User'; /** * Make a grid builder. * * @return Grid */ protected function grid() { $grid = new Grid(new User()); $grid->column('id', __('Id')); $grid->column('name', __('Name')); $grid->column('email', __('Email')); $grid->column('email_verified_at', __('Email verified at')); $grid->column('password', __('Password')); $grid->column('remember_token', __('Remember token')); $grid->column('created_at', __('Created at')); $grid->column('updated_at', __('Updated at')); return $grid; } |
これで作業は完了です、お疲れ様でした。
これで特定の一覧画面の時にjsを仕込んだり、リンクを追加したりが容易になりました。
同様のことがFormでもできるので、次回はそちらを紹介したいと思います。
コメントを書く