lupennat / nested-form
该软件包已废弃,不再维护。未建议替代软件包。
Laravel Nova - 嵌套表单
v1.5.0
2023-06-13 09:53 UTC
Requires
- php: ^7.4|^8.0
- laravel/nova: ^4.12
- nova-kit/nova-packages-tool: ^1.3
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
README
此存储库将不再更新,软件包的新版本可在此处找到
要求
php: ^7.4 | ^8
laravel/nova: ^4
安装
composer require lupennat/nested-form
用法
只需将嵌套表单添加到字段中。第一个参数必须是一个现有的 NovaResource 类,第二个参数(可选)必须是在模型中的现有 HasOneOrMany 关系。
嵌套表单默认在详情页、更新页和创建页中可见。嵌套表单在索引页不可用。
namespace App\Nova; use Laravel\Nova\Fields\ID; use Illuminate\Http\Request; use Laravel\Nova\Fields\Text; use Laravel\Nova\Fields\Gravatar; use Laravel\Nova\Fields\Password; // Add use statement here. use Lupennat\NestedForm\NestedForm; class User extends Resource { ... public function fields(Request $request) { return [ ID::make()->sortable(), Gravatar::make(), Text::make('Name') ->sortable() ->rules('required', 'max:255'), Text::make('Email') ->sortable() ->rules('required', 'email', 'max:254') ->creationRules('unique:users,email') ->updateRules('unique:users,email,{{resourceId}}'), Password::make('Password') ->onlyOnForms() ->creationRules('required', 'string', 'min:6') ->updateRules('nullable', 'string', 'min:6'), // Add NestedForm here. NestedForm::make('Posts'), ]; }
依赖关系
嵌套表单支持 Nova dependsOn
。
NestedForm::make('Posts', Post::class) ->dependsOn('name', function(NestedForm $field, NovaRequest $novaRequest, FormData $formData) { if ($formData->name === 'xxx') { $field->min(1)->max(10); } })
它还支持不带回调的简短版本的 dependsOn。
NestedForm::make('Posts', Post::class)->dependsOn('name')
两种语法都会将条件传播到相关资源,您可以在相关资源上添加 HasNestedForm
特性来访问传播的内容。
use Lupennat\Nova\Resource; use Laravel\Nova\Fields\ID; use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\Select; use Laravel\Nova\Fields\Text; use Laravel\Nova\Http\Requests\NovaRequest; use Lupennat\NestedForm\HasNestedForm; class Posts extends Resource { use HasNestedForm; public function fields(Request $request) { return array_filter([ ID::make(), BelongsTo::make(__('User'), 'user', User::class), Select::section(__('Section'), 'section')->options(['sport' => 'Sport', 'news' => 'News'])->rules('required'), Text::title(__('Title'), 'title')->rules('required'), $this->canShowExtra() ? Text::make(__('Extra Field'), 'extra')->hide() : null ]); } protected function canShowExtra() { if ( $this->getNestedFormParentResource() === User::uriKey() && $this->getNestedFormParentContent('name') === 'xxx' ) { return true; } return false; } }
附加选项
函数 | 描述 | 默认 |
---|---|---|
->max(int) |
限制允许的相关资源数量 | 0 |
->min(int) |
最小相关资源数量 | 0 |
->lock() |
禁用添加和删除相关资源 | false |
->prefill(array,bool) |
预填充相关资源与值 | [], false |
->useTabs() |
切换显示模式为选项卡而不是面板 | false |
->activeTab(int) |
通过索引设置默认活动选项卡 | 0 |
->activeTabByHeading(string) |
通过 '标题' 设置默认活动选项卡 | null |
->canDuplicate() |
启用复制资源按钮 | false |
->canRestore() |
在删除资源时启用软删除(仅限vue) | false |
->addText(string) |
添加按钮的文本 | "添加 $resourceName" |
->restoreText(string) |
恢复按钮的文本 | "恢复 $resourceName" |
->removeText(string) |
删除按钮的文本 | "删除 $resourceName" |
->duplicateText(string) |
复制按钮的文本 | "复制 $resourceName" |
->heading(string, boolean) |
定义自定义标题 | [], false |
->separator(string) |
定义标题分隔符 | " . " |
预填充
您可以使用 prefill
方法生成一组默认的相关资源。
预填充仅在创建页面上工作
NestedForm::make('Posts', Post::class) ->prefill([ ['title' => 'first post', 'section' => 'sport'], ['title' => 'second post', 'section' => 'news'], ])
您可以通过第二个布尔参数强制预填充始终遵守预填充项的数量。
NestedForm::make('Posts', Post::class) ->prefill([ ['title' => 'first post', 'section' => 'sport'], ['title' => 'second post', 'section' => 'news'], ], true)
自定义标题
默认情况下,嵌套表单标题为
- 详情页
${resourceName} ${keyName}: ${resource[keyName]}
- 更新页存在
${resourceName} ${keyName}: ${resource[keyName]}
新${index} ${separator} ${resourceName}
- 创建页
${index} ${separator} ${resourceName}
您可以使用资源字段值、定义属性名称,通过 heading
方法指定自定义标题,方法的第二个参数指定标题是否应该是“唯一的”。
当定义了自定义标题时,字段在面板中隐藏,但当用户尝试添加新资源时,将显示一个包含必需字段的模态框;如果为 true,则嵌套表单将检查现有相关资源字段的唯一性。多个字段值将通过定义的分隔符连接。
NestedForm::make('Posts', Post::class) ->heading(['section', 'title'], true) ->separator(' - ')
鸣谢
嵌套表单字段基于原始 Nova Nested Form。