laravel-backpack - 如何访问自定义(非 CRUD)页面上的背包字段?
问题描述
我在背包管理面板中创建了一个自定义页面。此页面是非 CRUD(与任何模型无关)。上面有几种表格,带有日期选择器、选择输入等。所以我试图找到一种方法来使用背包字段来创建这些日期选择器和选择输入。因为在项目中嵌入自定义 js-controls 似乎很尴尬,因为 Backpack 已经有相应的字段。
我想出的唯一解决方案是为随机模型创建一个 crud 控制器,禁用除创建之外的所有操作,使用创建操作视图作为自定义页面(背包字段可用这种方式),最后覆盖 store() 方法 - 以防止在数据库中创建新的模型条目。
那么,是否有正确的方法来访问自定义(非 CRUD)页面上的背包字段?
解决方案
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 功能,真的...
推荐阅读
- javascript - Forse 一个 .class :hover 状态
- laravel - Laravel:两个表单,一个提交按钮
- android-studio - 如何防止在我的对象上使用 kotlin 扩展?
- python - 使用另一个类的 __init__ 值
- tensorflow - Tensorflow 以与输入相同的顺序获取输入
- cloud-foundry - 有没有办法在不存储凭据的情况下从应用程序获取 UAA 访问令牌?
- php - 从数据库中获取用户喜欢的所有帖子
- java - 如何处理网络状态变化的在线媒体播放器(WiFi 或移动数据之间的网络转换)?
- hibernate - Hibernate - 脏检查不适用于@Convert
- scala - 这是什么意思 - 未应用的方法仅在需要函数类型时才转换为函数