如何根据另一个元素的值验证元素?

时间:2011-12-28 14:39:43

标签: php oop zend-framework zend-form zend-validate

我有一个客户端ID和一个唯一客户端哈希。当我注册这些数据时,它工作正常。 为了清楚起见,我没有生成哈希值。

我用来验证该唯一哈希是否已存在的代码:

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

但是当我必须编辑该客户端时,我想验证该哈希是否已经存在,以及该哈希是否属于该客户端。

我是怎么做到的?我已经尝试使用db validator的“排除”选项并传递$this->getValue('id')来获取id的值,但该调用返回null

2 个答案:

答案 0 :(得分:0)

要验证散列是否已存在且属于特定用户,您可以将以下验证程序与自定义排除条件一起使用。我假设散列是一个隐藏的文本字段,包含数据库中的散列。

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选项,使得hash值必须与给定用户id的设置匹配。

查询应该大致如下:

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()

希望有所帮助。

答案 1 :(得分:0)

你必须在表单中删除一个验证器,如...

$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']
         )
    )
);