Сообщение об ошибке Yii в CActiveForm не исчезнет - PullRequest
0 голосов
/ 30 марта 2012

Я пишу пару (пользовательских) валидаторов для моей формы, и все идет гладко, как всегда, но для одной маленькой проблемы.

У меня есть два поля: одно - ввод HTML выбора (иначе * 1003)*) а другой простой textField.

Я настроил свои валидаторы ajax таким образом, чтобы при выборе опции X на моем dropDownList текст в textField не может быть пустым.

ТАК, когда пользователь выбирает параметр X в dropDownList, появляется сообщение об ошибке (для dropDownList, обратите внимание): текстовое поле Y не может быть пустым .

Пока хорошо.Когда я затем нажимаю на textField, набираю некоторые вещи и щелкаю где-нибудь еще на экране, конечно же, валидатор ajax запускается, а ответ HTTP пуст, что означает, что в форме нет ошибок. Но сообщение об ошибке не исчезает!

Я предполагаю, что это как-то связано с тем, что я использую валидатор одного поля для clearErrors() другого поля, но не долженэто работа?Я дал правильное поле в качестве параметра для метода clearErrors().

Кто-нибудь знает, что может быть не так для меня?

Заранее спасибо

РЕДАКТИРОВАТЬ вот ссылка на мою модель формы: нажмите

, когда я изменяю target_constant или source_constant, на сервер запускается валидатор.Это работает, и я имею в виду, что ответ AJAX действительно отправляется сервером на мой валидатор, который запускается. Кроме того, , тело ответа не имеет сообщений об ошибках, но все равно сообщение об ошибках для target_reg или source_reg (в зависимости от того, на кого это было затронуто) не исчезает втот же момент.Только в следующем запросе / ответе сообщение об ошибке исчезнет.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2012

не добавляйте пользовательский "ID" с $form html-полями, подобными этому

$form->textField($model, 'test_field', array('id' => 'custom_id');

если необходимо добавить пользовательский идентификатор, вы должны указать название модели перед своим пользовательским идентификатором, например

$form->textField($model, 'test_field', array('id' => 'youModelName_custom_id');

другой обходной путь для пользовательского идентификатора - использовать имя пользовательского класса.

2 голосов
/ 12 мая 2012

Я только что посмотрел на это, но не смог найти что-то не так с вашим кодом.Кажется, что фактическая проверка работает (вы получаете правильные данные обратно), но Javascript (yiiactiveform.js) обновляет данные только для последнего отредактированного поля.Это противоречит проверке на стороне сервера, которая проверяет все поля.С пользовательской точки зрения имеет смысл отображать ошибку только для поля, которое вы в настоящее время редактируете, но когда у вас сложные взаимодействия, этого, конечно, немного не хватает.Я тут сильно откладывал, поэтому я нашел «решение».Вы можете использовать обратный вызов afterValidateAttribute для любого атрибута, чтобы принудительно отображать сообщения об ошибках с помощью $ .fn.yiiactiveform.updateInput:

    <div class="row">
    <?php echo $form->labelEx($model,'text'); ?>
    <?php echo $form->textField($model,'text'); ?>
    <?php echo $form->error($model,'text', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError)
    { 
        mSettings = $.fn.yiiactiveform.getSettings(form);
        $.fn.yiiactiveform.updateInput(mSettings.attributes[0], data, form)
    }')); ?>
</div>

Что он делает?в обратном вызове я получаю работу с некоторыми данными.Наиболее интересными здесь являются данные - это ответ JSON AJAX с ошибками для всех атрибутов.Затем в функции я получаю настройки для текущей формы.Это важно, потому что мне нужно найти объект атрибута, которым я хочу манипулировать.Затем я вызываю updateInput вручную и передаю объект атрибута, который я хочу изменить, а также данные и форму из обратного вызова.Проблема здесь в том, что вы должны выяснить, какой нулевой индекс в объекте атрибутов является вашим объектом.Я сделал это с помощью console.log.И вуаля, ваш атрибут обновляется.Я просто надеюсь, что не существует более легкого способа сделать это, и я трачу столько времени на это впустую.: Р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...