fix(admin): accept multi-value 发布类型 on header-nav save

header_newposts_types is multi-select but PHP schema used type=select,
so validate() rejected arrays with 422. Use checkbox and allow
select+multiple arrays in SchemaProvider.
This commit is contained in:
2026-07-25 11:13:52 +08:00
parent 53836ac6b8
commit ab3d361d46
3 changed files with 16 additions and 3 deletions
@@ -134,7 +134,7 @@ export const pageDisplaySchemas = {
{ label: '紫色', value: 'jb-purple' },
{ label: '粉色', value: 'jb-pink' },
], dependsOn: { key: 'header_newposts_enabled', value: true } },
{ key: 'header_newposts_types', label: '发布类型', type: 'select', multiple: true, default: ['post'], options: [
{ key: 'header_newposts_types', label: '发布类型', type: 'checkbox', default: ['post'], options: [
{ label: '文章', value: 'post' },
{ label: '帖子', value: 'topic' },
{ label: '商品', value: 'product' },
+1 -1
View File
@@ -58,7 +58,7 @@ class SchemaPageDisplay {
['label' => '紫色', 'value' => 'jb-purple'],
['label' => '粉色', 'value' => 'jb-pink'],
]],
['key' => 'header_newposts_types', 'label' => '发布类型', 'type' => 'select', 'default' => ['post'], 'options' => [
['key' => 'header_newposts_types', 'label' => '发布类型', 'type' => 'checkbox', 'default' => ['post'], 'options' => [
['label' => '文章', 'value' => 'post'],
['label' => '帖子', 'value' => 'topic'],
['label' => '商品', 'value' => 'product'],
+14 -1
View File
@@ -181,13 +181,26 @@ class SchemaProvider {
if (in_array($type, ['select', 'radio'], true) && !empty($field['options'])) {
$valid_values = array_column($field['options'], 'value');
if (!in_array($value, $valid_values, true)) {
// Multi-select: accept array values when schema.multiple is set
// (legacy / SPA may still use type=select multiple).
if (!empty($field['multiple']) && is_array($value)) {
foreach ($value as $item) {
if (!in_array($item, $valid_values, true)) {
$errors[] = sprintf('%s has an invalid value', $field['label'] ?? $key);
break;
}
}
} elseif (!in_array($value, $valid_values, true)) {
$errors[] = sprintf('%s has an invalid value', $field['label'] ?? $key);
}
}
if ($type === 'checkbox' && !empty($field['options'])) {
$valid_values = array_column($field['options'], 'value');
if (!is_array($value)) {
$errors[] = sprintf('%s must be an array', $field['label'] ?? $key);
continue;
}
foreach ((array) $value as $item) {
if (!in_array($item, $valid_values, true)) {
$errors[] = sprintf('%s has an invalid value', $field['label'] ?? $key);