У меня два связанных поля в модели 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 в другой?
Вы можете добиться проверки на стороне клиента (с помощью 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 Объект $ form Объект формы jQuery * / performFullAjaxValidation = function ($ form) { var settings = $ form.data ("settings"); $ .each (settings.attributes, function () { this.status = 2; // принудительное подтверждение ajax }); $ form.data («настройки», настройки); // вызывать проверку ajax $ .fn.yiiactiveform.validate ($ form, function (data) { $ .each (settings.attributes, function () { $ .fn.yiiactiveform.updateInput (это, данные, $ form); }); $ .fn.yiiactiveform.updateSummary ($ form, data); }); }