13

現在、ajax送信と検証を同時に実現しています。次のようなカスタム関数を使用しています:

    $('.edit_form').submit(function (e) {
        e.preventDefault();
        var form = $(this);
        var formData = $(this).serialize();
        if (form.find('.has-error').length) {
            return false;
        }

        $.ajax({
            url: form.attr("action"),
            type: form.attr("method"),
            data: formData,
            success: function (data) {
                 ...
            },
            error: function () {
                alert("Something went wrong");
            }
        });

    });

そして、これがphp側です。検証のために、私の設定は次のようになります。

$form = ActiveForm::begin([
    'id' => "some_form",
    'action' => ['user/edit'],
    'options' => ['class' => 'edit_form'],
    'enableAjaxValidation' => false,
    'enableClientValidation' => true,
]); ?>

私が必要とするものを達成するための最良の方法ではないと確信しています。特に、検証エラーが発生した場合に送信を防止するために使用するこの部分:

    if (form.find('.has-error').length) {
        return false;
    }

助言がありますか?Yii 2 の組み込み設定を使用して適切に ajax 送信と検証を行うにはどうすればよいですか?

4

3 に答える 3

4

ここで、いくつかの興味深い JavaScript 側の検証トリックを見つけました。

したがって、JavaScript 送信ボタンは次のようになります。

$('body').on('click', '#submit', function(e) {
  e.preventDefault();
  var yiiform = $('#my-form');
  $.ajax({
    type: yiiform.attr('method'),
      url: yiiform.attr('action'),
      data: yiiform.serializeArray(),
      success: function(data) {
        if(data.success == 'true') {
          window.location.href = 'http://my.success.page';
        } else {
          // here there is (maybe) the right way to trigger errors
          $.each(data, function(key, val) {
            yiiform.yiiActiveForm('updateAttribute', key, [val]);
          });
        }
      }
  });
}

引き起こされた:

<?= Button::widget([
    'label' => Yii::t('app', 'Submit'),
     'options' => [
        'id'=>'submit',
        'class' => 'btn btn-primary pull-right',
     ]]);?>

アクションコントローラーは次のように応答します。

...
if ($model->load(Yii::$app->request->post())) {
    Yii::$app->response->format = Response::FORMAT_JSON;
    if($model->save()) {
        return ['success'=>'true'];
    } else {
        return ActiveForm::validate($model);
    }
}
...

ActiveForm::validate() の詳細については、こちらを参照してください

于 2016-12-09T15:02:49.793 に答える