Grid

Grid 用于生成列表页面,在保证简单接口的前提下,一如既往的强大。

grid-example

Basic

$grid = \Lego::grid($query);

$grid->add('id', 'ID'));
$grid->add('summary', '摘要');
$grid->add('billing_date|date', '账单日');
$grid->add('fen|fen2yuan', '金额(元)');
$grid->add('receiver.name', '接收人');
$grid->add('paid_at', '付款时间');
$grid->add('created_at', '创建时间');
$grid->paginate(100)->orderBy('id', true); // order by id desc

return $grid->view('view-file', compact('filter', 'grid'));

insert to special location

$grid->after('id')->add('column', 'Description');

remove

$grid->remove('id');
$grid->remove('paid_at', 'created_at');
$grid->remove(['paid_at', 'created_at']);

set default value

$grid->add('column', 'Description')->default('default value');

add button

$grid->addLeftTopButton('new', route('...'));

Responsive view

Responsive view is enabled by default, you can disabled it in config file lego.php,
In addition , you can call responsive() method to enable it for current instance.

Pipe

管道,可以通过管道单元格的原始值进行二次处理,lego 内置了一些常用管道,例如字符串截断、日期格式等,同时也支持传入自定义的 Closure ,可用于进行更复杂的处理。

pipe 有两种调用方式

1、使用管道符号 |

  $grid->add('name|trim|strip', 'Name');  

2、调用 pipe() 方法

  $grid->add('name')->pipe('trim')

Available pipes

Closure Pipe

传入 pipe() 的 Closure 最多支持接收三个参数:

$grid->add('name', 'Name')

    ->pipe(function ($name) {
        return strtoupper($name);
    })

    ->pipe(function ($name, City $city) {
        /**
        * $city is the model of current row
        */
        return $name . '(' . $city->name .')';
    })

    ->pipe(function ($name, City $city, Cell $cell) {
        /**
        * $cell is instanceof \Lego\Widget\Grid\Cell
        * 
        * $cell->name() === 'name'; // Important: NO pipe name
        * $cell->description() === 'Name';
        * $cell->getOriginalValue();
        */
        return $name;
    });

Self-Defined Pipe

使用者可以继承 \Lego\Widget\Grid\Pipes 实现自己的 Pipes ,然后将其注册到 lego 的配置文件的 widgets.grid.pipes 数组中,这样在 Grid 就可以使用 | 引入 pipe。

下面示例创建了一个用于翻译的 pipes 类,其中所有以 handle 开头的成员函数将会被识别为可以直接使用的 pipe

\Lego\Widget\Grid\Pipes 有三个成员函数,用于获取管道需要的数据:

class Pipes extends \Lego\Widget\Grid\Pipes
{
    pubilc function handleUpper()
    {
        return strtoupper($this->value());
    }

    public function handleTrans2en()
    {
        return $this->data()->getAttribute(
            $this->cell()->name() . 'en'
        );
    }
}
$grid->add('name|trans2en', 'Name');

Tag

给特定列按内容添加标签,例如用在状态列,方便根据颜色快速定位数据行。

$grid->add('status', 'Status')
    ->tag([
        'enable' => TagStyles::SUCCESS,
        'disable' => TagStyles::DANGER,
        '*' => TagStyles::DEFAULT,
    ])

效果如图: tag

format()

对当前单元格的值进行简单的拼接或包装。有些时候我们需要在一列中显示由多个属性组成的内容,在此之前我们可以使用 Pipe + Closure 实现,现在可以使用更简单的 format 实现。

$grid->add('name', 'Name')
    ->format('{name} ({gender})'); // 示例显示: 张三 (男)

相当于:

$grid->add('name', 'Name')
    ->pipe(function ($_, $model) {
        return sprintf('%s (%s)', $model->name, $model->gender);
    });

format 中也支持读取 Relation 的值

->foramt('{name} {country.name}')

给当前单元格内容添加链接。link() 的第一个参数会使用 format() 同样方式进行解析,即可以在链接中使用属性占位符。

$grid->add('id', 'Edit')
    ->link('https://example.com/edit/{id}');

same as

$grid->add('id', 'Edit')
    ->pipe(function ($id, $model) {
        return sprintf(
            '<a href="%s" target="_blank">%s</a>',
            'https://example.com/edit/' . $id,
            $id
        );
    });

Export as Excel (.xls)

Simple

$grid->export('filename');

如上调用后,会在表格左上角添加一个导出按钮: grid-export

Exporting callback

$grid->export('filename', function (Grid $grid) {
    $grid->paginate(1000); // export more
})

批处理操作

一键批处理

$grid->addBatch('批量删除')
    ->each(function (Advance $advance) {
        $advance->delete();
    });
$grid->addBatch('汇总')
    ->handle(function (Collection $advances) {
        return Lego::message('共 ' . $advances->sum('amount') . ' 元');
    });

带确认信息的批处理

$grid->addBatch('批量删除')
    ->message('确认删除?')
    ->each(function (Advance $advance) {
        $advance->delete();
    });

带动态确认信息的批处理

$grid->addBatch('批量删除')
    ->message(function (Collection $advances) {
        return "确认删除 {$advances->count()} 条记录?"
    })
    ->each(function (Advance $advance) {
        $advance->delete();
    });

带表单的批处理

$grid->addBatch('变更状态')
    ->form(function (Form $form) {
        $form->addSelect('status')->values('已付款', '作废')->required();
    })
    ->action(function (Advance $advance, Form $form) {
        $advance->status = $form->field('status')->getNewValue();
        $advance->save();
    });

Tips: 在新 tab、新窗口发起批处理

$grid->addBatch(...)->openInNewTab();
$grid->addBatch(...)->openInPopup($width = ..., $height = ...);
$grid->addBatch(...)->resetOpenTarget()