列操作
model-grid内置了很多对于列的操作方法,可以通过这些方法很灵活的操作列数据。
Encore\Admin\Grid\Column对象内置了display()方法来通过传入的回调函数来处理当前列的值,
$grid->column('title')->display(function ($title) {return "<span style='color:blue'>$title</span>";});
在传入的匿名函数中可以通过任何方式对数据进行处理,另外匿名函数绑定了当前列的数据作为父对象,可以在函数中调用当前行的数据:
$grid->first_name();$grid->last_name();// 不存在的`full_name`字段$grid->column('full_name')->display(function () {return $this->first_name . ' ' . $this->last_name;});
value()方法作为display()方法的别名存在
内置方法
model-grid内置了若干方法来帮助你扩展列功能
editable
通过editable.js的帮助,可以让你在表格中直接编辑数据,使用方法如下
$grid->title()->editable();$grid->title()->editable('textarea');$grid->title()->editable('select', [1 => 'option1', 2 => 'option2', 3 => 'option3']);// select 支持传递闭包作为参数,该闭包接收参数为当前行对应的模型$grid->title()->editable('select', function($row) {if ($row->title === 'test') {return ['test1', 'test2'];}return ['test3', 'test4'];});$grid->birth()->editable('date');$grid->published_at()->editable('datetime');$grid->column('year')->editable('year');$grid->column('month')->editable('month');$grid->column('day')->editable('day');
switch
注意:在
grid中对某字段设置了switch,同时需要在form里面对该字段设置同样的switch
快速将列变成开关组件,使用方法如下:
$grid->status()->switch();// 设置text、color、和存储值$states = ['on' => ['value' => 1, 'text' => '打开', 'color' => 'primary'],'off' => ['value' => 2, 'text' => '关闭', 'color' => 'default'],];$grid->status()->switch($states);
switchGroup
注意:在
grid中对某些字段设置了switch,同时需要在form里面对这些字段设置同样的switch
快速将列变成开关组件组,使用方法如下:
$states = ['on' => ['text' => 'YES'],'off' => ['text' => 'NO'],];$grid->column('switch_group')->switchGroup(['hot' => '热门','new' => '最新','recommend' => '推荐','image.show' => '显示图片', // 更新对应关联模型], $states);
select
$grid->options()->select([1 => 'Sed ut perspiciatis unde omni',2 => 'voluptatem accusantium doloremque',3 => 'dicta sunt explicabo',4 => 'laudantium, totam rem aperiam',]);
select 也支持参数为闭包,使用方法和editable的select类似。
radio
$grid->options()->radio([1 => 'Sed ut perspiciatis unde omni',2 => 'voluptatem accusantium doloremque',3 => 'dicta sunt explicabo',4 => 'laudantium, totam rem aperiam',]);
radio 也支持参数为闭包,使用方法和editable的select类似。
checkbox
$grid->options()->checkbox([1 => 'Sed ut perspiciatis unde omni',2 => 'voluptatem accusantium doloremque',3 => 'dicta sunt explicabo',4 => 'laudantium, totam rem aperiam',]);
checkbox 也支持参数为闭包,使用方法和editable的select类似。
image
$grid->picture()->image();//设置服务器和宽高$grid->picture()->image('http://xxx.com', 100, 100);// 显示多图$grid->pictures()->display(function ($pictures) {return json_decode($pictures, true);})->image('http://xxx.com', 100, 100);
label
$grid->name()->label();//设置颜色,默认`success`,可选`danger`、`warning`、`info`、`primary`、`default`、`success`$grid->name()->label('danger');// 接收数组$grid->keywords()->label();
badge
$grid->name()->badge();//设置颜色,默认`success`,可选`danger`、`warning`、`info`、`primary`、`default`、`success`$grid->name()->badge('danger');// 接收数组$grid->keywords()->badge();
扩展列功能
可以通过两种方式扩展列功能,第一种是通过匿名函数的方式。
在app/Admin/bootstrap.php加入以下代码:
use Encore\Admin\Grid\Column;Column::extend('color', function ($value, $color) {return "<span style='color: $color'>$value</span>"});
然后在model-grid中使用这个扩展:
$grid->title()->color('#ccc');
如果列显示逻辑比较复杂,可以通过扩展类来实现。
扩展类app/Admin/Extensions/Popover.php:
<?phpnamespace App\Admin\Extensions;use Encore\Admin\Admin;use Encore\Admin\Grid\Displayers\AbstractDisplayer;class Popover extends AbstractDisplayer{public function display($placement = 'left'){Admin::script("$('[data-toggle=\"popover\"]').popover()");return <<<EOT<button type="button"class="btn btn-secondary"title="popover"data-container="body"data-toggle="popover"data-placement="$placement"data-content="{$this->value}">弹出提示</button>EOT;}}
然后在app/Admin/bootstrap.php注册扩展类:
use Encore\Admin\Grid\Column;use App\Admin\Extensions\Popover;Column::extend('popover', Popover::class);
然后就能在model-grid中使用了:
$grid->desciption()->popover('right');
帮助方法
字符串操作
如果当前里的输出数据为字符串,那么可以通过链式方法调用Illuminate\Support\Str的方法。
比如有如下一列,显示title字段的字符串值:
$grid->title();
在title列输出的字符串基础上调用Str::limit()方法
$grid->title()->limit(30);
调用方法之后输出的还是字符串,所以可以继续调用Illuminate\Support\Str的方法:
$grid->title()->limit(30)->ucfirst();$grid->title()->limit(30)->ucfirst()->substr(1, 10);
数组操作
如果当前列输出的是数组,可以直接链式调用Illuminate\Support\Collection方法。
比如tags列是从一对多关系取出来的数组数据:
$grid->tags();array (0 =>array ('id' => '16','name' => 'php','created_at' => '2016-11-13 14:03:03','updated_at' => '2016-12-25 04:29:35',),1 =>array ('id' => '17','name' => 'python','created_at' => '2016-11-13 14:03:09','updated_at' => '2016-12-25 04:30:27',),)
调用Collection::pluck()方法取出数组的中的name列
$grid->tags()->pluck('name');array (0 => 'php',1 => 'python',),
取出name列之后输出的还是数组,还能继续调用用Illuminate\Support\Collection的方法
$grid->tags()->pluck('name')->map('ucwords');array (0 => 'Php',1 => 'Python',),
将数组输出为字符串
$grid->tags()->pluck('name')->map('ucwords')->implode('-');"Php-Python"
混合使用
在上面两种类型的方法调用中,只要上一步输出的是确定类型的值,便可以调用类型对应的方法,所以可以很灵活的混合使用。
比如images字段是存储多图片地址数组的JSON格式字符串类型:
$grid->images();"['foo.jpg', 'bar.png']"// 链式方法调用来显示多图$grid->images()->display(function ($images) {return json_decode($images, true);})->map(function ($path) {return 'http://localhost/images/'. $path;})->image();
