formfeed-uk/nova-dependable-panel
一个充当分组 dependsOn 功能面板的 Laravel Nova 字段
Requires
- php: ^7.3|^8.0
- formfeed-uk/nova-subfield-dependson: ^2.0.0
- laravel/nova: ^4.0
- nova-kit/nova-packages-tool: ^1.0
README
此Laravel Nova包添加了面板,允许分组 dependsOn 功能
Dusk 测试仓库: https://github.com/Formfeed-UK/nova-dependable-panel-tests
要求
php: ^7.3|^8.0
laravel/nova: ^4.0
功能
- 将此面板内所有 fields 的 dependsOn 请求合并为一个请求
- 根据 dependsOn 函数隐藏/显示整个面板
- 根据 dependsOn 函数更改面板内的字段
- 为面板内所有字段创建批量 dependsOn 函数,(在字段级别覆盖)
- 与 Nova 选项卡兼容
- 与 Nova 可扩展内容的分支兼容,允许在布局组内使用 dependsOn 字段
- 字段可以添加到现有面板或分离到新的面板
注意,此包是字段的扩展,而不是面板,但是当使用 separatePanel
方法时,它可以充当面板。这是为了在使用现有面板的字段时提供更多灵活性。
安装
使用 composer 将包安装到使用 Nova 的 Laravel 应用程序中
composer require formfeed-uk/nova-dependable-panel
使用方法
基本用法
基于 dependsOn 函数隐藏整个面板
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), DependablePanel::make('Panel Title', [ Text::make('Field 1'), Text::make('Field 2'), ]) ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $panel->hide(); } }), ]; }
面板内所有字段的单个 dependsOn 请求
所有文本字段的 dependsOn 请求将使用 singleRequest
方法发送为一个请求。这有助于减少大型表单上的请求数量,并提高用户体验,因为字段同时更改。
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ DependablePanel::make('Panel Title', [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), Text::make('Hide Field 1') ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->hide(); } }), Text::make('Hide Field 2') ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->hide(); } }), Text::make('Show Field 3') ->hide() ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->show(); } }), Text::make('Show Field 4') ->hide() ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->show(); } }), ]) ->singleRequest(true); ]; }
为所有包含字段批量 dependsOn 功能
您还可以使用 applyToFields
方法为面板内的所有字段批量 dependsOn 功能。例如,如果您需要所有字段都变为只读。这可以在字段级别进行覆盖。
注意:第一个参数应该是 Field
类型,以确保函数可以应用于面板内的所有字段,无论其类型如何。
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ DependablePanel::make('Panel Title', [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), Text::make('Field 1'), Text::make('Field 2'), Text::make('Field 3') ->dependsOn(['select'], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->readOnly(false); } }) ]) ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) { $panel->applyToFields(function (Field $field, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $field->readOnly(); } }); }), ]; }
分离面板
Nova Dependable Panel 中的字段可以是任何其他面板的一部分(默认),或者可以使用 separatePanel
方法分离到另一个面板。
此面板将使用 DependablePanel 的第一个参数作为其面板名称。
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ DependablePanel::make('Panel Title', [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), Text::make('Field 1'), Text::make('Field 2'), Text::make('Field 3') ]) ->separatePanel(true) ]; }
根据 dependsOn 更改面板内的字段
而不是隐藏/显示字段,您可以使用 fields
方法更改字段本身。注意,此功能需要 singleRequest
正确运行。
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), DependablePanel::make('Panel Title', [ Text::make('Field 1'), Text::make('Field 2'), ]) ->singleRequest(true) ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $panel->fields([ Text::make('Field 3'), Text::make('Field 4'), ]); } }), ]; }
注意:如果通过 fields
方法添加的字段也定义了 dependsOn,并且您希望在字段首次挂载时正确应用这些 dependsOn 混合,则应在面板的 dependsOn
函数中包含它们依赖的字段。
以下示例中,如果勾选了“只读”复选框,然后将选择项更改为“选项 1”,为了使这些字段在挂载时为只读,您可以看到“readonly”需要包含在面板的 dependsOn
函数中。
use FormFeed\DependablePanel\DependablePanel; public function fields(NovaRequest $request) { return [ Select::make('Select', 'select')->options([ 'option1' => 'Option 1', 'option2' => 'Option 2', ]), Boolean::make('Readonly'), DependablePanel::make('Panel Title', [ Text::make('Field 1'), Text::make('Field 2'), ]) ->singleRequest(true) ->dependsOn(["select", "readonly"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) { if ($formData['select'] == "option1") { $panel->fields([ Text::make('Field 3') ->dependsOn(["readonly"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['readonly']) { $field->readonly(); } }), Text::make('Field 4') ->dependsOn(["readonly"], function (Text $field, NovaRequest $request, FormData $formData) { if ($formData['readonly']) { $field->readonly(); } }), ]); } }), ]; }
已知问题
- 在
dependsOn
函数中不能分离/合并面板,这只能在页面加载时设置一次。 - 当通过面板的
dependsOn
中的Fields
方法在不同字段集之间切换时,对于已在数据库中存储了该资源的值的字段,更新表单中的更改值将不会持久化。 - Nova 的布尔字段由于其在为 null 时被设置为 false 而表现不符合预期,这意味着由可信赖面板更改的布尔字段将变为 false,这并不是一个好的用户体验。一个中间件修复即将到来,但在此期间,建议您在项目中扩展布尔字段并执行以下覆盖:
protected function resolveDefaultValue(NovaRequest $request) { return Field::resolveDefaultValue($request); }
许可
Nova Dependable Panel 是开源软件,遵循 MIT 许可协议。