Проверка триггера 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 в другой?

Вы можете добиться проверки на стороне клиента (с помощью 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);
     });
 }