mcpField
B
bagisto-datagrid-development

bagisto-datagrid-development

github.com/bagisto开发13122 次安装2 周前更新
代码仓库

关于 bagisto-datagrid-development

用于构建 Bagisto 管理后台列表页的 DataGrid 开发技能,介绍查询和列配置、控制器与视图接线,以及操作、筛选和导出相关要点。

主要功能

  1. 01DataGrid 子类结构
  2. 02查询构建器与列配置
  3. 03AJAX 控制器和视图接线
  4. 04受 ACL 控制的行操作与批量操作
  5. 05筛选、排序和导出指引

适用场景

  1. 01构建管理后台列表页
  2. 02为网格添加列和筛选器
  3. 03配置行操作或批量操作

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bagisto/agent-skills --skill bagisto-datagrid-development

安装后在 Claude Code 中输入/bagisto-datagrid-development确认已加载。

附带文件actions.mdcolumns.md

详细介绍

DataGrid 开发

管理列表页由一个 DataGrid 子类和三行接线代码组成。 引擎(packages/Webkul/DataGrid)负责分页、搜索、筛选、排序、已保存筛选条件和导出;子类提供查询并描述列。代码库中共有 51 个 DataGrid,应复制最接近的实现,而不是另创一种写法。

四个方法

Webkul\DataGrid\DataGrid 声明了两个抽象方法和两个可选钩子:

方法是否必需用途
prepareQueryBuilder()是返回一个查询构建器,而不是集合
prepareColumns()是每列调用一次 addColumn([...])
prepareActions()否每行的操作,每项都必须经过 ACL 检查
prepareMassActions()否复选框操作,每项都必须经过 ACL 检查

仅在默认值不合适时才覆盖这些可调属性:$primaryColumn(默认为 'id')、$sortColumn、$sortOrder('desc')、$itemsPerPage(10)、$perPageOptions。

写法

class CurrencyDataGrid extends DataGrid
{
    /**
     * Prepare query builder.
     *
     * @return Builder
     */
    public function prepareQueryBuilder()
    {
        return DB::table('currencies')
            ->select('id', 'name', 'code');
    }

    /**
     * Add Columns.
     *
     * @return void
     */
    public function prepareColumns()
    {
        $this->addColumn([
            'index'      => 'name',
            'label'      => trans('admin::app.settings.currencies.index.datagrid.name'),
            'type'       => 'string',
            'searchable' => true,
            'filterable' => true,
            'sortable'   => true,
        ]);
    }

    /**
     * Prepare actions.
     *
     * @return void
     */
    public function prepareActions()
    {
        if (bouncer()->hasPermission('settings.currencies.edit')) {
            $this->addAction([
                'index'  => 'edit',
                'icon'   => 'icon-edit',
                'title'  => trans('admin::app.settings.currencies.index.datagrid.edit'),
                'method' => 'GET',
                'url'    => fn ($row) => route('admin.settings.currencies.edit', $row->id),
            ]);
        }
    }
}

只有当正在编辑的文件原本就对齐时,才对齐 addColumn/addAction 数组中的 =>;Pint 不会强制要求对齐与否,而且代码库中两种写法都有。

接线

控制器在 AJAX 请求时返回 JSON,否则返回视图——同一路由,两种响应:

public function index()
{
    if (request()->ajax()) {
        return datagrid(CurrencyDataGrid::class)->process();
    }

    return view('admin::settings.currencies.index');
}

Blade 端只需一个指向同一路由的标签:

<x-admin::datagrid :src="route('admin.settings.currencies.index')" />

如果类没有继承 DataGrid,datagrid() 就会抛出 InvalidDataGridException,因此类名是唯一的约定。

参考文件

文件适用场景
columns.md列类型、搜索/筛选/排序标志、下拉选项、闭包、联接和 addFilter
actions.md行操作、批量操作、ACL 检查、导出

不可妥协的要求

  • prepareQueryBuilder() 必须返回构建器。 调用 ->get()、->paginate() 或映射为集合,都会破坏分页、筛选和导出,因为引擎会在你返回的查询上追加条件。
  • 查询构建器是唯一应使用 DB:: 的地方。 在 Bagisto 的其他地方都应通过仓库操作;DataGrid 按设计基于查询构建器构建。
  • 每个操作和批量操作都必须用 bouncer()->hasPermission(...) 包裹。 未做权限限制的操作会显示给无权执行该操作的管理员,而 DataGrid 是最容易遗漏这一点的地方。
  • 每个 label 都必须通过 trans() 处理,并将键添加到全部 23 个语言区域中。
  • 联接查询中的每个别名列都需要 addFilter()——参见 columns.md。否则,对该列进行筛选或排序会导致 SQL 列名不明确错误。
  • 对闭包插值的内容进行转义。 单元格通过 v-html 渲染。引擎会先从原始值中移除标签,但不会移除引号,因此放入属性中的值可能会跳出属性范围。参见 columns.md。

必需子技能: 在认定任何更改完成之前,使用 bagisto-change-verification。

评论

支持 Markdown