Запуск проверки поля 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); }); }