CakePHP-Hotw使用FormHelper生成具有多属性的选择字段

问题描述 投票:1回答:1

我需要找到一种方法来设置具有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']) ?>

谢谢。

php cakephp form-helpers cakephp-4.x
1个回答
0
投票

如果$ 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
    ]
);
© www.soinside.com 2019 - 2024. All rights reserved.