lupennat/nested-form

该软件包已废弃,不再维护。未建议替代软件包。

Laravel Nova - 嵌套表单

安装量: 10,389

依赖项: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

公开问题: 0

语言:Vue

v1.5.0 2023-06-13 09:53 UTC

This package is auto-updated.

Last update: 2023-09-26 16:12:18 UTC


README

此存储库将不再更新,软件包的新版本可在此处找到

  1. 要求
  2. 安装
  3. 用法
  4. 依赖关系
  5. 附加选项
    1. 预填充
    2. 自定义标题
  6. 鸣谢

要求

  • 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