#前回
Laravel-admin TODO機能の作成③(grid)
#役割がadministratorの場合の処理
役割によって表示、操作できる内容の修正をします。
###modelを修正
グローバルスコープでユーザー自身としているのをadministratorの場合は解除。
static::addGlobalScope('user_id', function (Builder $builder) {
if (!auth('admin')->user()->isAdministrator()) { //追加
$builder->where('user_id', auth('admin')->user()->id);
} //追加
});
###gridを修正
ユーザー名表示をadministratorの場合のみにします
(ユーザー自身のみの場合に全て自分のユーザー名が表示されるのは邪魔なので)
if (auth('admin')->user()->isAdministrator()) {
$grid->user()->name('ユーザー名')->style('min-width:100px;');
}
###gridのfilterを修正
administratorの場合はユーザー名検索を入れます。
if (auth('admin')->user()->isAdministrator()) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->where('name', 'like', "%{$this->input}%");
});
}, 'ユーザー名');
}
###画面
devユーザーの場合
adminユーザーの場合
#showについて
新参な機能のようで、gridやformに比べるとまだまだ発展途上な感じがします。
リレーション先のデータも表示、編集、削除画面に遷移できるのが良い。
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Todo::findOrFail($id));
$show->id('ID');
$show->user('ユーザー名')->as(function ($user) {
return $user->name;
});
$show->title('タイトル');
$show->detail('詳細');
$show->created_at('Created at');
$show->updated_at('Updated at');
$show->user('ユーザー情報', function ($user) {
$user->setResource('/admin/auth/users');
$user->id('ユーザーID');
$user->name('ユーザー名');
});
return $show;
}
#各画面のheaderとdescriptionについて
表示したい名前を付けるだけです。
↓はindexを修正した場合。
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('TODO一覧')
->description('一覧を表示してます')
->body($this->grid());
}
#ファイル出力について
デフォルトではCSVファイルが出力されます。
エクセル出力にしたい場合は公式
カスタマイズはまたの機会にでも。
#コード
この時点でのソースコード
###コントローラ
<?php
namespace App\Admin\Controllers;
use App\Models\Todo;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use Illuminate\Validation\Rule;
use Encore\Admin\Widgets\Table;
class TodoController extends Controller
{
use HasResourceActions;
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('TODO一覧')
->description('一覧を表示してます')
->body($this->grid());
}
/**
* Show interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function show($id, Content $content)
{
return $content
->header('TODO詳細')
->description('詳細を表示してます')
->body($this->detail($id));
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('TODO編集')
->description('編集を表示してます')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('TODO登録')
->description('登録を表示してます')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Todo);
$grid->id('ID')->modal('情報', function () {
$data = [
[
$this->id,
$this->user->name,
$this->title,
$this->detail,
]
];
return new Table(['ID', 'ユーザー名', 'タイトル', '詳細'], $data);
})->sortable();
if (auth('admin')->user()->isAdministrator()) {
$grid->user()->name('ユーザー名')->style('min-width:100px;');
}
$grid->title('タイトル')->setAttributes(['style' => 'background-color:#ffdbdb;'])->editable();
$grid->detail('詳細')->limit(20)->expand(function () {
return $this->detail;
});
$grid->created_at('Created at')->label('danger');
$grid->updated_at('Updated at')->badge();
$grid->filter(function ($filter) {
$filter->column(1/2, function ($filter) {
$filter->disableIdFilter();
$filter->startsWith('title','タイトル');
$filter->between('created_at', '登録日時')->datetime();
});
$filter->column(1/2, function ($filter) {
$filter->contains('detail','詳細');
if (auth('admin')->user()->isAdministrator()) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->where('name', 'like', "%{$this->input}%");
});
}, 'ユーザー名');
}
});
});
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Todo::findOrFail($id));
$show->id('ID');
$show->user('ユーザー名')->as(function ($user) {
return $user->name;
});
$show->title('タイトル');
$show->detail('詳細');
$show->created_at('Created at');
$show->updated_at('Updated at');
$show->user('ユーザー情報', function ($user) {
$user->setResource('/admin/auth/users');
$user->id('ユーザーID');
$user->name('ユーザー名');
});
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Todo);
$form->text('title', 'タイトル')->rules(function ($form) {
return [
'required',
Rule::unique('todos')->where(function($query) {
$query->where('user_id', auth('admin')->user()->id);
}),
];
})->required(true);
$form->textarea('detail', '詳細')->rules('required');
$form->hidden('user_id');
return $form;
}
public function store()
{
request()->merge(['user_id' => auth('admin')->user()->id]);
return $this->form()->store();
}
public function update($id)
{
request()->merge(['user_id' => auth('admin')->user()->id]);
return $this->form()->update($id);
}
}
###モデル
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Todo extends Model
{
/**
* モデルの「初期起動」メソッド
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::addGlobalScope('user_id', function (Builder $builder) {
if (!auth('admin')->user()->isAdministrator()) {
$builder->where('user_id', auth('admin')->user()->id);
}
});
}
/**
* ユーザーに関連する情報を取得
*/
public function user()
{
return $this->hasOne(config('admin.database.users_model'), 'id', 'user_id');
}
}
#次回
テスト関連をやってみようと思います。