如何生成动态 Laravel Nova select 字段?
How to generate dynamic Laravel Nova select field?
我正在尝试创建动态 Laravel Nova select 字段,但遇到了一些问题。
我的配置文件中有一个数组,我试图用它来生成这些值。这是我的代码:
Select::make('Options')->options(function () {
$options = config('options.options');
$optionsArray = [];
foreach($options as $index => $option) {
$optionsArray[$index] = $option;
}
return [
$optionsArray
];
}),
但是,这似乎不起作用。 $optionsArray
填充了我想要的所有值,但 select 字段在前端的 Nova 中没有选项。我怎样才能使这项工作?
对于其他为此苦苦挣扎的人,解决方案是在返回时将 $optionsArray
包装在 array_filter
方法中,如下所示:
return array_filter($optionsArray);
您当前的解决方案比实际需要的更复杂。考虑以下代码片段,它是您的解决方案的通用版本:
$input = [
'a' => 123,
'b' => 234,
'c' => 'ABC'
];
$output = [];
foreach($input as $index => $option) {
$output[$index] = $option;
}
转储 $input
和 $output
会产生相同的结果:
array(3) {
["a"]=>
int(123)
["b"]=>
int(234)
["c"]=>
string(3) "ABC"
}
array(3) {
["a"]=>
int(123)
["b"]=>
int(234)
["c"]=>
string(3) "ABC"
}
这意味着我们可以简单地省略这一步,从而得到以下中间解决方案:
Select::make('Options')->options(function () {
return config('options.options');
})
因为 Select
对象上的 ->options($opts)
函数接受一个选项数组作为回调函数的替代,我们可以简单地将 config('options.options')
传递给它。为了确保代码在缺少配置的情况下不会中断,我们还可以将 []
作为第二个参数传递给默认值:
Select::make('Options')->options(config('options.options', []))
如果您将嵌套数组传递给 ->options($opts)
方法(或 return 来自传递的回调),您将创建 select 选项组。如果您想对 select 框的选项进行分组,这很方便,例如按国家/地区对城市进行分组,如下所示:
Austria
Vienna
Bregenz
Germany
Berlin
Hamburg
United States
New York
Los Angeles
Detroit
为此,您需要将选项设置为以下形式的数组,其中数组键用作内部存储值并且可以自由更改:
[
'vienna' => ['label' => 'Vienna', 'group' => 'Austria'],
'bregenz' => ['label' => 'Bregenz', 'group' => 'Austria'],
'berlin' => ['label' => 'Berlin', 'group' => 'Germany'],
'hamburg' => ['label' => 'Hamburg', 'group' => 'Germany'],
'new_york' => ['label' => 'New York', 'group' => 'United States'],
'los_angeles' => ['label' => 'Los Angeles', 'group' => 'United States'],
'detroit' => ['label' => 'Detroit', 'group' => 'United States'],
]
通过在回调中 return 之前对选项使用 array_filter($opts)
,您将删除 null
的选项。这仅在具有动态选项的动态环境中才有意义。
我正在尝试创建动态 Laravel Nova select 字段,但遇到了一些问题。
我的配置文件中有一个数组,我试图用它来生成这些值。这是我的代码:
Select::make('Options')->options(function () {
$options = config('options.options');
$optionsArray = [];
foreach($options as $index => $option) {
$optionsArray[$index] = $option;
}
return [
$optionsArray
];
}),
但是,这似乎不起作用。 $optionsArray
填充了我想要的所有值,但 select 字段在前端的 Nova 中没有选项。我怎样才能使这项工作?
对于其他为此苦苦挣扎的人,解决方案是在返回时将 $optionsArray
包装在 array_filter
方法中,如下所示:
return array_filter($optionsArray);
您当前的解决方案比实际需要的更复杂。考虑以下代码片段,它是您的解决方案的通用版本:
$input = [
'a' => 123,
'b' => 234,
'c' => 'ABC'
];
$output = [];
foreach($input as $index => $option) {
$output[$index] = $option;
}
转储 $input
和 $output
会产生相同的结果:
array(3) {
["a"]=>
int(123)
["b"]=>
int(234)
["c"]=>
string(3) "ABC"
}
array(3) {
["a"]=>
int(123)
["b"]=>
int(234)
["c"]=>
string(3) "ABC"
}
这意味着我们可以简单地省略这一步,从而得到以下中间解决方案:
Select::make('Options')->options(function () {
return config('options.options');
})
因为 Select
对象上的 ->options($opts)
函数接受一个选项数组作为回调函数的替代,我们可以简单地将 config('options.options')
传递给它。为了确保代码在缺少配置的情况下不会中断,我们还可以将 []
作为第二个参数传递给默认值:
Select::make('Options')->options(config('options.options', []))
如果您将嵌套数组传递给 ->options($opts)
方法(或 return 来自传递的回调),您将创建 select 选项组。如果您想对 select 框的选项进行分组,这很方便,例如按国家/地区对城市进行分组,如下所示:
Austria
Vienna
Bregenz
Germany
Berlin
Hamburg
United States
New York
Los Angeles
Detroit
为此,您需要将选项设置为以下形式的数组,其中数组键用作内部存储值并且可以自由更改:
[
'vienna' => ['label' => 'Vienna', 'group' => 'Austria'],
'bregenz' => ['label' => 'Bregenz', 'group' => 'Austria'],
'berlin' => ['label' => 'Berlin', 'group' => 'Germany'],
'hamburg' => ['label' => 'Hamburg', 'group' => 'Germany'],
'new_york' => ['label' => 'New York', 'group' => 'United States'],
'los_angeles' => ['label' => 'Los Angeles', 'group' => 'United States'],
'detroit' => ['label' => 'Detroit', 'group' => 'United States'],
]
通过在回调中 return 之前对选项使用 array_filter($opts)
,您将删除 null
的选项。这仅在具有动态选项的动态环境中才有意义。