Вам нужно использовать 'format' => 'raw'
для опций столбца, а ваше определение для dropDownList()
неверно, вам нужно иметь строку выбора в качестве второго параметра и опции раскрывающегося списка в качестве третьего параметра. Измените свой код ниже:
[
'attribute' => 'status',
'format' => 'raw',
'value' => function ($model) {
return Html::dropDownList('status', $model->status, ['10' => 'Active', '20' => 'Deactive']);
},
],
EDIT
У вас не было в начальных требованиях того, что вы тоже хотите обновить статус при изменении раскрывающегося списка. Вы можете связать вызов ajax с раскрывающимся списком.
Добавьте следующий javascript поверх вашего представления, где вы инициализируете GridView
.
ПРИМЕЧАНИЕ. Измените url:'controller/update-status?id'+id
в вызове ajax на соответствующий контроллер, для которого вы хотите обновить статус строки, но не удаляйте id
* 1019. *
$js = <<<JS
$(document).on('ready pjax:success',function(){
$(".switch-status").on('change',function(){
var data={};
data[$(this).attr("name")]=$(this).val();
var id=$(this).closest("tr").data('key');
$.ajax({
method:'post',
url:'/controller/update-status?id='+id,
data:data,
success:function(data){
if(!data.success){
alert(data.message);
}else{
alert("Status updated.");
}
},
error:function(jqXHR, textStatus, errorThrown ){
alert(errorThrown);
}
});
});
});
JS;
$this->registerJs($js, yii\web\View::POS_END);
Затем внутри столбца GridView для status
измените раскрывающийся список на следующий
return Html::dropDownList(Html::getInputName($model, 'active'), $model->active, [10 => 'Active', 20 => 'Deactive'], ['class' => 'switch-status']);
И перейдите к своему контроллеру и добавьте код действия для обновления статуса
Примечание. Измените имя Model
в первой строке $model = Model::findOne($id);
на соответствующую модель, которую вы используете.
public function actionUpdateStatus($id) {
$model = Affiliate::findOne($id);
$app = Yii::$app;
$request = $app->request;
if($request->IsAjax && $request->isPost) {
Yii::$app->response->format = Response::FORMAT_JSON;
if($model->load($request->post()) && $model->save()) {
return ['success' => true];
} else {
return [
'success' => false,
'message' => implode('<br />', ArrayHelper::getColumn($model->errors, '0'))
];
}
}
}