Предотвращение множественных кликов и отправки ActiveForm в Yii 2.0.10

Я часто использую ActiveForms и считаю его удобным, так как он включает клиент сторонние сценарии проверки yii.js и yii.activeForm.js. Обычно он сам заботится о правилах модели и базовой проверке.

До Yii 2.0.9:
Мы могли бы использовать следующий скрипт для предотвращения отправки нескольких форм из-за быстрых нажатий кнопок:

$('form').submit(function(){
    $(this).find('button[type!="button"],input[type="submit"]').attr("disabled",true);
    setTimeout(function(){
        $('form .has-error').each(function(index, element) {
            $(this).parents("form:first").find(":submit").removeAttr("disabled");
        });
    },1000);
});

Но
Текущая версия Yii 2.0.10 привнесла некоторые изменения и не работает в приведенном выше сценарии. Теперь он не отправит форму, если будет выполнен приведенный выше код.
Это также обсуждалось ранее здесь и было определено как ошибка.
С тех пор в yii.js было два изменения:

  1. Ошибка № 10358: исправлено состояние гонки в предварительном фильтре yii.js AJAX (silverfire).
  2. Enh #12580: Приведите yii.js в соответствие со строгим и нестрогим режимами javascript, чтобы разрешить конкатенацию с внешним кодом (mikehaertl)

и yii.activeForm.js было четыре изменения:

  1. Ошибка № 10681: восстановлено исправление вызова события beforeValidate в yii.activeForm.js (silverfire).
  2. Enh #12376: Добавлен параметр в метод validate() yii.activeForm.js для принудительной проверки (DrDeath72).
  3. Enh #12499: Когда проверка AJAX включена, yii.activeForm.js принудительно запускает ее при отправке формы для отображения всех возможных ошибок (silverfire)
  4. Enh #12744: добавлено событие afterInit в yii.activeForm.js (werew01f)

Можно ли их заменить другими js-файлами из версии 2.0.9?

Приведет ли замена js-файлов к поломке и неожиданному поведению?

Есть ли лучшее решение для предотвращения многократной отправки?


person Kiran Shakya    schedule 13.01.2017    source источник
comment
Я пытался использовать ваш код, yii v2.0.10, добавил его через registerJs в мой файл макета, единственная разница, что я использую yii\bootstrap\ActiveForm вместо yii\widgets\ActiveForm, может быть, поэтому он работает для меня?   -  person Ripper    schedule 13.01.2017
comment
@Ripper это работает? вы видите, что кнопки отключаются после нажатия? Я тоже использую registerJs. что касается yii\bootstrap\ActiveForm и yii\widgets\ActiveForm, первая является улучшенной версией более поздней, поэтому технически это не должно иметь большого значения.   -  person Kiran Shakya    schedule 14.01.2017
comment
Да, я вижу, что он отключается сразу после клика, и форма отправляется как обычно, как я сказал ранее.   -  person Ripper    schedule 14.01.2017
comment
@Ripper, спасибо, что сообщили мне, что новые установки работают без этой проблемы.   -  person Kiran Shakya    schedule 15.01.2017


Ответы (4)


Похоже, что об этой проблеме уже позаботились.
У тех, кто установил свежий Yii 2.0.10 через композитор, этой проблемы не будет; в то время как те, кто загрузил архивный файл из раздела «Установить из архивного файла», могут по-прежнему иметь эту проблему, поскольку они могли не обновить архивные файлы.

Если вы столкнулись с этой конкретной проблемой, все, что вам нужно сделать, это заменить определенный файл framework/assets/yii.activeForm.js из исходник на гитхабе. В случае локальной копии этот файл может находиться по адресу vendor\yiisoft\yii2\assets\yii.activeForm.js.

person Kiran Shakya    schedule 15.01.2017

Я предлагаю вам использовать uiBlocking для предотвращения множественных кликов или записей. Вот полное руководство, как заблокировать пользовательский интерфейс, пока выполняется какая-то задача. http://malsup.com/jquery/block/

person Dani    schedule 16.01.2017
comment
uiBlocking действительно очень полезный плагин jQuery. Спасибо, что упомянули это здесь. - person Kiran Shakya; 16.01.2017

Работает как шарм

Я реализовал и протестировал следующее расширение:

https://github.com/Faryshta/yii2-disable-submit-buttons

Требуется композитор

"faryshta/yii2-disable-submit-buttons": "*"

Глобальная регистрация объекта

class AppAsset extends yii\web\AssetBundle
{
    public $depends = [
        'faryshta\\assets\\ActiveFormDisableSubmitButtonsAsset',
        // other dependencies
    ];
}

Использование

$form = ActiveForm::begin([
    'options' => ['class' => 'disable-submit-buttons'],
    // other configurations
]);

    // inputs

    Html::submitButton('Submit', [
        // optional, will show the value of `data-disabled-text` attribute
        // while handling the validation and submit
        'data' => ['disabled-text' => 'Please Wait']
    ])

$form->end();
person Jairus Martin    schedule 21.09.2017
comment
После просмотра хорошего списка решений на форумах stack-overflow и yii2, это решение мне понравилось, так как вы можете выбрать, какие формы вы хотите отключить после подачи заявки. - person Jairus Martin; 21.09.2017

Недавно возникла ошибка, из-за которой мои формы не отправлялись, а кнопка оставалась отключенной, поэтому я изменил ее на это. В основном размещаю его здесь для дальнейшего использования, чтобы я мог быстро найти его: D

<?php $this->registerJs("
    $(function () {
        $('body').on('submit', 'form', function() {
            $(this).find('button[type!=\"button\"],input[type=\"submit\"]').attr('disabled',true);
            setTimeout(function(){
                $(this).find('.has-error').each(function(index, element) {
                    $(this).parents('form:first').find(':submit').removeAttr('disabled');
                });
            },1000);
        });
    });
", View::POS_END, 'prevent-double-form-submit'); ?>
person Ripper    schedule 20.01.2017