Yii2 dropdownlist. Частина 1

17

Від автора: вітаю вас, друзі. Ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii2. У цій статті ми з вами попрацюємо з випадаючими списками форми і познайомимося з методом Yii2 dropdownlist, який і дозволяє додати для форми випадаючий список.

Отже, давайте попрацюємо з ще одним елементом форми – випадаючим списком select. До цього ми з вами працювали переважно з текстовими полями, однак, випадаючі списки також частий елемент форм. Наприклад, при створенні новини ми можемо спочатку її не публікувати. Для цього цілком може знадобитися випадаючий список з двома елементами: публікувати і не публікувати. Ще один класичний приклад – вибір категорії статті або новини. Якщо в першому варіанті список ми могли б замінити чекбоксів, то в другому випадку цього не вдасться зробити, тут потрібен саме список.

Реалізацією випадаючих полів форми займається метод dropDownList. Метод передбачає обов’язковий параметр — $items, який повинен бути масивом, що використовуються для генерування списку. Ключі масиву будуть використані для значень select в коді HTML, ну а значення масиву – текстові елементи списку. Другий параметр методу dropDownList – масив опцій $options – є обов’язковим.

Ну що ж, давайте спробуємо. Нехай у нас будуть дві сутності – пости і категорії. Кожен пост належить конкретній категорії. Відповідно, в таблиці статей у нас буде деяке поле category_id, в яке буде записувати ID категорії, до якої належить стаття. Якщо ми згенеруємо через модуль Gii всі необхідні компоненти програми (моделі і CRUD), то в підсумку при редагуванні посту ми отримаємо наступну картину:

Yii2 dropdownlist. Частина 1

В принципі, все буде працювати, у відповідне поле таблиці статей буде записаний ID категорії. Ось тільки це ні разу не зручно і не зрозуміло для адміністратора сайту, оскільки при створенні категорій він вводить конкретні їх назви, а в полі пропонується записати якесь Category ID. Ось тут якраз і використовуємо select.

Відкриємо потрібне подання, знайдемо висновок, що цікавить нас поля:

field($model, ‘category_id’)->textInput([‘maxlength’ => true]) ?>

Видалимо або закомментіруем його, а замість нього вставимо наступний код:

field($model, ‘category_id’)->dropDownList(
\yii\helpers\ArrayHelper::map(\app\modules\admin\models\Category::find()->all(), ‘id’, ‘name’)
) ?>

І подивимося на результат:

Yii2 dropdownlist. Частина 1

Все вийшло. Тепер ми маємо випадаючий список. В якості параметра ми передали результат роботи методу ArrayHelper::map, який ми розглядали в одній з попередніх статей. Самому ArrayHelper::map ми передали одним з параметрів результат звернення до моделі. Насправді звернення до моделі з виду дещо суперечить паттерну MVC, тому, по-хорошому, непогано було б це зробити в конртроллере, а вже з нього готові передати дані в вид. Давайте так і зробимо.

Йдемо в контролер постів, отримуємо категорії і передаємо їх подання:

public function actionUpdate($id)
{
$model = $this->findModel($id);
$cats = Category::find()->all();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect([‘view’, ‘id’ => $model->id]);
} else {
return $this->render(‘update’, [
‘model’ => $model,
‘cats’ => $cats,
]);
}
}

З подання update.php пробросим дані _form.php:

render(‘_form’, [
‘model’ => $model,
‘cats’ => $cats,
]) ?>

І, нарешті, у _form.php:

field($model, ‘category_id’)->dropDownList(
\yii\helpers\ArrayHelper::map($cats, ‘id’, ‘name’)
) ?>

Якщо ви ніде не помилилися, то результат не зміниться. На цьому поки що зупинимося і продовжимо роботу в наступній статті. Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.