Yii2 - предупреждающее сообщение перед отправкой - PullRequest
2 голосов
/ 15 марта 2019

У меня есть форма с двумя полями «a» и «b» при обновлении действия, если поле «b» изменяет событие «beforeSubmit», предупреждение модальной начальной загрузки отправляется пользователю без какой-либо кнопки OK или CANCEL, только информация в течение 5 секунд, по истечении этого времени автоматически сохраняется, если поле «b» действительно было изменено, если не изменено, сохранить модальные окна предупреждения об отсутствии.

Как мне отправить это условие с контроллера, чтобы посмотреть, где у меня есть JavaScript? может быть с ajax? но как?

Controller.php

public function actionUpdate()
    {
        $model = new Faqs();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {

            if ($model->oldAttributes["b"] != $model->b){
                sleep(5);
            }

            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

_form.php

$('#form').on('beforeSubmit', function(e) {
    if(old_B_attribute != current_B_attribute){ //example
        $('#modal').modal('show');
    }
});

Ответы [ 3 ]

1 голос
/ 16 марта 2019

Вы хотите сообщить пользователю, действительно ли значения атрибута были изменены перед отправкой формы.

Как мне поступить для этого

  • Создать отдельное действие в моем контроллере actionAttributeDirty(), которое будет проверяться, если выбранный атрибут был действительно изменен.
  • Тогда,используйте для формы обычный Html::button() вместо Html::submitButton().
  • Добавьте скрытое поле для хранения текущих записей id в форме.
  • Привязать событие click ккнопка, которая отправит вызов ajax на actionAttributeDirty() с id текущей записи.
  • Затем используйте функцию успеха, чтобы отобразить модальное окно, и используйте setTimeout с $.yiiActiveForm('submitForm'), чтобы вызватьотправка формы через 5 секунд.

Таким образом, в порядке, указанном выше,

actionAttributeDirty

public function actionAttributeDirty()
{
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $id = Yii::$app->request->post('id');
    $model = Faqs::findOne($id);
    $response = ['changed' => false];
    $isValidRequest = Yii::$app->request->isAjax && Yii::$app->request->isPost;

    if ($isValidRequest && $model->load(Yii::$app->request->post())) {
        //get the name of the fields from the dirty attributes
        $changedAttributes = array_keys($model->getDirtyAttributes());

        //if the attribute name exists in the dirty attributes
        if (!empty($changedAttributes) && in_array("b", $changedAttributes)) {
            $response['changed'] = true;
        }
    }
    return $response;
}

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

$form = \yii\widgets\ActiveForm::begin(['id' => 'form']);
echo \yii\helpers\Html::hiddenInput('id', $model->id);
echo \yii\helper\Html::button('save', ['id' => 'save-now']);
\yii\widgets\ActiveForm::end();

click Событие для кнопки

Добавьте следующее в верхней части экрана, где у вас естьform.

Примечание: измените url вызова ajax '/site/attribute-dirty' соответственно, где вы копируетеactionAttributeDirty() Я предполагаю, что вы скопируете его в контроллер сайта.

$js = <<< JS
    $('#save-now').on('click', function(e) {
        e.preventDefault();
        let form = $("#form");

        $.ajax({
            url:'/site/attribute-dirty',
            method:'post',
            data:form.serialize(),
        }).done(function(response){
            if(response.changed){
                $('#modal').modal('show');
                setTimeout(function(){form.yiiActiveForm('submitForm');}
                , 5000);
            }else{
                form.yiiActiveForm('submitForm');
            }

        }).fail(function(response){
            console.log(response.responseText);
        });
    });
JS;

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

РЕДАКТИРОВАТЬ

Нажатие Ввод не будетотправить форму в любом случае, так как нет кнопки отправки. Если вы хотите кнопку Enter для отправки формы, вы должны добавить следующее вместе со сценарием в верхней части представления, который вызовет событие clickкнопки save-now при каждом нажатии кнопки Enter на любом входе.

$("#form").on('keypress','input',function(e){
    e.preventDefault();
    if(e.keyCode===13){
        $("#save-now").trigger('click');
    }
});
0 голосов
/ 17 марта 2019

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

  $(function() {
    submitting = false;
  });

  $("form").on("beforeSubmit", function (event, messages, errorAttributes) {
    if (typeof(errorAttributes) === "undefined" || errorAttributes.length === 0) {
      $('#modal-confirm').modal('show');
      return submitting;
    }
  });

  var submit = function() {
    submitting = true;
    $("form").yiiActiveForm('submitForm');
  }

в модальном сообщении

  <button type="button" onclick="submit();">Confirm</button>
0 голосов
/ 16 марта 2019

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

На стороне клиента вы можете использовать

$(document).on("beforeValidate", "form", function(event, messages, deferreds) {
//   #code
// console.log('BEFORE VALIDATE TEST');
}).on("afterValidate", "form", function(event, messages, errorAttributes) {
// console.log('AFTER VALIDATE TEST');
 //#code
});

Затем выберите метод rules .

На стороне сервера вы также можете выбрать следующие события: (Для чего вы хотите) beforeValidate, afterValidate, BeforeSave, afterSave, ...

...