首页 > 解决方案 > 列表数据中的下拉列表

问题描述

这是我的代码:

[
    'attribute' => 'status',
    'value' => function ($model) {
        return Html::dropDownList('status', ['10' => 'Active', '20' => 'Deactive']);
    },
],

我只想要状态列中的下拉菜单。如果记录是活动的或非活动的,它将被选中。

在此处输入图像描述

标签: yii2yii2-advanced-appyii2-basic-app

解决方案


您需要使用'format' => 'raw'列选项,并且您的定义dropDownList()是错误的,您需要将选择字符串作为第二个参数,将下拉选项作为第三个参数。将您的代码更改为以下内容:

[
    'attribute' => 'status',
    'format' => 'raw',
    'value' => function ($model) {
        return Html::dropDownList('status', $model->status, ['10' => 'Active', '20' => 'Deactive']);
    },
],

编辑

在更改下拉列表时,您也没有想要更新状态的初始要求。您可以将 ajax 调用绑定到下拉列表。

在您初始化GridView.

注意:url:'controller/update-status?id'+id将 ajax 调用更改为要更新行状态的相对控制器,但不要删除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'))
            ];
        }
    }
}

推荐阅读