Для создания зависимого dropdownlist в Yii2 внутри GridView мы можем использовать расширение kartik Select2.
Первым шагом мы должны установить расширение Select2 с помощью Composer, выполнив следующую команду в терминале:
composer require kartik-v/yii2-widget-select2 "@dev"
После установки расширения, нам нужно добавить его в файл конфигурации приложения (config/web.php
или config/main.php
) следующим образом:
'components' => [ // ... 'assetManager' => [ 'bundles' => [ 'kartikselect2Select2Asset' => [ 'depends' => [ 'yiiwebJqueryAsset', 'yiibootstrap4BootstrapAsset', // Зависит от вашего используемого Bootstrap ], ], ], ], // ... ],
Затем, мы должны изменить представление GridView, чтобы добавить столбец с зависимым dropdownlist. В следующем примере мы предполагаем, что у нас есть две связанные модели Country
и City
, и мы хотим показать все города в зависимости от выбранной страны:
use kartikselect2Select2; //... [ 'attribute' => 'country_id', 'format' => 'raw', 'value' => function ($model) { return Select2::widget([ 'name' => 'country_id', 'data' => ArrayHelper::map(Country::find()->all(), 'id', 'name'), 'value' => $model->country_id, 'options' => ['placeholder' => 'Select a country...', 'id' => 'country-id'], 'pluginOptions' => [ 'allowClear' => true, ], 'pluginEvents' => [ "change" => "function() { var countryId = $(this).val(); $.ajax({ url: '" . yiihelpersUrl::to(['controller/action']) . "', method: 'GET', data: {country_id: countryId}, success: function(data) { $('#city-id').html(data); } }); }", ], ]); }, ], [ 'attribute' => 'city_id', 'format' => 'raw', 'value' => function ($model) { return Html::tag('span', '', [ 'id' => 'city-id', 'data-selected' => $model->city_id, ]); }, ], //...
Здесь мы используем функцию Select2::widget()
для создания элемента зависимого dropdownlist внутри ячейки GridView. Мы передаем ему данные, которые необходимо отобразить (список стран) и значение выбранного элемента (идентификатор страны). Мы также добавляем произвольный id
к элементу страны для дальнейшего использования в JavaScript-коде.
Затем мы настраиваем обработчик события change
с помощью pluginEvents
. При выборе новой страны мы выполняем AJAX-запрос на сервер, чтобы получить список городов для выбранной страны. Возвращаемые данные отображаем в элементе города, который также имеет свой id
.
Здесь вы должны заменить 'controller/action'
на свой реальный URL-адрес, где реализовано получение списка городов для выбранной страны (метод должен быть прописан в вашем контроллере).
В итоге, при выборе страны в dropdownlist будет сработан AJAX-запрос на сервер, в результате которого будет обновлен dropdownlist с городами в зависимости от выбранной страны.
Надеюсь, это подробное объяснение поможет вам создать зависимый dropdownlist в GridView в Yii2. Если у вас есть еще вопросы, не стесняйтесь задавать!