我需要找到一种方法来设置具有select
属性的multiple
类型字段的默认值。
这里是通过控制器发送到视图的数据:
$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数组的结构略有不同,则应该可以使用form类。本食谱有一个示例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的更简单映射列表=>描述。
如果此类别列表是数据库中的数据,只需使用“列表”而不是默认方法,例如:
$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
]
);