列表数据中的下拉列表

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'))
            ];
        }
    }
}