Запуск проверки поля Yii при замене другого поля

У меня есть два связанных поля в модели Yii. Это items_per и items_period.

items_per - это целое число, которое отражает количество элементов, которые будут обработаны за определенный период времени.

items_period - количество секунд в этом периоде (раскрывающийся список с параметрами, помеченными как секунды, минуты, часы). Умножьте items_per на items_period, и у вас будет "количество элементов в секунду".

У меня есть настраиваемое правило проверки, ограничивающее количество элементов в секунду, превышающее определенное количество. Это все работает нормально и дает разумное сообщение об ошибке с использованием проверки AJAX при изменении значения в поле items_per (на размытие).

Мне нужно, чтобы проверка по полю items_per запускалась при каждом изменении поля items_period (100 / секунда может быть не разрешена, но 100 / минута есть).

Я попытался добавить функцию onchange в выпадающий список items_per, чтобы вызвать "размытие" или "изменение" в поле items_per, но, похоже, Ajax-запрос на проверку не выполняется. Отправка формы только для запуска проверки не является вариантом, так как возможно, что в ней не будет ошибок, и просто сохраните запись до того, как пользователь будет готов.

Любые предложения, как я могу заставить одно поле для запуска проверки AJAX в другом?

2 ответа

Решение

Вы можете выполнить проверку на стороне клиента (с помощью JS) через AJAX и для простых запросов все вместе в одном пакете, если вы определите собственный валидатор, расширяющий CValidator,

Для "простой" проверки установите валидатор с правильными именами и параметрами атрибута и переопределите validateAttribute метод.

Для проверки на стороне клиента, дополнительно переопределите clientValidateAttribute метод. Если для формы включена проверка клиента, это приведет к тому, что ваш пользовательский JS будет автоматически вызываться для проверки ввода. Из переопределения вы будете выводить код JS, который выполняется в этом контексте:

function(value, messages, attribute) {
    // your code goes here
    // value: current value of attribute
    // messages: array of strings (validation errors) you should append to
    // attribute: name of the attribute
}

Вы можете увидеть пример работы встроенных валидаторов в этой среде. Также см CActiveForm.clientOptions,

Для проверки AJAX вы можете отправить форму для проверки. Идея состоит в том, что вы настраиваете валидацию для включения специального параметра (например, ajax=something) или исключить один (например, чтобы не включать значение вашей кнопки отправки). Фактически, Yii уже делает это, автоматически включая ajax=formId параметр во всех запросах проверки AJAX!

Таким образом, вы можете легко написать код контроллера, который всегда проверяет, но сохраняет только тогда, когда это необходимо. Пример этого тоже есть в справочнике Yii для CActiveForm (ищите "Чтобы ответить на запросы проверки AJAX, нам нужен следующий код класса: ").

Наконец, вы можете программно установить статус проверки для любого атрибута с помощью Javascript, вызвав $.fn.yiiactiveform.updateInput, Если вы сделаете это, было бы неплохо продолжать имитировать Yii, вызывая $.fn.yiiactiveform.updateSummary также.

Я создал следующую функцию javascript, которую я вызываю вручную при изменении определенных полей. Он выполняет проверку AJAX для всех элементов формы.

/ **
 * @author marcovtwout
 * Принудительное выполнение полной проверки AJAX для данной формы.
 * @param Object $form jQuery объект формы
 */
executeFullAjaxValidation = function($form){
    var settings = $form.data("настройки");
    $.each(settings.attributes, function () {
        this.status = 2; // принудительная проверка ajax
    });
    $form.data("настройки", настройки);

    // запуск проверки AJAX
    $.fn.yiiactiveform.validate($form, function (data) {
        $.each(settings.attributes, function () {
            $.fn.yiiactiveform.updateInput(this, data, $form);
        });
        $.fn.yiiactiveform.updateSummary($form, data);
    });
}
Другие вопросы по тегам