В Yii2 можно использовать зависимый dropdownlist с разными моделями, используя AJAX и JavaScript для обновления значения второго списка на основе выбранного значения в первом списке. Для этого нужно выполнить следующие шаги:
1. Создать две модели, связанные между собой. Например, модель Country и модель City, где Country имеет множество городов.
// Модель Country class Country extends ActiveRecord { // ... public function getCities() { return $this->hasMany(City::class, ['country_id' => 'id']); } } // Модель City class City extends ActiveRecord { // ... public function getCountry() { return $this->hasOne(Country::class, ['id' => 'country_id']); } }
2. Создать контроллер с двумя действиями: одно для получения списка городов для выбранной страны, и другое для рендеринга представления, содержащего dropdownlists.
class SiteController extends Controller { // ... public function actionGetCities($countryId) { $cities = City::findAll(['country_id' => $countryId]); $options = []; foreach ($cities as $city) { $options[$city->id] = $city->name; } return Json::encode($options); } public function actionIndex() { $model = new Model(); $countries = ArrayHelper::map(Country::find()->all(), 'id', 'name'); return $this->render('index', [ 'model' => $model, 'countries' => $countries, ]); } }
3. Создать представление с двумя dropdownlists и JavaScript для обновления второго списка при изменении значения в первом списке.
<?php use yiihelpersHtml; use yiiwidgetsActiveForm; use yiihelpersUrl; ?> <?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'country_id')->dropDownList($countries, [ 'prompt' => 'Select a country', 'onchange' => ' $.get("' . Url::toRoute(['site/get-cities']) . '", { countryId: $(this).val() }) .done(function(data) { var cities = JSON.parse(data); var options = ""; $.each(cities, function(id, name) { options += "<option value="" + id + "">" + name + "</option>"; }); $("#city-id").html(options); }); ', ]) ?> <?= $form->field($model, 'city_id')->dropDownList([], ['id' => 'city-id', 'prompt' => 'Select a city']) ?> <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> <?php ActiveForm::end(); ?>
В этом примере, при изменении значения в первом списке (country_id), выполняется AJAX-запрос к действию actionGetCities
, которое возвращает список городов для выбранной страны в формате JSON. Затем JavaScript обрабатывает полученный список и обновляет второй dropdownlist (city_id) в соответствии с выбранным значением в первом списке.
Надеюсь, эта информация поможет вам создать зависимый dropdownlist с разными моделями в Yii2.