Yii2 GridView зависимый от поиска выпадающий

Я использую Yii2 gridview для загрузки страны, штата, города. Я установил опцию поиска для страны, штата, города, используя выпадающий список. Как создать зависимый выпадающий список в фильтре?

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'country_id',
'label' => 'Country',
'filter' => Country::country(),
'value' => function($data){
return Country::countryname($data->country_id);
}
],
[

'attribute' => 'state_id',
'filter' => State::state(),
'value' => function($data){
return State::statename($data->state_id);
}
],
[

'attribute' => 'city_id',
'filter' => City::city(),
'value' => function($data){
return City::cityname($data->city_id);
}
],

]); ?>

0

Решение

Поскольку форма фильтра в виде сетки изменяется, отправьте запрос на изменение формы.
Вы можете легко создать свой список фильтров как

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'country_id',
'label' => 'Country',
'filter' => Country::country(),
'value' => function($data){
return Country::countryname($data->country_id);
}
],
[

'attribute' => 'state_id',
'filter' => State::state($searchModel->country), //Country Id/name from SearchModel --- you can add condition if isset($searchModel->country) then show else [] blank array
'value' => function($data){
return State::statename($data->state_id);
}
],
[

'attribute' => 'city_id',
'filter' => City::city($searchModel->state),   //Country Id/name from SearchModel --- you can add condition if
'value' => function($data){
return City::cityname($data->city_id);
}
],

]); ?>

Так как вы предоставили свою собственную функцию в фильтре штата / города ,,, получите список массивов имени установленного значения $searchModel->state

В государственной модели

class State extends \yii\db\ActiveRecord{

public static state($country){
if($country){
return ['state'];
}else{
return [];
}
}
}

Точно так же для городской модели

4

Другие решения

Если $ searchModel является объектом ModelSearch, в представлении:

$this->registerJs( <<< EOT_JS

$('#ModelSearch[state_id]').on('change', function(ev) {
$.get(
'<url>',
{ parameters }
function(data) {
// if data is an html response...
$('#ModelSearch[city_id]').html(data);
}
);
}

EOT_JS
);
0

Вот Страна Страна Город Зависимая выпадающая функциональность, когда город выбирается несколько раз

Вот вид

            <?php
echo $form->field($model, 'country_id')->dropDownList(
$con,
[
'prompt'=>'Select Country',
'labal'=>false,
'onchange'=>'
$.get( "'.Url::toRoute('/site/lists').'", { id: $(this).val() } )
.done(function( data ) {
$( "#'.Html::getInputId($model, 'state_id').'" ).html( data );
}
);
'
]
)->label('Country Name');



// echo $form->field($model, 'state_id')->dropDownList(['prompt'=>'Select State']);



echo $form->field($model, 'state_id')->dropDownList(
$state,
[
'prompt'=>'Select State',
'onchange'=>'
$.get( "'.Url::toRoute('/site/citi').'", { id: $(this).val() } )
.done(function( data ) {
$( "#'.Html::getInputId($model, 'citi_id').'" ).html( data );

}
);
'
]
)->label('State Name');



echo $form->field($model, 'citi_id')->dropDownList(
$state,
[
'prompt'=>'Select City',
'multiple' => true,
'onchange'=>'
$.get( "'.Url::toRoute('/site/citi').'", { id: $(this).val() } )
.done(function( data ) {
$( "#'.Html::getInputId($model, 'citi_id').'" ).html( data );

}
);
'
]
)->label('City Name');

// echo $form->field($model, 'citi_id')->dropDownList(['prompt'=>'Select City']);
?>

Вот функция Sitecontroller

Государство, связанное со страной

public function actionLists($id)
{
$model = new State();
$rows = $model::find()->where(['country_id' => $id])->all();
$countPosts = $model::find();
echo "<option>Select State</option>";

if(count($rows)>0){
foreach($rows as $row){
echo "<option value='$row->id'>$row->name</option>";
}
}
else{
echo "<option>Select State</option>";
}
}

**City Related to State**

public function actionCiti($id)

{
//die('hello');
$model = new Citi();
$rows = $model::find()->where(['state_id' => $id])->all();
$countPosts = $model::find();
echo "<option>Choose City</option>";

if(count($rows)>0){
foreach($rows as $row){
echo "<option value='$row->id'>$row->name</option>";
}
}
else{
echo "<option>No City Available</option>";
}
}
0
По вопросам рекламы [email protected]