YII2: dropdownlist (выпадающий список)
Фреймворк yii2 предоставляет множество полезных функций для генерации HTML кода, одна из таких — dropdownlist. Данная функция принадлежит классу HTML и используется в представлениях для отображения выпадающего списка:
Прежде чем использовать метод dropdownlist необходимо в начале файла, нашего представления объявить класс HTML:
1 2 |
<?php use yii\helpers\Html; |
Сейчас существует два способа использования данной функции:
- Через экземпляр класс ActiveForm
- Непосредственно через статичный класс HTML
Я предпочитаю пользоваться вторым способом в виду его краткости, но мы рассмотрим оба варианта. Для объекта ActiveForm код будет выглядеть следующим образом:
1 |
echo $form->field($model, 'cat')->dropDownList($items, $param); |
В данном коде, мы через метод field, класса ActiveForm, задаем модель и вызываем функцию dropDownList. Давайте сразу же рассмотрим второй вариант, а потом поговорим про параметры данной функции.
1 |
echo Html::dropDownList('cat', 'null', $items, $param); |
Как видно оба способа не сильно отличаются.
Аргументы в dropdownlist
Функция dropdownlist принимает 4 аргумента если объявлена через класс HTML и 2 если объявлена через класс ActiveForm, так как в данном случае первые два параметра устанавливаются из функции field. Рассмотрим все 4 аргумента:
- $name — имя поля формы, которое устанавливается для дальнейшей обработки запроса на сервере. В примере выше видно строку — name=»cat», это значение и устанавливает данный параметр.
- $selected — второй параметр служит для определения значения по умолчанию, то есть присваивает определенному полю option значение selected. Но применение данного свойства различается для способа использования dropdownlist по этому мы рассмотри его подробнее ниже.
- $items — принимает одномерный массив из которого генерирует поля option, где value — ключи массива, а содержимое между тегами — значение ключей массива. Так же рассмотрим этот параметр подробнее.
- $options (не обязательный аргумент) — массив с параметрами. Подробнее здесь.
Значения в dropdownlist
Третий аргумент $items определяет какие будут значения в нашем списке. Чаще всего вместе с dropdownlist используется функция map() класса ArrayHelper для того чтобы модель класса ActiveRecord преобразовать в необходимый массив. Например:
1 |
$items = ArrayHelper::map($cat,'id','name'); |
Здесь переменная $cat является экземпляром класса ActiveRecord, а параметры id и name задают ключ и значение массива. Ключи могут быть как числовыми так и строковыми. В результате в переменной $items у меня находиться такой массив:
Либо в ручную создадим массив:
1 2 3 4 5 6 |
$items=[ 4=>'Детективы', 5=>'Драма', 10=>'Ужасы', 16=>'Фантастика', ]; |
Применим его в наш dropdownlist:
1 |
echo Html::dropDownList('cat', 'null', $items); |
В результате получиться такой html код:
1 2 3 4 5 6 |
<select name="cat"> <option value="4">Детективы</option> <option value="5">Драма</option> <option value="10">Ужасы</option> <option value="16">Фантастика</option> </select> |
Параметр selected в dropdownlist
В случае использования dropdownlist через класс Html мы можем задать selected через второй аргумент, указав value необходимого значения. Например такой код:
1 |
echo Html::dropDownList('cat', '10', $items, $params); |
Вернет такой html:
1 2 3 4 5 6 |
<select name="cat"> <option value="4">Детективы</option> <option value="5">Драма</option> <option value="10" selected>Ужасы</option> <option value="16">Фантастика</option> </select> |
Как видно для option с value=10 устанавливается атрибут selected.
Для того что бы установить значение по умолчанию, в случае использования dropdownlist через класс ActiveForm необходимо воспользоваться 4 аргументов $options. Создадим наш массив с опциями:
1 |
$param = ['options' =>[ '10' => ['Selected' => true]]]; |
Первый ключ массива — options позволяет задавать настройки для определенных элементов списка, принимая в качестве значения вложенный массив с ключом value определенного options. И во вложенном массиву устанавливаем ключ с значением Selected равным true. Применим наши опции:
1 |
echo $form->field($model, 'cat')->dropDownList($items, $param); |
Результат будет таким же как и в первом случае.
Хорошая статья, спасибо
Добрый день! Хочу реализовать такую штуку:
Есть 2 модели — League и Team! В каждой лиге из определенной страны есть какое количество команд. Лиги всего 3, так вот в ActiveForm есть dropdownlist с выбором лиги и необходимо, чтобы в зависимости от выбора в следующем dropdownlist’е оказывались только, те команды, которые относятся к лиге выбранной выше. А те лишние команды из 2 оставщихся не отображались бы!
field($model, ‘league_id’)->dropDownList(ArrayHelper::map(League::find()->all(), ‘id’, ‘league’)) ?>
field($model, ‘home_team_id’)->dropDownList(ArrayHelper::map(Team::find()->all(), ‘team_id’, ‘team_name’)) ?>
Как запутанно возможно описал. По идее, если бы можно было при выборе команды установить некий параметр и передать его при запросе в другую модель. Что-то вроде $league_id = 1 и затем уже выполнять:
->dropDownList(ArrayHelper::map(Team::find()->andWhere([‘league_id’ => $league_id])->all(), ‘team_id’, ‘team_name’)) ?>
Вот как это сделать?
В модели прописать необходимые условия в функции, вот пример:
public function getNameManagerForCreeatingDocs()
{
$listCategory = User::find()->asArray()->select(‘id, display_name’)
->andWhere([‘is_tutor’=> 0])
->andWhere([‘is_works’=> 1])
->andWhere([‘is_operator’=> 0])
->orderBy(‘display_name asc’)->all();
$list = ArrayHelper::map($listCategory, ‘id’, ‘display_name’);
return $list;
}
Во вьюхе вывести данную функцию
echo $form->field($model, ‘user_id’)->dropDownList($model->NameManagerForCreeatingDocs,
[‘prompt’ => ‘Выбрать менеджера договора’,
‘id’ => ‘id_user_global’])
->label(‘Выбрать менеджера договора’);
Вот как сделать dropdownlist из модели, но со своим вариантом заполнения без JS?
Здравствуйте, для решения данной задачи необходимо использовать зависимый dropdown подробнее: http://www.yiiframework.com/wiki/723/creating-a-dependent-dropdown-from-scratch/
Спасибо автору!
Я только разбираюсь, но хочу отметить также тот факт, что если вы используете ActiveForm и в модели($model) уже заполнен атрибут (‘cat’) то в выпадающем списке по умолчанию будет именно этот элемент(по его ‘id’) . Т.е достаточно будет строки $form->field($model, ‘cat’)->dropDownList($items).
А в случае, если атрибут ‘cat’ не заполнен, то первым в списке будет первый элемент из массива $items, что достаточно удобно.
Спасибо большое, автор!
Очень помог реализовать нужный функционал!
Понятно и доступно!