royduin/laravel-nova-field-dynamic-select

此包已被废弃,不再维护。未建议替代包。

一个 Laravel Nova 字段。

1.10.0 2022-04-25 11:43 UTC

README

注意

现在这个功能已包含在 Laravel Nova 中: https://nova.laravel.net.cn/docs/resources/fields.html#dependent-fields

用于 Laravel Nova 的动态选择字段

此字段允许您根据其他动态选择字段中的值动态填充选择框的内容。

该字段基于 nova-belongs-to-dependency,但您可以选择自定义值而不是选择模型。

安装

composer require royduin/laravel-nova-field-dynamic-select

用法

类在 Laravel Nova 默认选择的基础上增加了5个特殊方法。

  • dependsOn 可以接受一个列表,其中包含此字段依赖的其他字段。在初始页面加载时,列表将为 null,因此在使用之前请务必检查 null。
  • default 可以接受一个列表,其中包含此字段依赖的其他字段。
  • options 可以是数组或可调用对象。
  • forAction 用于指示动态选择是否在操作中运行。
  • colors(可选)用于选择用于突出显示选项的颜色。接受包含4种不同十六进制颜色的数组
    • highlightBgColor:光标悬停在选项上时的背景颜色
    • highlightTextColor:光标悬停在选项上时的文本颜色
    • selectedHighlightBgColor:光标悬停在所选选项上时的背景颜色
    • selectedHighlightTextColor:光标悬停在所选选项上时的文本颜色

如果它是一个可调用对象,它将接收一个数组,该数组包含第一个参数为所选依赖值,并应返回要在选择字段上显示的项目数组。

示例

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        DynamicSelect::make('Country', 'country')
            ->options(['US' => 'United States', 'UK' => 'United Kingdom'])
            ->rules('required')
            ->colors([
                'highlightBgColor' => '#0f0',
                'highlightTextColor' => '#fff',
                'selectedHighlightBgColor' => '#f00',
                'selectedHighlightTextColor' => '#fff',
            ])
        ,

        DynamicSelect::make('Provider', 'provider')
            ->options(['PR' => 'Premium', 'ST' => 'Standard'])
            ->rules('required')
        ,

        DynamicSelect::make('Product', 'product')
            ->dependsOn(['country', 'provider'])
            ->options(function($values) { 
                if($values['country'] === 'UK' && $values['provider'] === 'PR') {
                    return ['A' => 'Fast shipping', 'B' => 'Normal shipping', 'C' => 'Free shipping'];
                } else {
                    return ['A' => 'Fast shipping', 'B' => 'Normal shipping'];
                }
            })
            ->default(function ($values) {
                if (! $values) {
                    return null;
                }
                if ($values['country'] === 'UK') {
                    return [
                        'label' => 'Normal shipping',
                        'value' => 'B'
                    ];
                }
            })
            ->rules('required')
        ,
    ];
}

在 Nova 操作中使用示例

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        DynamicSelect::make('Country', 'country')
            ->forAction(self::class)
            ->options(['US' => 'United States', 'UK' => 'United Kingdom'])
            ->rules('required')
        ,

        DynamicSelect::make('Provider', 'provider')
            ->forAction(self::class)
            ->options(['PR' => 'Premium', 'ST' => 'Standard'])
            ->rules('required')
        ,

        DynamicSelect::make('Product', 'product')
            ->forAction(self::class)
            ->dependsOn(['country', 'provider'])
            ->options(function($values) { 
                if($values['country'] === 'UK' && $values['provider'] === 'PR') {
                    return ['A' => 'Fast shipping', 'B' => 'Normal shipping', 'C' => 'Free shipping'];
                } else {
                    return ['A' => 'Fast shipping', 'B' => 'Normal shipping'];
                }
            })
            ->rules('required')
        ,
    ];
}