2

我有一个自定义验证器 NoOtherUsed: 检查电子邮件是否已被其他用户使用

class Toxter_Validate_NoOtherUsed extends Zend_Validate_Abstract
{
    protected $_parameters;
    protected $_messageTemplates = array();
    const ALREADY_USED = 'alreadyused';

    public function __construct($parameters) {
      $this->_parameters = $parameters;      
      $this->_messageTemplates[self::ALREADY_USED] =  $this->_parameters['message'];
   }

    public function isValid($value)
    {
        $db = Zend_Registry::get('db');
        $sql = 'SELECT * FROM '.$this->_parameters['table'].' WHERE '.
                $this->_parameters['query_field'].' != \''. $this->_parameters['query_value'].
                '\' AND '.$this->_parameters['field'].' = \''.$value.'\'';

        $stmt = $db->query($sql);
        $result = $stmt->fetchall();
        $rowCount = sizeof($result);

        if($rowCount > 0){
            $this->_error(self::ALREADY_USED);
            return false;
        }

        return true;
    }
}

我以以下形式使用了这个验证器:

$this->createElement('text', 'email')
                        ->setLabel('Email')            
                        ->addValidator(new Zend_Validate_EmailAddress(), true)
                        ->addValidator(new Toxter_Validate_NoOtherUsed(array(
                            'table' => 'user',
                            'query_field' => 'id',
                            'query_value' => $currentUser->getRecord()->getId(),
                            'field' => 'email',
                            'message' => 'This email is used by another user'
                            )), true)
                        ->addValidator(new Toxter_Validate_NoOtherUsed(array(
                            'table' => 'email',
                            'query_field' => 'user_id',
                            'query_value' => $currentUser->getRecord()->getId(),
                            'field' => 'address',
                            'message' => 'This email is used by another user'
                        )), true)
                        ->addFilter(new Zend_Filter_StringTrim())

我使用了自定义验证器 2 次。我打算检查是否有其他用户使用此电子邮件并检查此电子邮件是否在电子邮件表上使用(包含所有电子邮件属于一个用户)。

问题是稍后的验证器将运行并正确检查,但另一个不会运行。所以我可以检查是否有用户使用了这封电子邮件,或者检查该电子邮件是否已经在其他人的电子邮件列表中。不能同时检查它们。

谁能给我一个理由?

谢谢!

4

1 回答 1

4

问题是附加到元素的验证器是由类名作为键的,所以第二个会覆盖第一个。

您需要做的是创建一个包含两个自定义验证器实例的验证器链,并将该链附加到您的元素。请参阅 ZF 问题跟踪器中此条目末尾的解决方法:

[#ZF-6904] 同一类的两个验证器不能对表单中的一个字段使用两次以验证 db 中的两个值 - Zend Framework 问题跟踪器

感谢JeremyKendall最初指出问题报告和解决方法。

于 2012-09-11T12:04:06.617 回答