2012-09-11 102 views
2

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

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次。我打算检查是否有其他用户使用此电子邮件并检查此电子邮件是否用于电子邮件表(包含所有电子邮件属于一个用户)。

问题是后面的验证器会正常运行并检查,但另一个不会运行。所以我可以检查是否有用户使用此电子邮件,或者检查电子邮件是否已经在其他人的电子邮件列表中。无法检查他们两个。

有人能给我一个理由吗?

谢谢!

+0

在这个自定义验证器中是否存在不存在于'Zend_Validate_Db_NoRecordExists'中的功能,我没有看到它... – RockyFord

回答

4

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

您需要做的是创建一个包含您的两个自定义验证器实例的验证器链,并将链连接到您的元素。请参阅变通方法在ZF问题跟踪此项目的结束:

[#ZF-6904] Two Validators of the same class can not be used two times for a field in form to validate two values in db - Zend Framework Issue Tracker

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

+0

感谢David Weinraub! 你帮我节省了很多时间。 –

+0

欢迎来到SO!如果答案有帮助,您可以通过点击空白的“检查”符号来“接受”它。有关更多详细信息,请参阅[faq](http://stackoverflow.com/faq)。 –