Запрос к базе данных для существующего имени пользователя с Zend и доктриной - PullRequest
1 голос
/ 04 ноября 2011

Я запрашиваю записи базы данных, чтобы проверить, существует ли имя пользователя таким образом:

$q = Doctrine_Query::create()
        ->from('Tcc_Model_User u')
        ->where('u.Username = ?', $input['Username']);

 $object = $q->fetchOne();

  if(is_object($object)) {

  // not sure what to do here

 } else {

 // ok to record

То, что я не могу заставить это работать, - это как показать сообщение о том, что имя пользователя уже занято рядом с полем Имя пользователя отправленной формы. Может ли кто-нибудь помочь мне? Очень ценю любую помощь. Спасибо

отредактировано:

Благодаря Drew010 я решил вышеуказанную проблему, добавив:

 $form->getElement('Username')->addError('Sorry, that username is already taken!');

в первом условном утверждении. Еще раз спасибо drew010.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Поскольку вы используете Zend_Form, существует валидатор, который может сделать это за вас.

См. Zend_Validate_DbNoRecordExists

Они дают пример для проверки того, что данное имя пользователя не существует в базе данных.

Вот пример из одного из моих приложений, третий валидатор проверяет, что имя пользователя еще не существует:

    $this->addElement('text', 'username', array(
        'label' => 'User Name:',
        'required' => true,
        'validators' => array('NotEmpty'),
        'decorators' => $this->elementDecorators,
        'validators' => array(
            array('StringLength', true, array('min' => 4,
                'messages' => array(
                    Zend_Validate_StringLength::TOO_SHORT =>
                    'Account username must be at least %min% characters'
                )
            )),
            array('Regex', true, array('pattern' => '/^\w(?:[\w\d\.\-_]+)(?:\w|\d)$/',
                'messages' => array(
                    Zend_Validate_Regex::NOT_MATCH =>
                    "The username contained invalid characters"
                )
            )),
            array('Db_NoRecordExists', true, array(
                'table' => 'accounts', 'field' => 'username',
                'messages' => array(
                    Zend_Validate_Db_NoRecordExists::ERROR_RECORD_FOUND =>
                    "An account with the username '%value%' is already registered"
                )
            ))
        )
    ));

Кроме того, для дальнейшего использования, если вы делаете расширенную проверку, которую вы не можете сделать с помощью валидатора, вы можете добавить ошибку к определенному элементу формы, например так:

if ($something_was_wrong) {
    $form->getElement('username')
         ->addError('Username already exists!');
}
0 голосов
/ 05 ноября 2011

Я бы создал отдельный валидатор на основе Doctrine, смоделированный на валидаторе Zend_Validate_Db_NoRecordExists, и добавил бы этот валидатор непосредственно к элементу

Валидатор:

class My_Validate_UsernameAvailable extends Zend_Validate_Abstract
    implements Zend_Validate_Interface
{
    const NOT_AVAILABLE = 'usernameAvailableNot';

    protected $_messageTemplates = array(
        self::NOT_AVAILABLE => "Username is not available",
    );

    public function isValid($value)
    {
        $q = Doctrine_Query::create()
            ->from('Tcc_Model_User u')
            ->where('u.Username = ?', $value);

        if ($q->fetchOne()){
            $this->_error(self::NOT_AVAILABLE);
            return false;
        }

        return true;
    }
}

Затем в формеприсоединяется к элементу имени пользователя:

'validators' => array(
    // your other valiadators
    array(new My_Validate_UsernameAvailable(), true),
),

Тогда в контроллере не требуется никакой дополнительной обработки.

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