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回使用しました。この電子メールを使用した別のユーザーがいるかどうかを確認し、この電子メールが電子メール テーブルで使用されているかどうかを確認します (すべての電子メールが 1 人のユーザーに属しています)。

問題は、後のバリデーターが実行されて正しくチェックされるが、もう一方のバリデーターが実行されないことです。したがって、このメールを使用したユーザーがいるかどうかを確認したり、他の人のメールリストにメールが既にあるかどうかを確認したりできます。両方ともチェックできません。

誰か理由を教えてくれませんか?

ありがとう!

4

1 に答える 1

4

問題は、要素にアタッチされたバリデータがクラス名でキー付けされているため、2 番目のバリデータが最初のバリデータを上書きしていることです。

必要なことは、2 つのカスタム バリデータ インスタンスを含むバリデータ チェーンを作成し、そのチェーンを要素にアタッチすることです。ZF イシュー トラッカーのこのエントリの最後にある回避策を参照してください。

[#ZF-6904] データベース内の 2 つの値を検証するために、フォーム内のフィールドに対して同じクラスの 2 つのバリデーターを 2 回使用することはできません - Zend Framework Issue Tracker

最初に問題レポートと回避策を指摘してくれたJeremyKendallに感謝します。

于 2012-09-11T12:04:06.617 に答える