CakePHP - 如何使用表单助手生成具有多个属性的 Select 字段
CakePHP - Hotw to Generate Select Field with Mutiple Attribute using FormHelper
我需要找到一种方法来设置具有 multiple
属性的 select
类型字段的默认值。
这里是通过控制器发送到视图的数据:
$categories = [
['id' => 1, 'description' => 'Hardware'],
['id' => 2, 'description' => 'Sofware'],
['id' => 3, 'description' => 'Peopleware'],
['id' => 4, 'description' => 'Alienware'],
];
$selectedCategoriesIds = [1, 3];
$this->set(compact('categories', 'selectedCategoriesIds'));
视图如下所示:
<select name="categories[_ids][]" multiple="multiple">
<?php foreach ($categories as $category): ?>
<option value="<?= $category->id ?>"<?= (in_array($category->id, $selectedCategoriesIds) ? 'selected' : '') ?>><?= $category->description ?></option>
<?php endforeach; ?>
</select>
这是在视图中生成的 HTML:
<select name="categories[_ids][]" multiple="multiple">
<option value="1" selected>Hardware</option>
<option value="2">Software</option>
<option value="3" selected>Peopleware</option>
<option value="4">Alienware</option>
</select>
一切正常,我的问题是我是否可以使用 CakePHP 的 FormHelper 获得相同的结果,因此我不需要遍历 $categories
并在视图内调用 in_array()
。我已经查阅了食谱,但没有找到任何东西,或者不明白在这种特定情况下该怎么做。我假设它会是这样的:
<?= $this->Form->control('categories._ids', ['some params']) ?>
谢谢。
如果您的 $categories 数组的结构略有不同,您应该可以使用 class 形式。 Cookbook 有一个示例 here:
// HTML <option> elements with values 1 and 3 will be rendered preselected
echo $this->Form->select(
'rooms',
[1, 2, 3, 4, 5],
[
'multiple' => true,
'value' => [1, 3]
]
);
首先,只需将 $categories
映射到更简单的类别 ID => 描述映射列表。
如果此类别列表是来自数据库的数据,只需 select 使用 'list' 而不是默认方法,例如:
$categories = $CategoriesTable->find('list');
但是,如果不是来自查询结果,您仍然可以手动转换数组:
$categories = [
['id' => 1, 'description' => 'Hardware'],
['id' => 2, 'description' => 'Sofware'],
['id' => 3, 'description' => 'Peopleware'],
['id' => 4, 'description' => 'Alienware'],
];
$formattedCategories = [];
foreach($categories as $row){
$formattedCategories[$row['id']] = $row['description'];
}
$categories = $formattedCategories;
采用这种格式后,常规 Form->select
将起作用:
echo $this->Form->select(
'categories[_ids][]',
$categories,
[
'multiple' => true,
'value' => $selectedCategoriesIds
]
);
我需要找到一种方法来设置具有 multiple
属性的 select
类型字段的默认值。
这里是通过控制器发送到视图的数据:
$categories = [
['id' => 1, 'description' => 'Hardware'],
['id' => 2, 'description' => 'Sofware'],
['id' => 3, 'description' => 'Peopleware'],
['id' => 4, 'description' => 'Alienware'],
];
$selectedCategoriesIds = [1, 3];
$this->set(compact('categories', 'selectedCategoriesIds'));
视图如下所示:
<select name="categories[_ids][]" multiple="multiple">
<?php foreach ($categories as $category): ?>
<option value="<?= $category->id ?>"<?= (in_array($category->id, $selectedCategoriesIds) ? 'selected' : '') ?>><?= $category->description ?></option>
<?php endforeach; ?>
</select>
这是在视图中生成的 HTML:
<select name="categories[_ids][]" multiple="multiple">
<option value="1" selected>Hardware</option>
<option value="2">Software</option>
<option value="3" selected>Peopleware</option>
<option value="4">Alienware</option>
</select>
一切正常,我的问题是我是否可以使用 CakePHP 的 FormHelper 获得相同的结果,因此我不需要遍历 $categories
并在视图内调用 in_array()
。我已经查阅了食谱,但没有找到任何东西,或者不明白在这种特定情况下该怎么做。我假设它会是这样的:
<?= $this->Form->control('categories._ids', ['some params']) ?>
谢谢。
如果您的 $categories 数组的结构略有不同,您应该可以使用 class 形式。 Cookbook 有一个示例 here:
// HTML <option> elements with values 1 and 3 will be rendered preselected
echo $this->Form->select(
'rooms',
[1, 2, 3, 4, 5],
[
'multiple' => true,
'value' => [1, 3]
]
);
首先,只需将 $categories
映射到更简单的类别 ID => 描述映射列表。
如果此类别列表是来自数据库的数据,只需 select 使用 'list' 而不是默认方法,例如:
$categories = $CategoriesTable->find('list');
但是,如果不是来自查询结果,您仍然可以手动转换数组:
$categories = [
['id' => 1, 'description' => 'Hardware'],
['id' => 2, 'description' => 'Sofware'],
['id' => 3, 'description' => 'Peopleware'],
['id' => 4, 'description' => 'Alienware'],
];
$formattedCategories = [];
foreach($categories as $row){
$formattedCategories[$row['id']] = $row['description'];
}
$categories = $formattedCategories;
采用这种格式后,常规 Form->select
将起作用:
echo $this->Form->select(
'categories[_ids][]',
$categories,
[
'multiple' => true,
'value' => $selectedCategoriesIds
]
);