Некоректно работает ajax валидация

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Объект 417
Сообщения: 116
Зарегистрирован: 2012.06.08, 18:56
Контактная информация:

Некоректно работает ajax валидация

Сообщение Объект 417 »

Добрый день.

Нарисовалась тут такая проблема: есть форма с включенной ajax-валидацией. И вроде бы все работает: при неправильном заполнении поля появляется сообщение об ошибке. Но вот незадача, после исправления, сообщение об ошибке не пропадает. Подскажите, почему так?
Как я посмотрел, после исправления ошибки у блока row добавляется класс validating и все...

Заранее благодарю.

Контроллер:

Код: Выделить всё

<?php
/**
 * Пользовательская часть модуля.
 */
class IndexController extends FrontController
{
    /**
     * Регистрация нового пользователя.
     * @return void
     */
    public function actionregistration()
    {
        if(!Yii::app()->user->isGuest)
            $this->redirect(Yii::app()->homeUrl);
            
        $this->_pageTitle = '';
        $this->_pageDescription = '';
        $this->_pageKeyWords = '';
        
        $user = new MUser();
        $user->scenario = 'registration';
        $this->performAjaxValidation($user);
        
        if(isset($_POST['MUser'])) {
            die('конец');
        }
        
        $this->render('registration', array(
            'user'=>$user,
        ));
    }
    
    /**
     * Ajax валидация форм.
     * @param object $model Модель, которую надо проверить
     * @return void
     */
    protected function performAjaxValidation($model)
    {
        if(isset($_POST['ajax']) && $_POST['ajax']==='user-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
} 
Предстакление:

Код: Выделить всё

<?php $form = $this->beginWidget('ActiveForm', array(
    'id' => 'registration',
    'enableAjaxValidation' => true,
    'enableClientValidation' => true,
    'focus' => array($user,'login'),
    'clientOptions' => array(
        'validateOnSubmit' => true,
        'validateOnChange' => true,
    ),
)); ?>

<div class="row">
    <?php echo $form->errorSummary($user); ?>
</div>

<div class="row">
    <?php echo $form->label($user, 'login'); ?>
    <?php echo $form->textField($user, 'login'); ?>
    <?php echo $form->error($user,'login'); ?>
</div>

<div class="row">
    <?php echo $form->label($user, 'password'); ?>
    <?php echo $form->textField($user, 'password'); ?>
    <?php echo $form->error($user,'password'); ?>
</div>

<div class="row">
    <?php echo $form->label($user, 'password2'); ?>
    <?php echo $form->textField($user, 'password2'); ?>
    <?php echo $form->error($user,'password2'); ?>
</div>

<div class="row">
    <?php echo CHtml::submitButton('Зарегистрироваться'); ?>
</div>

<?php $this->endWidget(); ?>
Модель (правила валидации):

Код: Выделить всё

public function rules()
    {
        return array(            
            array('login', 'length', 'min' => 6, 'max' => 16),
            array('login', 'match', 'pattern' => '/^([A-Za-z0-9 ]+|[А-Яа-я0-9 ]+)$/u', 'message' => 'Логин содержит недопустимые символы.'),
            
            array('password, newPassword', 'length', 'min' => 6, 'max'=>50),
            array('password, newPassword', 'match', 'pattern' => '/^([A-Za-zА-Яа-я0-9]+)$/u', 'message' => 'Пароль содержит недопустимые символы.'),
            
            array('group', 'numerical'),    
            array('group', 'default', 'value' => MUserGroup::getDefaultGroup()->id),
            
            array('theme', 'in', 'range' => array('relative', 'sky')),
            array('theme', 'default', 'value' => 'sky'),
            
            array('are_delete', 'default', 'value' => 0),
            
            array('img', 'ImageValidator', 'mime' => array('image/jpg', 'image/jpeg', 'image/png'), 'maxWidth' => 150, 'maxHeight' => 150),
            
            // Регистрация.
            array('login, password, password2, , verifyCode', 'required', 'on' => 'registration'),
            array('login', 'unique', 'on' => 'registration'),
            array('password2', 'compare', 'compareAttribute' => 'password', 'on' => 'registration'),
            array('verifyCode', 'captcha', 'allowEmpty' => !extension_loaded('gd'), 'on' => 'registration'),
            
            // Вход в систему. 
            array('login, password', 'required', 'on' => 'login'),
            array('password', 'authenticate', 'on' => 'login'),    
            
            // Администрирование личных данных пользователя.
            array('login', 'required', 'on' => 'adminProfile'),
            array('login', 'unique', 'on' => 'adminProfile'),
            
            // Редактирование своих личных данных.
            array('newPassword2', 'compare', 'compareAttribute'=>'newPassword', 'on' => 'editProfile'),
            array('oldPassword', 'checkOldPassword', 'on' => 'editProfile'),
        );
    } 
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Некоректно работает ajax валидация

Сообщение futbolim »

Попробуйте поиграться с параметрами формы, может даже

Код: Выделить всё

'enableAjaxValidation' => true, 
убрать. Была такая проблема, ушла сама.
Объект 417
Сообщения: 116
Зарегистрирован: 2012.06.08, 18:56
Контактная информация:

Re: Некоректно работает ajax валидация

Сообщение Объект 417 »

Точно. Убрал и все заработало. Спасибо.

А не поможете еще одну проблему решить:
В этой форме есть 2 поля password и password2 и правило валидации:

Код: Выделить всё

array('password2', 'compare', 'compareAttribute' => 'password', 'on' => 'registration'), 
Сначала, заполняем поля разными значениями - поле password2 сообщает об ошибке. Теперь в поле password вводим такое же значение. А ошибка не пропадает.

Как я понял, это потому что поле password2 не было изменено, и повторная проверка не прошла. не подскажите,как быть в таком случае?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Некоректно работает ajax валидация

Сообщение futbolim »

попробовал, у меня тоже так. где то в переменной сохраняется последний метод валидации (в данном случае сравнение паролей). интересный случай, если вызвать валидацию другого метода (к примеру ввести пароль "фф", а пароль должен быть не менее 3-х символоы), то валидация на сравнение опять начинает работать.
Вот.
Но я думаю, Вам не стоит беспокоиться по этому поводу. надпись пропадает при сабмите. Всё, что могу сказать (:

UPD. Вобщем надо лезть в глубины фреймворка для исправления бага, пока на это времени нет.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Некоректно работает ajax валидация

Сообщение lancecoder »

скорее всего надо перевернуть и продублировать правило
array('password2', 'compare', 'compareAttribute' => 'password', 'on' => 'registration'),
array('password', 'compare', 'compareAttribute' => 'password2', 'on' => 'registration'),

тогда валидация будет по 2 полям, а так он просто валидирует 1 и сверяет его (с не валидирующем) вторым
Объект 417
Сообщения: 116
Зарегистрирован: 2012.06.08, 18:56
Контактная информация:

Re: Некоректно работает ajax валидация

Сообщение Объект 417 »

lancecoder писал(а):скорее всего надо перевернуть и продублировать правило
array('password2', 'compare', 'compareAttribute' => 'password', 'on' => 'registration'),
array('password', 'compare', 'compareAttribute' => 'password2', 'on' => 'registration'),

тогда валидация будет по 2 полям, а так он просто валидирует 1 и сверяет его (с не валидирующем) вторым
Пробовал, тогда исчезает только одна ошибка...

Ну да ладно, правильно сказали:
Объект 417 писал(а):Но я думаю, Вам не стоит беспокоиться по этому поводу. надпись пропадает при сабмите. Всё, что могу сказать (:
Всем большое спасибо за помощь!
Ответить