У меня два связанных поля в модели 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);
});
}