这是我的代码:
[
'attribute' => 'status',
'value' => function ($model) {
return Html::dropDownList('status', ['10' => 'Active', '20' => 'Deactive']);
},
],
我只想要下拉状态列。如果记录处于活动状态或已取消激活,则将选择该记录
您需要使用'format' => 'raw'
作为列选项,并且您对dropDownList()
的定义是错误的,您需要将选择字符串作为第二个参数,将下拉选项作为第三个参数。将您的代码更改为:
[
'attribute' => 'status',
'format' => 'raw',
'value' => function ($model) {
return Html::dropDownList('status', $model->status, ['10' => 'Active', '20' => 'Deactive']);
},
],
在更改下拉列表时,您在初始要求中没有想要更新状态。您可以将ajax调用绑定到下拉列表。
在您初始化GridView
的视图顶部添加以下javascript。
注意:将ajax调用中的url:'controller/update-status?id'+id
更改为要更新行的状态的相对控制器,但不要删除id
$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'))
];
}
}
}
使用content
属性呈现HTML元素。例如:
[
'attribute' => 'status',
'content' => function ($model) {
return Html::dropDownList('status', $model->status, ['10' => 'Active', '20' => 'Deactive']);
},
],