1

我有一个表格,用于检查 2 个表中的数据库中是否存在电子邮件。

我使用 Zend_Validate_Db_NoRecordExists 进行两个验证,但它只检查第二个。

知道为什么它不起作用吗?

class Application_Form_ReferUser extends Zend_Form
{
public $email, $freeDownload, $buyNow;

public function init()
{
    $this->setName('referUser');

    $EmailExists = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'referrals',
            'field' => 'email'
        )
    );

    $EmailExists2 = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'users',
            'field' => 'email'
        )
    );

    $EmailExists->setMessage('This e-mail is already taken');
    $EmailExists2->setMessage('This e-mail is already taken');

    $this->email = $this->createElement('text', 'email')
                     ->setLabel('Email')
                     ->addValidator($EmailExists)
                     ->addValidator($EmailExists2)
                     ->addValidator('EmailAddress')
                     ->setRequired(true);

    $this->freeDownload = $this->createElement('button', 'btn_free_download')
                            ->setLabel('Free Download')
                            ->setAttrib('type', 'submit');

    $this->buyNow = $this->createElement('button', 'btn_buy_now')
                            ->setLabel('Buy Now')
                            ->setAttrib('type', 'submit');

    $this->addElements(array($this->email, $this->freeDownload, $this->buyNow));

    $elementDecorators = array(
        'ViewHelper'
    );
    $this->setElementDecorators($elementDecorators);
}
}
4

4 回答 4

1

我认为您不会在一个元素上多次添加相同的验证器。检查类Zend_Form_Element addValidator()第 1153 行。根据代码$this->_validators[$name] = $validator;,当我们向一个元素多次添加相同的验证器时,前者将被覆盖。

我认为您必须创建一个自定义表单验证器或isValid()在元素上单独使用并验证它。

于 2012-12-19T11:01:42.613 回答
1

使用这个:

addValidators (array $ validators, $ files = null)

伊姆:

$this->addValidators(array($EmailExists,$EmailExists2,'EmailAddress'));

我自己工作

于 2012-12-18T21:21:29.197 回答
1
$this ->addElement($email = new Zend_Form_Element_Text('email'));   

$email->setLabel('E-mail')
      ->addValidator('Db_NoRecordExists', false, array('table' => 'table1', 'field' => 'email'))
      ->addValidator('Db_NoRecordExists', false, array('table' => 'table2', 'field' => 'email'))
      ->addValidator('EmailAddress', false);
于 2012-12-19T03:22:34.950 回答
1

试试下面的东西(未经测试的),

$emailNotEmpty = new Zend_Validate_NotEmpty();
        $emailNotEmpty->setMessage('You must enter a email address.');
        $emailFormat = new Zend_Validate_Regex('/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/');
        $emailFormat->setMessage('You must enter a valid email address.');
        $emailUnique1 = new Zend_Validate_Db_NoRecordExists('referrals', 'email');
        $emailUnique1->setMessage('This email address is already registered.');
        $emailUnique2 = new Zend_Validate_Db_NoRecordExists('users', 'email');
        $emailUnique2->setMessage('This email address is already registered.');
        $email = new Zend_Form_Element_Text('email', array(
          'label' => 'Email Address:',
          'class' => 'text-size text hastip',
          'title' => $qtips_messages['key_email'],
          'tabindex' => '2',
          'required' => true,
          'value'=> '',
          'filters' => array('StringTrim'),
          'validators' => array(
            array($emailNotEmpty, true),
            array($emailFormat, true),
            array($emailUnique1,true),
            array($emailUnique2,true),
          ),
      'decorators' => $this->requiredElementDecorators,
      'description' => '<img src="../../images/star.png" alt="required" />',
        ));
        $this->addElement($email);
于 2012-12-19T05:33:46.400 回答