8

ユーザーのメールアドレスの入力フィールドを生成するための次のコードがあります

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email:')
    ->addFilters(array('StringTrim', 'StripTags'))
    ->addValidator('EmailAddress')
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
                                                        array(
                                                                'adapter'=>Zend_Registry::get('user_db'),
                                                                'field'=>'email',
                                                                'table'=>'tbl_user'
                                                                )))
    ->setRequired(true)
    ->setDecorators(array(
                            array('Label', array('escape'=>false, 'placement'=>'append')),
                            array('ViewHelper'),
                            array('Errors'),
                            array('Description',array('escape'=>false,'tag'=>'div')),
                            array('HtmlTag', array('tag' => 'div')),
                        ));
$this->addElement($email);

ここで問題となるのは、ユーザーが電子メールに無効なホスト名を入力すると、3つのエラーが発生することです。ユーザーが電子メールアドレスとして「admin@l」と入力すると、エラーは次のようになります。 *
「l」は電子メールアドレスの有効なホスト名では
ありません。
l'はローカルネットワーク名のようですが、ローカルネットワーク名は許可されていません

これらすべてではなく、1つのカスタムエラーのみを発生させたいだけです。addErrorMessageメソッドでエラーメッセージ「InvalidEmailAddress」を設定すると、db_validationに対して同じメッセージが再度生成されます。

4

5 に答える 5

8

まあ、それは遅い答えですが、私は常に役立つと思います。

addValidator()の2番目のパラメーターとしてtrueを追加するだけです

Zendドキュメント(http://framework.zend.com/apidoc/1.8/)から:

addValidator(67行目)

チェーンの最後にバリデーターを追加します

$ breakChainOnFailureがtrueの場合、バリデーターが失敗すると、チェーン内の次のバリデーターが存在する場合は実行されません。

return:流暢なインターフェースを提供します

アクセス:パブリック

ここに署名があります:

Zend_Validate addValidator (Zend_Validate_Interface $validator, [boolean $breakChainOnFailure = false])

Zend_Validate_Interface $validator
boolean $breakChainOnFailure

したがって、コードは次のとおりです。

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email:')
    ->addFilters(array('StringTrim', 'StripTags'))
    ->addValidator('EmailAddress',  TRUE  ) // added true here
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
                array(
                        'adapter'=>Zend_Registry::get('user_db'),
                        'field'=>'email',
                        'table'=>'tbl_user'
                        ), TRUE )
            );
于 2011-03-29T07:56:43.980 に答える
5

Zend_Validate_EmailAddressクラスのインスタンスを作成し、setMessagesメソッドを呼び出してから、必要なメッセージをオーバーライドして、次のようなメッセージを削除する必要があります。

$emailValidator->setMessages(array(
    Zend_Validate_EmailAddress::INVALID_FORMAT => "Your error message",
    Zend_Validate_Hostname::INVALID_HOSTNAME => "Your error message",
    Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED => "Your error message"
));

私はこれが誰かを助けることを願っています:-)

于 2011-06-26T19:52:05.413 に答える
2
$email->addErrorMessage("Please Enter Valid Email Address");

カスタムバリデーターを使用できます。フォルダ内にファイルEmail.phpを作成しますプロジェクトのルートにあるライブラリフォルダで検証します

class Validate_Email extends Zend_Validate_Abstract
{

    const INVALID = 'Email is required';
    protected $_messageTemplates = array(
    self::INVALID => "Invalid Email Address",
    self::ALREADYUSED => "Email is already registered"
    );

     public function isValid($value)
     {
          if(preg_match($email_regex, trim($value))){
            $dataModel = new Application_Model_Data(); //check if the email exists
            if(!$dataModel->email_exists($value)){
                return true;
            }
            else{
                $this->_error(self::ALREADYUSED);
                return false;
            }
          }
          else
          {
            $this->_error(self::INVALID);
            return false;
          }
     }
}

そしてあなた のform.phpファイル

    $mailValidator = new Validate_Email();
    $email->addValidator($mailValidator, true);

それが機能するかどうかはわかりませんが、私にとっては電話の場合は機能しました。http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/の礼儀

于 2010-12-21T07:46:14.293 に答える
0

カスタムバリデーターを使用することが、この問題を回避するために私が見つけた唯一の方法です。

必要なものが次の場合:

  • メールアドレスの形式が間違っている場合、エラーメッセージが1つだけ表示される
  • フォーマットが適切な場合は、電子メールアドレスがすでにデータベースにあるかどうかを検証します

次に、次のようなことを行うことをお勧めします。

$where = array('users', 'email', array('field' => 'user_id',
                                       'value' => $this->getAttrib('user_id')));
$email = new Zend_Form_Element_Text('email');
$email->setLabel('E-mail:')
      ->setRequired(true)
      ->setAttrib('required name', 'email') // html5
      ->setAttrib('maxlength', '50')
      ->addFilter('StripTags')
      ->addFilter('StringTrim')
      ->addFilter('StringToLower')
      ->addValidator('email', true)
      ->addValidator('stringLength', true, array(1, 50))
      ->addValidator('db_NoRecordExists', true, $where)
      ->addDecorators($this->_elementDecorators);
$this->addElement($email);

$this->getAttrib('user_id')現在のユーザーのIDを表します。

ここには3つのバリデーターがあり、それらはすべて2番目のパラメーター$breakOnFailureがに設定されてfalseいるため、バリデーターが失敗した場合、他のバリデーターは呼び出されません。

最初のバリデーターはemailで、これは私自身のカスタムバリデーターです。

class My_Validate_Email extends Zend_Validate_EmailAddress
{
    public function getMessages()
    {
        return array('invalidEmail' => 'Your email address is not valid.');
    }
}

このバリデーターをライブラリ、たとえば/ application / library / My / Validateに追加 $this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator'); してから、フォームに追加できます。もちろん、「My」をライブラリの名前に置き換える必要があります。

これで、メールの形式が間違っていると、常に「あなたのメールアドレスは無効です。」と表示されます。メールが長すぎてデータベースフィールドに収まらない場合(たとえば、VARCHAR(100))、stringLengthバリデーターエラーが表示されます。最後のケースでは、エントリがデータベースに既に存在する場合は、これのみが表示されます。エラーが表示されます。

もちろん、カスタムバリデーターにメソッドを追加してsetMessagesをオーバーロードできるため、作業中のフォームに関係なく独自のメッセージを表示できます。

それが誰かを助けることができることを願っています!

于 2012-01-15T09:52:43.433 に答える
0

かなりの数の行が欠落しているようです...

おそらくこれを使用する必要があります:$ mailValidator = new Zend_Validate_EmailAddress();

他の検証も行うことができます:http://framework.zend.com/manual/en/zend.validate.set.html

于 2011-01-26T12:29:40.843 に答える