javascript - Yii2 - 在 GridView 中使用 Ajax/Pjax 通过 switch toogle 更新数据

标签 javascript php ajax yii2 pjax

我想在不刷新当前页面的情况下使用 Switch Toogle 更新 GridView 中的数据。

这是图像:
img1

所以我想像上图一样使用toogle开关更新属性status

这是我的代码:

索引.php

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    //'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        //'alumni_id',
        'tahun_lulus',
        'file_excel',
        [
            'attribute' => 'status',
            'format' => 'raw',
            'value' => function($data){
                if($data->status==0){
                    return SwitchInput::widget([
                        'name' => 'status_11',
                        'pluginOptions' => [
                            'size' => 'mini',
                            'onColor' => 'success',
                            'offColor' => 'danger',
                            'onText' => 'Active',
                            'offText' => 'Inactive',
                        ],
                        'value' => true,
                    ]);
                }
                else if($data->status==1){
                    return SwitchInput::widget([
                        'name' => 'status_11',
                        'pluginOptions' => [
                            'size' => 'mini',
                            'onColor' => 'success',
                            'offColor' => 'danger',
                            'onText' => 'Active',
                            'offText' => 'Inactive',
                        ],
                        'value' => false,
                    ]);;
                }
            }
        ],
        //'deleted',
        'created_at',
        'updated_at',

        [ 'class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

我如何使用 Ajax/Pjax 做到这一点?

最佳答案

在我建议您解决方案之前,您需要修复一些问题,因为您在下面的 GridView 中有冗余代码。

[
    'attribute' => 'status',
    'format' => 'raw',
    'value' => function($data){
        if($data->status==0){
            return SwitchInput::widget([
                'name' => 'status_11',
                'pluginOptions' => [
                    'size' => 'mini',
                    'onColor' => 'success',
                    'offColor' => 'danger',
                    'onText' => 'Active',
                    'offText' => 'Inactive',
                ],
                'value' => true,
            ]);
        }
        else if($data->status==1){
            return SwitchInput::widget([
                'name' => 'status_11',
                'pluginOptions' => [
                    'size' => 'mini',
                    'onColor' => 'success',
                    'offColor' => 'danger',
                    'onText' => 'Active',
                    'offText' => 'Inactive',
                ],
                'value' => false,
            ]);;
        }
    }
],

您可以将 $data->status 的值传递给 SwitchInputvalue 属性,而不是使用 if(){}else{}.

然后要实现您正在寻找的内容,您必须使用 SwitchInputpluginEvent 选项并将 switchChange.bootstrapSwitch 事件绑定(bind)到每当 SwitchInput 的状态发生变化时发送一个 ajax 调用,这样你的 Griview 代码应该如下所示

<?php
use kartik\switchinput\SwitchInput;

$js = <<< JS
    function sendRequest(status, id){
        $.ajax({
            url:'/controller/action',
            method:'post',
            data:{status:status,id:id},
            success:function(data){
                alert(data);
            },
            error:function(jqXhr,status,error){
                alert(error);
            }
        });
    }
JS;

$this->registerJs($js, \yii\web\View::POS_READY);


echo  GridView::widget(
    [
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
    
            //'alumni_id',
            'tahun_lulus',
            'file_excel',
            [
                'attribute' => 'status',
                'format' => 'raw',
                'value' => function ($data) {
                    return SwitchInput::widget(
                        [
                            'name' => 'status_11',
                            'pluginEvents' => [
                                'switchChange.bootstrapSwitch' => "function(e){sendRequest(e.currentTarget.checked, $data->id);}"
                            ],
                    
                            'pluginOptions' => [
                                'size' => 'mini',
                                'onColor' => 'success',
                                'offColor' => 'danger',
                                'onText' => 'Active',
                                'offText' => 'Inactive'
                            ],
                            'value' => $data->status
                        ]
                    );
                }
            ],
            //'deleted',
            'created_at',
            'updated_at',
    
            [ 'class' => 'yii\grid\ActionColumn'],
        ],
    ]
); 

注意:只需确保将 url:'/controller/action', 更改为实际的 URL 和操作。如果您不使用 prettyUrl,则必须将其更改为 index.php?r=controller/action

编辑

我更新了上面的代码,将行的 idstatus 一起传递给您在 Controller 中的操作,该操作将获得如下所示的变量。

public function actionUpdate(){
   $status = Yii::$app->request->post('status');
   $id = Yii::$app->request->post('id');

}

关于javascript - Yii2 - 在 GridView 中使用 Ajax/Pjax 通过 switch toogle 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128417/

相关文章:

javascript - 单击事件不会使其他字段可一键编辑?

javascript - 如何仅显示elfinder(jquery文件管理器插件)中的文件夹列表

javascript - 错误页面总是在部分 View 中加载

javascript - 如何扩展 JQuery 的 ajax did() 方法?

php - 如何从网页上的文本框中而不是控制台获取 Ratchet 聊天应用程序中的输入?

javascript - 使用 jquery 更改 <br> 之后的文本

javascript - 前瞻表现得像在消耗

php - 堆栈在回显多次循环的结构中

php - Laravel 加入并从多个表中选择

php - Woocommerce 3 中的自定义结账字段和运输方式 ajax 交互