列操作

model-grid内置了很多对于列的操作方法,可以通过这些方法很灵活的操作列数据。

Encore\Admin\Grid\Column对象内置了display()方法来通过传入的回调函数来处理当前列的值,

  1. $grid->column('title')->display(function ($title) {
  2. return "<span style='color:blue'>$title</span>";
  3. });

在传入的匿名函数中可以通过任何方式对数据进行处理,另外匿名函数绑定了当前列的数据作为父对象,可以在函数中调用当前行的数据:

  1. $grid->first_name();
  2. $grid->last_name();
  3. // 不存在的`full_name`字段
  4. $grid->column('full_name')->display(function () {
  5. return $this->first_name . ' ' . $this->last_name;
  6. });

value()方法作为display()方法的别名存在

内置方法

model-grid内置了若干方法来帮助你扩展列功能

editable

通过editable.js的帮助,可以让你在表格中直接编辑数据,使用方法如下

  1. $grid->title()->editable();
  2. $grid->title()->editable('textarea');
  3. $grid->title()->editable('select', [1 => 'option1', 2 => 'option2', 3 => 'option3']);
  4. $grid->birth()->editable('date');
  5. $grid->published_at()->editable('datetime');
  6. $grid->column('year')->editable('year');
  7. $grid->column('month')->editable('month');
  8. $grid->column('day')->editable('day');

switch

快速将列变成开关组件,使用方法如下:

  1. $grid->status()->switch();
  2. // 设置text、color、和存储值
  3. $states = [
  4. 'on' => ['value' => 1, 'text' => '打开', 'color' => 'primary'],
  5. 'off' => ['value' => 2, 'text' => '关闭', 'color' => 'default'],
  6. ];
  7. $grid->status()->switch($states);

switchGroup

快速将列变成开关组件组,使用方法如下:

  1. $states = [
  2. 'on' => ['text' => 'YES'],
  3. 'off' => ['text' => 'NO'],
  4. ];
  5. $grid->column('switch_group')->switchGroup([
  6. 'hot' => '热门',
  7. 'new' => '最新'
  8. 'recommend' => '推荐',
  9. ], $states);

select

  1. $grid->options()->select([
  2. 1 => 'Sed ut perspiciatis unde omni',
  3. 2 => 'voluptatem accusantium doloremque',
  4. 3 => 'dicta sunt explicabo',
  5. 4 => 'laudantium, totam rem aperiam',
  6. ]);

radio

  1. $grid->options()->radio([
  2. 1 => 'Sed ut perspiciatis unde omni',
  3. 2 => 'voluptatem accusantium doloremque',
  4. 3 => 'dicta sunt explicabo',
  5. 4 => 'laudantium, totam rem aperiam',
  6. ]);

checkbox

  1. $grid->options()->checkbox([
  2. 1 => 'Sed ut perspiciatis unde omni',
  3. 2 => 'voluptatem accusantium doloremque',
  4. 3 => 'dicta sunt explicabo',
  5. 4 => 'laudantium, totam rem aperiam',
  6. ]);

image

  1. $grid->picture()->image();
  2. //设置服务器和宽高
  3. $grid->picture()->image('http://xxx.com', 100, 100);
  4. // 显示多图
  5. $grid->pictures()->display(function ($pictures) {
  6. return json_decode($pictures, true);
  7. })->image('http://xxx.com', 100, 100);

label

  1. $grid->name()->label();
  2. //设置颜色,默认`success`,可选`danger`、`warning`、`info`、`primary`、`default`、`success`
  3. $grid->name()->label('danger');
  4. // 接收数组
  5. $grid->keywords()->label();

badge

  1. $grid->name()->badge();
  2. //设置颜色,默认`success`,可选`danger`、`warning`、`info`、`primary`、`default`、`success`
  3. $grid->name()->badge('danger');
  4. // 接收数组
  5. $grid->keywords()->badge();

扩展列功能

可以通过两种方式扩展列功能,第一种是通过匿名函数的方式。

app/Admin/bootstrap.php加入以下代码:

  1. use Encore\Admin\Grid\Column;
  2. Column::extend('color', function ($value, $color) {
  3. return "<span style='color: $color'>$value</span>"
  4. });

然后在model-grid中使用这个扩展:

  1. $grid->title()->color('#ccc');

如果列显示逻辑比较复杂,可以通过扩展类来实现。

扩展类app/Admin/Extensions/Popover.php:

  1. <?php
  2. namespace App\Admin\Extensions;
  3. use Encore\Admin\Admin;
  4. use Encore\Admin\Grid\Displayers\AbstractDisplayer;
  5. class Popover extends AbstractDisplayer
  6. {
  7. public function display($placement = 'left')
  8. {
  9. Admin::script("$('[data-toggle=\"popover\"]').popover()");
  10. return <<<EOT
  11. <button type="button"
  12. class="btn btn-secondary"
  13. title="popover"
  14. data-container="body"
  15. data-toggle="popover"
  16. data-placement="$placement"
  17. data-content="{$this->value}"
  18. >
  19. 弹出提示
  20. </button>
  21. EOT;
  22. }
  23. }

然后在app/Admin/bootstrap.php注册扩展类:

  1. use Encore\Admin\Grid\Column;
  2. use App\Admin\Extensions\Popover;
  3. Column::extend('popover', Popover::class);

然后就能在model-grid中使用了:

  1. $grid->desciption()->popover('right');

帮助方法

字符串操作

如果当前里的输出数据为字符串,那么可以通过链式方法调用Illuminate\Support\Str的方法。

比如有如下一列,显示title字段的字符串值:

  1. $grid->title();

title列输出的字符串基础上调用Str::limit()方法

  1. $grid->title()->limit(30);

调用方法之后输出的还是字符串,所以可以继续调用Illuminate\Support\Str的方法:

  1. $grid->title()->limit(30)->ucfirst();
  2. $grid->title()->limit(30)->ucfirst()->substr(1, 10);

数组操作

如果当前列输出的是数组,可以直接链式调用Illuminate\Support\Collection方法。

比如tags列是从一对多关系取出来的数组数据:

  1. $grid->tags();
  2. array (
  3. 0 =>
  4. array (
  5. 'id' => '16',
  6. 'name' => 'php',
  7. 'created_at' => '2016-11-13 14:03:03',
  8. 'updated_at' => '2016-12-25 04:29:35',
  9. ),
  10. 1 =>
  11. array (
  12. 'id' => '17',
  13. 'name' => 'python',
  14. 'created_at' => '2016-11-13 14:03:09',
  15. 'updated_at' => '2016-12-25 04:30:27',
  16. ),
  17. )

调用Collection::pluck()方法取出数组的中的name

  1. $grid->tags()->pluck('name');
  2. array (
  3. 0 => 'php',
  4. 1 => 'python',
  5. ),

取出name列之后输出的还是数组,还能继续调用用Illuminate\Support\Collection的方法

  1. $grid->tags()->pluck('name')->map('ucwords');
  2. array (
  3. 0 => 'Php',
  4. 1 => 'Python',
  5. ),

将数组输出为字符串

  1. $grid->tags()->pluck('name')->map('ucwords')->implode('-');
  2. "Php-Python"

混合使用

在上面两种类型的方法调用中,只要上一步输出的是确定类型的值,便可以调用类型对应的方法,所以可以很灵活的混合使用。

比如images字段是存储多图片地址数组的JSON格式字符串类型:

  1. $grid->images();
  2. "['foo.jpg', 'bar.png']"
  3. // 链式方法调用来显示多图
  4. $grid->images()->display(function ($images) {
  5. return json_decode($images, true);
  6. })->map(function ($path) {
  7. return 'http://localhost/images/'. $path;
  8. })->image();