Yii2 - отправка ActiveForm ajax

Как я могу использовать ActiveForm с этими требованиями?

  • Отправить форму с помощью ajax.

  • Перед отправкой с помощью ajax: проверьте, не возникает ли ошибка.

  • После отправки: отображать ошибку поля под полем ввода, если сервер отвечает неудачным результатом сохранения.


person Văn Thái Nguyễn    schedule 08.02.2015    source источник
comment
Собственно, это как раз то, что Yii уже предоставляет с ActiveForm — включая JavaScript для автоматической проверки на клиенте перед отправкой данных на сервер.   -  person robsch    schedule 12.02.2015
comment
@robsch Он не отправляет форму с помощью AJAX, о чем спрашивает пользователь.   -  person TheStoryCoder    schedule 13.12.2016


Ответы (2)


Это ваша форма в поле зрения. Я предпочитаю использовать разные действия для проверки и сохранения. Вы можете объединить их в один метод.

<?php $form = \yii\widgets\ActiveForm::begin([
    'id' => 'my-form-id',
    'action' => 'save-url',
    'enableAjaxValidation' => true,
    'validationUrl' => 'validation-rul',
]); ?>

<?= $form->field($model, 'email')->textInput(); ?>

<?= Html::submitButton('Submit'); ?>
<?php $form->end(); ?>

В действии проверки вы должны написать. Он проверяет вашу форму и возвращает список ошибок клиенту. :

public function actionValidate()
{
    $model = new MyModel();
    $request = \Yii::$app->getRequest();
    if ($request->isPost && $model->load($request->post())) {
        \Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
}

И это действие сохранения. При проверке входных данных для безопасности:

public function actionSave()
{
    $model = new MyModel();
    $request = \Yii::$app->getRequest();
    if ($request->isPost && $model->load($request->post())) {
        \Yii::$app->response->format = Response::FORMAT_JSON;
        return ['success' => $model->save()];
    }
    return $this->renderAjax('registration', [
        'model' => $model,
    ]);
}

Этот код проверит вашу форму в actionValidate() и. Для отправки формы через AJAX используйте событие beforeSubmit. В вашем файле javascript напишите:

$(document).on("beforeSubmit", "#my-form-id", function () {
    // send data to actionSave by ajax request.
    return false; // Cancel form submitting.
});

Это все.

person Haru Atari    schedule 03.09.2015
comment
Мне нужно решить, следует ли возвращать false или true на основе ответа на вызов Ajax. Но перед ответом ajax выполняется возврат false. Пожалуйста, предложите мне способ сделать это. - person Pravinraj Venkatachalam; 03.01.2018
comment
@Pravin Ajax является асинхронным, и вы не можете вернуть результат из его ответа в целом. Я плохо знаю javascript. Но вы можете найти async/await. Может быть, это поможет вам. - person Haru Atari; 11.01.2018
comment
Также см. руководство — отправка формы ajax: yiiframework.com/doc/guide/2.0/en/ - person lubosdz; 11.04.2020

Отправить форму с помощью ajax. Перед отправкой с помощью ajax: проверьте, не возникает ли ошибка. yii отображает ошибку, если она есть по умолчанию...... :)

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\widgets\Pjax;

/* @var $this yii\web\View */
/* @var $model backend\models\search\JobSearch */
/* @var $form yii\bootstrap\ActiveForm */
?>

<div class="job-search">

    <?php $form = ActiveForm::begin([
        'action' => ['index'],
        //'method' => 'get',
        'options' => ['id' => 'dynamic-form111']
    ]); ?>

    <?php echo $form->field($searchModel, 'id') ?>

    <?php echo $form->field($searchModel, 'user_id') ?>

    <?php echo $form->field($searchModel, 'com_id') ?>

    <?php echo $form->field($searchModel, 'job_no') ?>

    <?php echo $form->field($searchModel, 'court_id') ?>

    <?php // echo $form->field($model, 'case_no') ?>

    <?php // echo $form->field($model, 'plainttiff') ?>

    <?php // echo $form->field($model, 'defendant') ?>

    <?php // echo $form->field($model, 'date_fill') ?>

    <?php // echo $form->field($model, 'court_date') ?>

    <?php // echo $form->field($model, 'status_id') ?>

    <?php // echo $form->field($model, 'created_at') ?>

    <?php // echo $form->field($model, 'updated_at') ?>

    <div class="form-group">
        <?php echo Html::submitButton('Search', ['class' => 'btn btn-primary','id'=>'submit_id']) ?>
        <?php echo Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>  
<script type="text/javascript">
    $(document).ready(function () {
        $('body').on('beforeSubmit', 'form#dynamic-form111', function () {
            var form = $(this);
            // return false if form still have some validation errors
            if (form.find('.has-error').length) 
            {
                return false;
            }
            // submit form
            $.ajax({
            url    : form.attr('action'),
            type   : 'get',
            data   : form.serialize(),
            success: function (response) 
            {
                var getupdatedata = $(response).find('#filter_id_test');
                // $.pjax.reload('#note_update_id'); for pjax update
                $('#yiiikap').html(getupdatedata);
                //console.log(getupdatedata);
            },
            error  : function () 
            {
                console.log('internal server error');
            }
            });
            return false;
         });
    });
</script>
person Kalpesh Desai    schedule 06.01.2016