Добрый день.
Самый простой вариант, без использования сторонних модулей, виджетов и тому подобного.
В файле form.php формируется два выпадающих списка, один из них по умолчанию отключён.
Пример из моего рабочего проекта, Вам надо будет только заменить имена модели, контроллера и перевод(англ/русс).
<div class="col-lg-6">
<?= $form->field($model, 'country_id')->dropDownList(Countries::getActiveCountry(),
[
'prompt' => AirlinesModule::t('module','AIRLINES_PROMPT_FORM'),
'onchange' => '
$.post(
"'. Url::toRoute('default/ajax') .'",
{id: $(this).val()},
function(data){
$("select#city").html(data).attr("disabled", false)
}
)
'
]
) ?>
</div>
<div class="col-lg-6">
<?= $form->field($model, 'city_id')->dropDownList(Cities::getActiveCity(),
[
'prompt' => AirlinesModule::t('module', 'AIRLINES_PROMPT_FORM'),
'id' => 'city',
'disabled' => $model->isNewRecord ? true : false
]
) ?>
</div>
В модели два метода, для стран и городов. Хотя у меня две модели, отдельно для городов и отдельно для стран, эти два метода поместить в одну модель можно.
public static function getActiveCountry()
{
return ArrayHelper::map(self::find()->where(['status' => self::STATUS_ACTIVE])->orderBy('country')->all(), 'id', 'country');
}
public static function getActiveCity()
{
return ArrayHelper::map(self::find()->where(['status' => self::STATUS_ACTIVE])->orderBy('city')->all(), 'id', 'city');
}
В контролере создаёте действие Ajax, хотя опять же, не обязательно его так называть, назовёте как захотите.
public $option = '';
public function actionAjax()
{
if(Yii::$app->request->isAjax){
$id = (int)Yii::$app->request->post('id');
$this->option = "<option value='0'>" . AirlinesModule::t('module', 'AIRLINES_PROMPT_FORM') . "</option>";
$cities = Cities::find()
->where(['status' => Cities::STATUS_ACTIVE])
->andWhere('country_id=:id',[':id' => $id])
->orderBy('city')
->all();
foreach ($cities as $city){
$this->option .= '<option value="' . $city->id . '">' . $city->city . '</option>';
}
}
return $this->option;
}
Всё, в итоге два взаимосвязанных выпадающих списка у Вас есть.