这是我的代码:
[
'attribute' => 'status',
'value' => function ($model) {
return Html::dropDownList('status', ['10' => 'Active', '20' => 'Deactive']);
},
],
我只想在状态列中下拉菜单。如果记录处于活动状态或非活动状态,则将其选中。
答案 0 :(得分:2)
使用content
属性呈现HTML元素。例如:
[
'attribute' => 'status',
'content' => function ($model) {
return Html::dropDownList('status', $model->status, ['10' => 'Active', '20' => 'Deactive']);
},
],
答案 1 :(得分:2)
您需要对列选项使用'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);
然后在status
的GridView列中,将下拉菜单更改为以下内容
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'))
];
}
}
}