为了账号安全,请及时绑定邮箱和手机立即绑定

yii2,使用新数据部分渲染视图

yii2,使用新数据部分渲染视图

PHP
GCT1015 2023-04-21 10:25:24
yii2 和 PHP 的新手,在这里遇到了问题。基于这篇文章和这篇文章,我尝试重新创建 AJAX 调用。现在,使用 Kartik SwitchInput 小部件,我至少尝试将值输入控制器,然后将其返回到索引页面上的另一个位置。这是视图中的内容...<?= GridView::widget([    'dataProvider' => $customers,    'columns' => [        ...        [            'label' => 'Status',            'format' => 'raw',            'attribute' => 'status',            'value' => function($models){                return SwitchInput::widget([                    'name' => $models->id,                    'value' => $models->status,                    'pluginEvents' => [                        'switchChange.bootstrapSwitch' => 'function(e) {                             $.ajax({                                method: "POST",                                url: "'.Url::to(['update-status']).'",                                data: { "status": e.currentTarget.checked, "id": e.currentTarget.name },                                error:function(res){                                    console.log(res.responseText);                                }                            })                            console.log(`${e.currentTarget.checked}  ${e.currentTarget.name}`);                        }'                    ]...这是控制器:class CustomerController extends Controller{    public function actionIndex(){        $customers = new ActiveDataProvider([            'query' => Customer::find()        ]);        $models = $customers->getModels();        return $this->render('index', [             'customers' => $customers,            'models' => $models        ]);    }    public function actionUpdateStatus(){        $status = Yii::$app->request->post('status');        $id = Yii::$app->request->post('id');        return $this->renderPartial('index', [            'status' => $status,            'id' => $id        ]);    }}每当我拨动开关时,它都会返回 500 内部错误。Console.logging 它显示:$customers 未定义。据我所知,每当我调用 actionUpdateStatus 时,Yii 都会完全重新呈现视图,并尝试找到不在 UpdateStatus 中的 $customers。那么,如何将开关数据分别返回到同一视图中呢?
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我没有指定一件事是重新加载 gridview,这不是那里的要求,但可以使用$.pjax.

您需要注意的几件事

  • updateStatus根据您的要求,您不需要任何视图来执行操作。

  • 您只需要将一些状态代码返回到您在 gridView 中用于切换输入的 ajax 调用,并刷新您的 gridview 以加载新的更新状态。

  • 在 ajax 成功回调函数中检查状态代码是否正常,那么您应该刷新 gridview 而不是使用 render partial。

  • 你没有更新任何内容updateStatus?你需要切换状态

所以将您的操作更改为以下内容

public function actionUpdateStatus()

{

    try {

        $status = Yii::$app->request->post('status');

        $id = Yii::$app->request->post('id');


        $model = Customer::findOne($id);

        $model->status=$status;

        if(!$model->save()){

           throw new Exception(implode("\n",\yii\helpers\ArrayHelper::getColumn($model->errors,'0'));

        }

        return $this->asJson(['success' => true]);

    } catch (Exception $e) {

        return $this->asJson(['success' => false, 'message' => $e->getMessage()]);

    }

}

确保已将 GridView 包装在 Pjax 开始和结束内,并将 an 添加id到 Pjax 小部件


<?php 

    Pjax::begin(['id'=>'pjax-container']);


    echo GridView::widget([

    'dataProvider' => $customers,

    'columns' => [

    .......

    ]);


    Pjax::end();

 ?>

您对以下内容的 ajax 调用


'switchChange.bootstrapSwitch' => 'function(e) {

    $.ajax({

        method: "POST",

        url: "'.Url::to(['update-status']).'",

        dataType:'json',

        data: { "status": e.currentTarget.checked, "id": e.currentTarget.name },

        success:function(data){

             if(data.success){

                  $.pjax({container: "#pjax-container"});

             }else{

                  console.log(data.message);

             }

        },

        error:function(res){

            console.log(res.responseText);

        }

    });

}'


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信