如何访问自定义(非 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 功能,真的......
我在背包管理面板中创建了一个自定义页面。此页面是非 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 功能,真的......