Cake PHP - Hotw для создания поля выбора с множеством атрибутов с помощью FormHelper - PullRequest
1 голос
/ 07 мая 2020

Мне нужно найти способ установить значения по умолчанию для поля типа 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>

Все работает отлично, мой вопрос Могу ли я получить тот же результат с помощью Cake PHP FormHelper, чтобы мне не нужно было перебирать $categories и вызывать in_array() внутри представления. Я уже обращался к Поваренной книге, но ничего не нашел или не понял, как это сделать в данном конкретном случае c. Я предполагаю, что это будет что-то вроде:

<?= $this->Form->control('categories._ids', ['some params']) ?>

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Вы должны иметь возможность использовать класс формы, если ваш массив $ категорий структурирован немного иначе. В Cookbook есть пример здесь :

// 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 с более простым сопоставленным списком идентификаторов категорий => описаний.

Если это список категорий был данными из базы данных, просто выберите его с помощью '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
    ]
);
...