Проблемы с проверкой Zend (Zend_Validate_Db_NoRecordExists)

Я настраиваю страницу регистрации пользователя и проверяю поле имени пользователя, которое проверяет, во-первых, не существует ли пользователь, во-вторых, не является ли имя пользователя зарезервированным. Моя проблема заключается в том, что когда я прикрепляю два валидатора к элементу формы, он игнорирует вторую проверку. Вторая проверка будет работать только в том случае, если первая проверка будет удалена. Это ошибка? Если да, то как я могу это исправить?

Ниже приведены валидаторы:

    $validator = new Zend_Validate_Db_NoRecordExists(
                    array(
                        'table' => 'users',
                        'field' => 'username'
                    )
    );
    $validator->setMessage('Username %value% already exists', Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND);

    $reserved_validator = new Zend_Validate_Db_NoRecordExists(
                    array(
                        'table' => 'reserved_users',
                        'field' => 'name'
                    )
    );
    $reserved_validator->setMessage('Username %value% is not available', Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND);

Затем на элементе у меня есть:

            ->addValidator($validator)
            ->addValidator($reserved_validator)

person Paul    schedule 02.07.2011    source источник


Ответы (2)


Существует проблема при использовании двух валидаторов одного типа. Что вам нужно сделать, это добавить цепочку валидаторов:

$validatorChain = new Zend_Validate();
$validatorChain->addValidator($validator)                            
               ->addValidator($reserved_validator);

И просто добавьте цепочку к элементу.

->addValidator($validatorChain);
person Orlando    schedule 02.07.2011

Нет, это не ошибка, я бы сказал, что это так задумано. У вас может быть несколько типов валидаторов, но только один тип каждого. Вы должны посмотреть на валидатор БД, если он позволяет объединять таблицы. До сих пор я никогда не использовал валидаторы БД.

Обновить Только что заметил другой ответ, эта цепочка должна помочь.

person Adrian World    schedule 02.07.2011