Как проверить элемент на основе значения другого элемента? - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть идентификатор клиента и хеш уникального клиента. Когда я регистрирую эти данные, все работает нормально. Просто чтобы прояснить, я не генерирую хэш.

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

protected function _getValidator($field)
{
    return array(
        'Db_NoRecordExists',
        true,
        array(
            'table' => 'anunciantes',
            'field' => $field,
            'messages' => array(
                'recordFound' => ucfirst($field) . ' "%value%" is registered'
            )
        )
    );
}

Но когда мне нужно отредактировать этот Клиент, я хочу проверить, существует ли этот хеш, и принадлежит ли этот хэш этому Клиенту.

Как мне это сделать? Я уже пытался получить значение идентификатора, используя опцию ' exclude ' для db validator и передавая $this->getValue('id'), но этот вызов возвращает null.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2013

Вы должны добавить валидатор в вашей форме к этому полю, например ..

$name->addValidator(
    'Db_NoRecordExists', 
    true, 
    array(
        'table' => 'currencies',
        'field' => $field,
        'messages' => array( "recordFound" => "This Client Id already exists in our DB") ,
        'exclude' => array(
             'field' => 'id',
             'value' => $this->_attribs['id']
         )
    )
);
0 голосов
/ 28 декабря 2011

Чтобы проверить, если хеш уже существует и принадлежит определенному пользователю, вы можете использовать следующий валидатор с пользовательским условием исключения. Я предполагаю, что хеш - это скрытое текстовое поле, содержащее хеш из базы данных.

protected function _getEditValidator($field, $userId, $db = null)
{
    if ($db == null) $db = Zend_Db_Table::getDefaultAdapter();

    array(
        'Db_RecordExists',
        true,
        array(
            'table' => 'anunciantes',
            'field' => $field,
            'exclude' => $db->quoteInto('user_id = ?', $userId)
        )
    );
}

Это проверит, чтобы убедиться, что хеш, содержащийся в элементе, соответствует хешу в базе данных, которая принадлежит user_id. Мы переопределяем опцию exclude, чтобы сделать так, чтобы значение хеша совпадало с тем, которое установлено для данного идентификатора пользователя.

Запрос должен выглядеть примерно так:

SELECT `users`.`db_hash_col` FROM `users` WHERE (`db_hash_col` = :value) AND (user_id = 1234) LIMIT 1

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

if ($editing) {
    $this->getElement('hash')
         ->setValidators(
             array($this->_getEditValidator('db_hash_col',
                                            $this->getElement('id')->getValue());
}

Также в своем вопросе вы упомянули использование $this->getValue('id'); Я считаю, что на самом деле это должно быть $this->getElement('id')->getValue().

Надеюсь, это поможет.

...