繁体   English   中英

如何将带有单独 API URL 响应的 ajax 返回给 YII2 中的控制器?

[英]How to return ajax with separate API URL response to controller in YII2?

我正在尝试使用 AJAX 调用 API URL。 我需要验证响应并更新数据库,所以我需要将它返回给控制器。 有没有办法做到这一点。 这是我的观点,JS 和控制器代码。

这是我的查看代码,其中我有一个单独的 URL 用于验证,即 API URL 视图

    <?php $form = ActiveForm::begin([
    'action' => ['users/renderstep3'],
    'validationUrl' => 'API URL',
    'options' => [
        'class' => 'comment-form'
         ]
      ]); ?>
      <?= $form->field($paymentmodel, 'customerId')->hiddenInput(['value'=> $userid])->label(false) ?>
      <?= $form->field($paymentmodel, 'owner')->textInput(['maxlength' => true]) ?>
     <div class="form-group">
           <?= Html::submitButton('Submit', ['class' => 'btn btn-success']) ?>
     </div>
     <?php ActiveForm::end(); ?>
  </div>

JS

    jQuery(document).ready(function($) {
    $('body').on('submit', '.comment-form', function(event) {
        event.preventDefault(); // stopping submitting
        var data = $(this).serializeArray();
        data.splice(0,1);
        var result = {};

        for ( i=0 ; i < data.length ; i++)
            {
            key = data[i].name.replace("UserPaymentDetails[", "").slice(0,-1);
            result[key] = data[i].value;
            }
        var url = $(this).attr('validationUrl');
        $.ajax({
           url: url,
            type: 'post',
            dataType: 'json',
            data: JSON.stringify(result)
        })
        .done(function(response) {
                return response;
        })
        .fail(function() {
            console.log("error");
        });

    });
});

控制器动作

       public function actionRenderstep3()
         {
         $model = new Users();
         $detailsmodel = new UserDetails();
         $paymentmodel = new UserPaymentDetails();

        if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $data = Yii::$app->request->post();
        print_r($data) ; exit;
        }

        if ($paymentmodel->load(Yii::$app->request->post()) && $paymentmodel->validate()) 
        {
        $paymentmodel->Status = 0;
        $paymentmodel->save();
        return $this->redirect(['index']);
        }
        return $this->render('renderstep3', [
       'model' => $model,
       'detailsmodel' => $detailsmodel,
       'paymentmodel' => $paymentmodel,
        ]);   }

提前致谢!!

在您的控制器中,您必须像这样更改操作才能使用 Ajax 进行验证。 我已经编辑了我的答案。 请注意,您可以删除自定义 js 代码以便像这样使用。

// ... The View file
<?php
$form = ActiveForm::begin([
    'action' => ['users/renderstep3'],
    'enableAjaxValidation' => true,
    'validationUrl' => 'API URL',
    'options' => [
        'class' => 'comment-form'
    ]
]);
?>
    <?= $form->field($paymentmodel, 'customerId')->hiddenInput(['value'=> $userid])->label(false) ?>
    <?= $form->field($paymentmodel, 'owner')->textInput(['maxlength' => true]) ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-success']) ?>
    </div>
<?php ActiveForm::end(); ?>

// ... Controller
public function actionRenderstep3()
{
    $model = new Users();
    $detailsmodel = new UserDetails();
    $paymentmodel = new UserPaymentDetails();

    if (Yii::$app->request->isAjax && $paymentmodel->load(Yii::$app->request->post())) {
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    if ($paymentmodel->load(Yii::$app->request->post())) {
        $paymentmodel->Status = 0;
        $paymentmodel->save(false); // Validate false, because we did the validation before
        return $this->redirect(['index']);
    }

    return $this->render('renderstep3', [
        'model' => $model,
        'detailsmodel' => $detailsmodel,
        'paymentmodel' => $paymentmodel,
    ]);
}

您可以在此处找到更多信息https://www.yiiframework.com/doc/guide/2.0/en/input-validation

<?php
$form = ActiveForm::begin([
            'action' => ['users/renderstep3'],
            'validationUrl' => 'API URL',//ajax validation hit to validationUrl if provide other wise validationUrl is action Url
            'options' => [
                'class' => 'comment-form'
            ]
        ]);
?>

并更改 js 中的一些代码,以下代码在表单提交之前调用

$('body').on('beforeSubmit', '.comment-form', function(event) 

在控制器中

在单一模型验证的情况下

if ($paymentmodel->load(Yii::$app->request->post())) {
    if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return yii\widgets\ActiveForm::validate($model);
    }

    $paymentmodel->Status = 0;
    if ($paymentmodel->save(false)) {
        return $this->redirect(['index']);
    }
}

在多模型验证的情况下

if ($model->load(Yii::$app->request->post())) {
    $detailsmodel->load(Yii::$app->request->post());
    $paymentmodel->load(Yii::$app->request->post());


    if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $return = yii\widgets\ActiveForm::validate($model);
        $return = \yii\helpers\ArrayHelper::merge(yii\widgets\ActiveForm::validate($detailsmodel), $return);
        $return = \yii\helpers\ArrayHelper::merge(yii\widgets\ActiveForm::validate($paymentmodel), $return);
        return $return;
    }

    //here is data saving or logic
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM