表格選擇器使用請參考Dcat文件:
效果:
實現步驟:
app/Admin資料夾下新建 Grid 資料夾:
Grid 資料夾內新建類 RowSelectorCustom 繼承 RowSelector 並重寫 getTitle方法 內容如下:
<?php namespace App\Admin\Grid; use Dcat\Admin\Grid\Tools\RowSelector; use Illuminate\Support\Facades\Storage; class RowSelectorCustom extends RowSelector { // 重寫標題獲取方法 protected function getTitle($row, $id) { // 處理圖片顯示路徑 $path = $row->user_pic; if (url()->isValidUrl($path) || mb_strpos($path, 'data:image') === 0) { $src = $path; } else { $src = Storage::disk(config('admin.upload.disk'))->url($path); } return <<<HTML <div class="show-img-info" style='display: flex;align-items: center;margin-top: 10px'> <img data-action='preview-img' src='{$src}' style='max-width:60px;max-height:60px;cursor:pointer;margin-right: 10px' class='img img-thumbnail'> <span>{$row->nickname}</span> </div> HTML; } }
Grid 資料夾內新建類 GridCustom 繼承 Grid 並重寫 rowSelector 方法 內容如下:
<?php namespace App\Admin\Grid; use Dcat\Admin\Grid; class GridCustom extends Grid { /** * @param \Closure $closure * @return Grid\Tools\RowSelector */ public function rowSelector() { // 修改RowSelector 為 RowSelectorCustom return $this->rowSelector ?: ($this->rowSelector = new RowSelectorCustom($this)); } }
修改\vendor\dcat\laravel-admin\resources\assets\dcat\extra\select-table.js 檔案:
找到renderDefault方法修改為以下內容:// 單選 function renderDefault(selected, self, options) { let box = $(options.container), placeholder = box.find('.default-text'), option = box.find('.option'); // 去除刪除符號重複新增 option.children('.pull-right').remove(); // 刪除原選中資料 option.parents('.select-resource').children('.show-img-info').remove(); var remove = $("<div class='pull-right ' style='font-weight:bold;cursor:pointer'>×</div>"); var label = selected[0]['label']; // 判斷如果服務端返回的label資料帶有html標籤則進行html顯示 if (/<[^>]+>/g.test(label)) { option.parents('.select-resource').append(label); } else { option.text(label) } option.append(remove); remove.on('click', function () { self.setKeys([]); placeholder.removeClass('d-none'); option.addClass('d-none'); // 刪除當前點選的刪除標籤 $(this).remove(); // 判斷如果label是html標籤則刪除新增html if (/<[^>]+>/g.test(label)) { option.parents('.select-resource').children('.show-img-info').remove(); } });
執行靜態資源釋出命令:
php artisan admin:publish
新建表格選擇器渲染類 UsersTable 使用自定義Grid GridCustom 進行表格渲染:
<?php namespace App\Admin\Table; use App\Admin\Grid\GridCustom; use App\Admin\Repositories\User; use Dcat\Admin\Grid; use Dcat\Admin\Grid\LazyRenderable; class UsersTable extends LazyRenderable { public function grid(): Grid { return GridCustom::make(new User(), function (Grid $grid) { $grid->model()->orderByDesc('id'); $grid->column('user_pic', '使用者頭像')->image('', 50, 50); $grid->column('nickname', '使用者暱稱'); $grid->column('phone', '使用者手機號'); $grid->disableActions(); $grid->disableFilterButton(); $grid->filter(function (Grid\Filter $filter) { $filter->panel(); $filter->expand(); $filter->equal('phone', '使用者手機號')->width(4); $filter->like('nickname', '使用者暱稱')->width(4); }); }); } }
使用
在Form 表單中使用selectTable:
下面option中的資料處理是修改在編輯時資料填充的格式/** * Make a form builder. * * @return Form */ protected function form() { return Form::make(new Model(), function (Form $form) { $form->display('id'); $form->selectTable('user_id', '使用者') ->from(UsersTable::make()) ->options(function ($v) { if (!$v) { return []; } $users = User::whereIn('id', Helper::array($v))->get(); if (!$users) { return []; } return $users->transform(function ($item) { $path = $item->user_pic; if (url()->isValidUrl($path) || mb_strpos($path, 'data:image') === 0) { $src = $path; } else { $src = Storage::disk(config('admin.upload.disk'))->url($path); } $item->username = <<<HTML <div class="show-img-info" style='display: flex;align-items: center;margin-top: 10px'> <img data-action='preview-img' src='{$src}' style='max-width:60px;max-height:60px;cursor:pointer;margin-right: 10px' class='img img-thumbnail'> <span>{$item->nickname}</span> </div> HTML; return $item; })->pluck('username', 'id'); }) ->pluck('nickname', 'id') ->required(); }); }
還有另外一種方式為Jquery監聽欄位變化,當欄位值傳送變化時進行ajax請求獲取到資料,然後再把ajax返回的值拼接成html插入到對應的位置
本作品採用《CC 協議》,轉載必須註明作者和本文連結