8

は今の問題は、ユーザーが電子メールの不正なホスト名を入力した場合、それは3つのエラーが発生しています。 「admin @ l」を電子メールアドレスとして入力すると、エラーは
* 'l'は電子メールアドレス 'admin @ l'の有効なホスト名ではありません
* 'l'は、 DNSホスト名
* 'l'はローカルネットワーク名であるように見えますが、ローカルネットワーク名は許可されていません。Zendのフォームメールの検証

これらのすべてではなく、1つのカスタムエラーを与えたいだけです。エラーメッセージ "無効な電子メールアドレス"をaddErrorMessageメソッドで設定すると、db_validationに対して同じメッセージが再び生成されます。

答えて

8

まあ、それは後半の答えだが、私は常に便利だと思います。

は最後にバリデータを追加します

addValidator(ライン67):

単にaddValidator()Zendのドキュメントから

http://framework.zend.com/apidoc/1.8/)の第二のparamとしてを追加チェーンの

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

リターン:流れるようなインターフェイスに

アクセス提供:公共

をここに署名:

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) 
      ); 
2
$email->addErrorMessage("Please Enter Valid Email Address"); 

カスタムバリデーターを使用できます。プロジェクトのルート

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); 

にフォルダ検証内Email.phpファイルを作成しないでくださいそれが動作するかどうかを知っているが、電話の場合は私のために働いた。 http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/

+0

はい、私はまた、電子メールがサイトに登録するために既に使用されているかどうかを確認するDBバリデーターを持っています。上記のメッセージを追加すると、電子メールが有効であってもデータベースに存在する場合でも、カスタムメッセージが表示されます。 – Bryan

+0

それをチェックしてください!うまくいけばうまくいきました。それで大丈夫です! –

+0

私は週末にそれをテストし、あなたに知らせます。おかげで、 – Bryan

0

の礼儀それはかなりの数の行が欠落しているようだ...

は、おそらくこれを使用する必要があります。 $ mailValidator =新しいZend_Validate_EmailAddress();

あなたはまた、他のいくつかの検証はここで見ることが可能です。http://framework.zend.com/manual/en/zend.validate.set.html

5

Zend_Validate_EmailAddrのインスタンス

$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" 
)); 

は、私が使用してこのヘルプ誰か:-)

+0

ありがとう、それは助けになった! –

0

願っています:ESSクラスとあなたはそれがこのようなものになるだろう言及したものを削除するには、あなたが好きなメッセージを上書きし、その後setMessagesメソッドを呼び出し、 カスタムバリデーターは、この問題を回避するために私が見つけた唯一の方法です。

は何を望むのであれば:電子メールアドレスが間違ってフォーマット

  • である場合

    • は一つだけエラーメッセージを持つフォーマットが良好であれば、電子メールアドレスが既にある場合は、検証データベース
    • その後

    は、私はあなたがこのような何かをすることをお勧め:

    $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パラメータ$breakOnFailurefalseに設定されているため、バリデータが失敗すると他のパラメータは呼び出されません。

    最初のバリデータは、独自のカスタムバリデータであるメール、次のとおりです。

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

    あなたは、たとえば/アプリケーション/ライブラリ/マイ/検証では、あなたのライブラリにこのバリデータを追加し、追加することができます $this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator'); をフォームに追加します。もちろん、 "My"をあなたのライブラリの名前に置き換える必要があります。

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

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

    誰かを助けることができますように!

  • 関連する問題