首页 > 解决方案 > 如何访问自定义(非 CRUD)页面上的背包字段?

问题描述

我在背包管理面板中创建了一个自定义页面。此页面是非 CRUD(与任何模型无关)。上面有几种表格,带有日期选择器、选择输入等。所以我试图找到一种方法来使用背包字段来创建这些日期选择器和选择输入。因为在项目中嵌入自定义 js-controls 似乎很尴尬,因为 Backpack 已经有相应的字段。

我想出的唯一解决方案是为随机模型创建一个 crud 控制器,禁用除创建之外的所有操作,使用创建操作视图作为自定义页面(背包字段可用这种方式),最后覆盖 store() 方法 - 以防止在数据库中创建新的模型条目。

那么,是否有正确的方法来访问自定义(非 CRUD)页面上的背包字段?

标签: laravel-backpack

解决方案


Backpack 4.x 字段不打算在 CRUD 之外使用,但您可以这样做。

选项 A

Backpack 字段的核心是Blade 视图,因此您可以使用 Blade 助手加载它们@include()。只要确保传递刀片文件所需的所有变量。我相信 99% 的字段将是一个$field和一个$crud变量,所以这将起作用:

    @php
        // set the CRUD model to something (anything)
        // but ideally it'd be the model of the entity that has the form
        $crud = app()->make('crud');
        $crud->setModel(\App\Models\Monster::class);
    @endphp

    @include('crud::fields.number', [
        'crud' => $crud,
        'field' => [
            'name' => 'price',
            'label' => 'Price',
            'prefix' => '$'
        ]
    ])

这样,您只需加载您实际需要的位(输入),而无需 CrudController 的开销。您可以将表单指向您的自定义控制器并自己进行保存。您需要传递的$field数组形式的 Backpack 字段定义

这种方式非常简单,但如果你问我,它有一个很大的缺点。字段定义必须 100% 正确和完整,当您使用addField(). 这就是为什么在大多数情况下,我认为使用选项 B 更方便。

选项 B

不用手动加载每个字段 Blade 视图,而是使用 添加它们addField(),然后像​​ Backpack 在 Create 或 Update 操作中那样加载它们:

    @php
        $crud = app()->make('crud');
        $crud->setModel(\App\Models\Monster::class);
        $crud->addField([
            'name' => 'price',
            'label' => 'Price',
            'prefix' => '$'
        ]);
    @endphp

    <form method="post">
        @include('crud::form_content', [ 'fields' => $crud->fields(), 'action' => 'create' ])
    </form>

以上将产生如下输出: 在此处输入图像描述

第二个选项的好处是您可以“忘记”在字段定义中提及内容,Backpack 会假设它,您可以使用流畅的语法,您可以使用大多数 Backpack 功能,真的...


推荐阅读