列表数据中的下拉列表
Dropdown in list data
这是我的代码:
[
'attribute' => 'status',
'value' => function ($model) {
return Html::dropDownList('status', ['10' => 'Active', '20' => 'Deactive']);
},
],
我只想要状态栏中的下拉菜单。如果记录是活动的或停用的,它将被选中。
使用content
属性 渲染HTML 个元素。例如:
[
'attribute' => 'status',
'content' => function ($model) {
return Html::dropDownList('status', $model->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);
然后在 status
的 GridView 列中将下拉列表更改为以下
return Html::dropDownList(Html::getInputName($model, 'active'), $model->active, [10 => 'Active', 20 => 'Deactive'], ['class' => 'switch-status']);
然后转到您的控制器并添加用于更新状态的操作代码
注意:将第一行 $model = Model::findOne($id);
名称中的 Model
更改为您正在使用的相应型号。
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'))
];
}
}
}
这是我的代码:
[
'attribute' => 'status',
'value' => function ($model) {
return Html::dropDownList('status', ['10' => 'Active', '20' => 'Deactive']);
},
],
我只想要状态栏中的下拉菜单。如果记录是活动的或停用的,它将被选中。
使用content
属性 渲染HTML 个元素。例如:
[
'attribute' => 'status',
'content' => function ($model) {
return Html::dropDownList('status', $model->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);
然后在 status
的 GridView 列中将下拉列表更改为以下
return Html::dropDownList(Html::getInputName($model, 'active'), $model->active, [10 => 'Active', 20 => 'Deactive'], ['class' => 'switch-status']);
然后转到您的控制器并添加用于更新状态的操作代码
注意:将第一行 $model = Model::findOne($id);
名称中的 Model
更改为您正在使用的相应型号。
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'))
];
}
}
}