如何访问自定义(非 CRUD)页面上的背包字段?

How to access backpack fields on custom (non-CRUD) page?

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

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

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

Backpack 4.x 字段意味着 不能在 CRUD 之外使用,但是你可以 那样做。

选项 A

它们的核心是 Backpack fields are just Blade views,因此 您可以使用 Blade 帮助程序 @include() 加载它们。只需确保传递 blade 文件需要的所有变量即可。我相信 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 field definition in array form.

这种方式是super-simple,但如果你问我,它有一个很大的缺点。字段定义必须 100% 正确和完整,当您使用 addField() 添加字段时,您将失去 Backpack 通常使您的生活更轻松的所有魔法和假设逻辑。这就是为什么在大多数情况下我认为选择选项 B 更方便。

选项 B

与其手动加载每个字段 Blade 视图,不如使用 addField() 添加它们,然后加载所有字段,就像 Backpack 在创建或更新操作中所做的那样:

    @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 功能,真的......