自定义工具

model-grid的头部默认有批量删除刷新两个操作工具,如果有更多的操作需求,model-grid提供了自定义工具的功能,下面的示例添加一个性别分类选择的按钮组工具。

先定义工具类app/Admin/Extensions/Tools/UserGender.php

  1. <?php
  2. namespace App\Admin\Extensions\Tools;
  3. use Encore\Admin\Admin;
  4. use Encore\Admin\Grid\Tools\AbstractTool;
  5. use Illuminate\Support\Facades\Request;
  6. class UserGender extends AbstractTool
  7. {
  8. protected function script()
  9. {
  10. $url = Request::fullUrlWithQuery(['gender' => '_gender_']);
  11. return <<<EOT
  12. $('input:radio.user-gender').change(function () {
  13. var url = "$url".replace('_gender_', $(this).val());
  14. $.pjax({container:'#pjax-container', url: url });
  15. });
  16. EOT;
  17. }
  18. public function render()
  19. {
  20. Admin::script($this->script());
  21. $options = [
  22. 'all' => 'All',
  23. 'm' => 'Male',
  24. 'f' => 'Female',
  25. ];
  26. return view('admin.tools.gender', compact('options'));
  27. }
  28. }

视图admin.tools.gender文件为resources/views/admin/tools/gender.blade.php:

  1. <div class="btn-group" data-toggle="buttons">
  2. @foreach($options as $option => $label)
  3. <label class="btn btn-default btn-sm {{ \Request::get('gender', 'all') == $option ? 'active' : '' }}">
  4. <input type="radio" class="user-gender" value="{{ $option }}">{{$label}}
  5. </label>
  6. @endforeach
  7. </div>

model-grid引入这个工具:


$grid->tools(function ($tools) {
    $tools->append(new UserGender());
});

model-grid定义中接收到gender参数后,做好数据查询就可以了:

if (in_array(Request::get('gender'), ['m', 'f'])) {
    $grid->model()->where('gender', Request::get('gender'));
}

可以参考上面的方式来添加自己的工具。

批量操作

目前默认实现了批量删除操作的功能,如果要关掉批量删除操作:

$grid->tools(function ($tools) {
    $tools->batch(function ($batch) {
        $batch->disableDelete();
    });
});

如果要添加自定义的批量操作,可以参考下面的例子。

下面是扩展一个对文章批量发布的功能:

先定义操作类app/Admin/Extensions/Tools/ReleasePost.php

<?php

namespace App\Admin\Extensions\Tools;

use Encore\Admin\Grid\Tools\BatchAction;

class ReleasePost extends BatchAction
{
    protected $action;

    public function __construct($action = 1)
    {
        $this->action = $action;
    }

    public function script()
    {
        return <<<EOT

$('{$this->getElementClass()}').on('click', function() {

    $.ajax({
        method: 'post',
        url: '/{$this->resource}/release',
        data: {
            _token:LA.token,
            ids: selectedRows(),
            action: {$this->action}
        },
        success: function () {
            $.pjax.reload('#pjax-container');
            toastr.success('操作成功');
        }
    });
});

EOT;

    }
}

看代码的实现,通过click操作发送一个post请求,把选中的行数据id通过数组的形式传给后端接口,后端接口拿到id列表和要修改的状态来更新数据,然后前端刷新页面(pjax reload),并弹出toastr提示操作成功。

model-grid中加入这个批量操作功能:

$grid->tools(function ($tools) {
    $tools->batch(function ($batch) {
        $batch->add('发布文章', new ReleasePost(1));
        $batch->add('文章下线', new ReleasePost(0));
    });
});

这样批量操作下拉按钮下面就会添加两个操作项,最后一步就是添加一个接口来处理批量操作的请求了,接口代码如下:


class PostController extends Controller
{
    ...

    public function release(Request $request)
    {
        foreach (Post::find($request->get('ids')) as $post) {
            $post->released = $request->get('action');
            $post->save();
        }
    }

    ...
}

然后添加路由指向上面的接口:

$router->post('posts/release', 'PostController@release');

这样整个流程就完成了。

自定义导出

model-grid默认只有简单的csv文件的导出功能,如果想要控制导出格式或导出字段,可以用下面的方式自定义导出功能

新建导出类, 比如app/Admin/Extensions/CustomExporter.php

<?php

namespace App\Admin\Extensions;

use Encore\Admin\Grid\Exporters\AbstractExporter;

class CustomExporter extends AbstractExporter
{
    public function export()
    {
        $filename = $this->getTable().'.csv';

        // 这里获取数据
        dd($this->getData());

        // 根据上面的数据拼接出导出数据,
        $output = '';

        // 在这里控制你想输出的格式,或者使用第三方库导出Excel文件
        $headers = [
            'Content-Encoding'    => 'UTF-8',
            'Content-Type'        => 'text/csv;charset=UTF-8',
            'Content-Disposition' => "attachment; filename=\"$filename\"",
        ];

        // 导出文件,
        response(rtrim($output, "\n"), 200, $headers)->send();

        exit;
    }
}

然后在grid中使用:

use App\Admin\Extensions\CustomExporter;

...

$grid->exporter(new CustomExporter());

就好了,导出类的逻辑可参考 CsvExporter.php