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
    ]
);