カスタムバリデータ 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回使用しました。この電子メールを使用した別のユーザーがいるかどうかを確認し、この電子メールが電子メール テーブルで使用されているかどうかを確認します (すべての電子メールが 1 人のユーザーに属しています)。
問題は、後のバリデーターが実行されて正しくチェックされるが、もう一方のバリデーターが実行されないことです。したがって、このメールを使用したユーザーがいるかどうかを確認したり、他の人のメールリストにメールが既にあるかどうかを確認したりできます。両方ともチェックできません。
誰か理由を教えてくれませんか?
ありがとう!