thiktak/filament-nested-builder-form

FilamentPHP 插件 - 嵌套构建表单组件

v1.0.1 2023-09-14 21:01 UTC

README

Preview

嵌套构建表单(Filament v3 表单)

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Filament V3 表单插件。为嵌套构建添加新功能。

安装

您可以通过 composer 安装此包

composer require thiktak/filament-nested-builder-form

用法

在任意表单中

  1. 调用 NestedBuilder 而不是 Builder
  2. 将所有 Builder 配置放入 nestedConfiguration(Closure) 内。
  3. 使用 nestedSchema(Closure) 代替 schema(Closure | array)

使用 NestedSubBuilder$builder->getLevel() 来了解您所在的位置(级别 1 到 n)

注意

  • NestedBuilder 与 Builder 一样,使用数组/json 数据。
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

        NestedBuilder::make('array_configuration')
            // Add configuration to Builder & sub-builder
            ->nestedConfiguration(function (NestedSubBuilder $builder) {
                // Apply only for the root level
                $builder->blockNumbers($builder->getLevel() == 1);

                // Apply for all others levels
                $builder->columnSpanFull(); // full width
            })

            // Replace schema() by nestedSchema
            ->nestedSchema(function (NestedSubBuilder $builder) { // Closure is mandatory
                return [
                    Block::make('group')
                        ->schema([
                            Select::make('title')
                                ->required(),

                            // Call builder importer and call it children
                            $builder->importNestedBlocks('children'),
                        ]),

                    Block::make('rule')
                        ->schema([
                            TextInput::make('field')
                                ->required(),
                        ])
                ];
            });

image

示例

此包的一个具体示例,允许您创建嵌套 AND/OR 字段/条件/值,就像复杂的分组 SQL 查询。

use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

        NestedBuilder::make('array_configuration')
            ->nestedConfiguration(function (NestedSubBuilder $builder) {
                $builder->blockNumbers($builder->getLevel() == 1);
                $builder->columnSpanFull(); // full width
            })
            ->nestedSchema(function (NestedSubBuilder $builder) {
                return [
                    Block::make('group')
                        ->label(sprintf('Group (%s)', $builder->getLevel()))
                        ->schema([
                            Select::make('condition')
                                ->options(['and' => 'AND', 'or' => 'OR'])
                                ->default('and')
                                ->required(),

                            $builder->importNestedBlocks('children'),
                        ])
                        ->columns(1),

                    Block::make('rule')
                        ->label(sprintf('Rule (%s)', $builder->getLevel()))
                        ->schema([
                            TextInput::make('field')
                                ->required()
                                ->columnSpan(2),

                            Select::make('sign')
                                ->options(['=', '<>', '>', '<', 'in(,)'])
                                ->default('=')
                                ->required(),

                            TextInput::make('value')
                                ->columnSpan(3),
                        ])
                        ->columns(6)
                ];
            });

image

此包的高级用法示例

image

它是如何工作的?

您可以通过几行代码实现相同的行为。

  1. 创建一个带有您的构建器的函数 ($nested = fn($builder) => [...];)
  2. 在您的模式中,传递一个在 lambda 函数内部调用自己的函数 (fn() => $nested($nested)).
  3. 在您的构建器函数中,添加具有相同逻辑的新 Builder (Builder::make()->schema(fn() => $builder($builder)))

示例

use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

    public static function form(Form $form): Form
    {
        $nested = function ($builder) {
            return [
                Block::make('group')
                    ->schema([
                        Select::make('condition')
                            ->options(['and' => 'AND', 'or' => 'OR'])
                            ->default('and')
                            ->required(),

                        \Filament\Forms\Components\Builder::make('children')
                            ->schema(fn () => $builder($builder))
                    ])
                    ->columns(1),

                Block::make('rule')
                    ->schema([
                        TextInput::make('field')
                            ->required()
                            ->columnSpan(2),

                        Select::make('sign')
                            ->options(['=', '<>', '>', '<', 'in(,)'])
                            ->default('=')
                            ->required(),

                        TextInput::make('value')
                            ->columnSpan(3),
                    ])
                    ->columns(6)
            ];
        };

        
        return $form
            ->schema([
                \Filament\Forms\Components\Builder::make('array_configuration')
                    ->schema(fn () => $nested($nested))
            ]);
    }

如果您想实现一个丰富的 SQL 选择器 & 查询构建器,请使用 thiktak/filament-nested-builder-form

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全漏洞

请查看 我们的安全策略 了解如何报告安全漏洞。

致谢

许可

MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。