Для того, чтобы сделать выпадающие меню, зависящие от других меню в Yii2 можно использовать плагин http://demos.krajee.com/widget-details/depdrop
Для начала создадим форму:
<?= $form->field($model, 'country')->dropDownList(City::getCountryList(), [ 'prompt'=>'Выберите страну', 'id'=>'country_id', ]) ?>
Здесь создается обычный объект dropDownList. Тут необходимо указать id в параметрах для поля
Далее подключаем widget DepDrop
<?= $form->field($model, 'city')->widget(\kartik\depdrop\DepDrop::class, [ 'options' => ['id' => 'city_id'], 'pluginOptions' => [ 'depends' => ['country_id'], 'placeholder' => 'Выберите город', 'url' => \yii\helpers\Url::to(['/city/cities']), 'initialize' => true, ] ]) ?>
Тут необходимо указать от чего форма будет зависима, в данном случае от country_id. Так же указываем ‘url’ — это экшн, из которого будет брать списки с помощью AJAX
в экшене city/cities:
$parents = Yii::$app->request->post('depdrop_parents', null); if ($parents != null) { $country = $parents[0]; $arr = City::find()->where(['country'=>$country])->all(); return Json::encode([ 'output'=>GlobFunc::prepareToDepDrop($arr, 'name'), 'selected'=>$country ]); } return Json::encode(['output'=>'', 'selected'=>'']);
методом post передается параметр depdrop_parents, в котором первым элементом передается id выбранного в dropDownList значения. Поэтому не мешает проверить передался он вообще или нет. Далее идет банальная выборка из БД и подготовка массива, для передачи обратно в форму.
Массив должен быть такой:
[ ['id'=>1, 'name'=>'Moscow'], ['id'=>2, 'name'=>'Saint-Peterburg'], ... ]
Далее массив кодируется в
Json::encode(['output'=>$arr, 'selected'=>5]);
Где в output — складывается полученный массив в selected складывается ID выбранного элемента загружаемого списка
Если ничего не найдено, то возвращаем (тоже в Json) массив вида: [‘output’=», ‘selected’=>»]
Довольно исчерпывающая документация с реальными примерами находится тут: http://demos.krajee.com/widget-details/depdrop