8

는 지금 문제는 사용자가 이메일 유효하지 않은 호스트 이름을 입력하면, 그것은 3 오류를 생성 사용자의 이메일 주소젠드 양식을 이메일 확인

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

에 대한 입력 필드를 생성하는 다음과 같은 코드가 있습니다. 전자 메일 주소로 'admin @ l'을 입력하면 오류가
* 'l'은 (는) 전자 메일 주소 'admin @ l'에 유효한 호스트 이름이 아닙니다.
* 'l'이 (가) 예상되는 구조와 일치하지 않습니다. DNS 호스트 이름
* 'l'은 로컬 네트워크 이름 인 것처럼 보이지만 로컬 네트워크 이름은 허용되지 않습니다.

이 옵션 대신에 하나의 사용자 정의 오류 만 지정하면됩니다. addErrorMessage 메소드로 "잘못된 전자 메일 주소"오류 메시지를 설정하면 db_validation에 대해 동일한 메시지가 다시 생성됩니다.

답변

8

글쎄, 그것은 늦은 대답하지만 난 항상 유용하다고 생각합니다.

는 마지막에 검사기를 추가

addValidator (라인 67) :

단순히 addValidator() 젠드 문서에서

(http://framework.zend.com/apidoc/1.8/)의 두 번째 PARAM로 사실를 추가 체인의 경우

$ breakChainOnFailure가 true 인 경우 유효성 검사기 실패하면 체인의 다음 유효성 검사기 (있는 경우)가 실행되지 않습니다.

반환 : 유창 인터페이스를

액세스를 제공합니다 : 공공 여기

서명 :

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

의 루트 및에 라이브러리에 폴더 검증 내부 폴더를 파일 email.php로을 만들려면 form.php 파일

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

하지 마십시오 그것이 작동하는지 아닌지는 알지만, 전화의 경우에는 나에게 도움이됩니다.) ( $ mailValidator = 새로운 Zend_Validate_EmailAddress; http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/ 그것은 꽤 몇 줄없는 것 같다

+0

네,하지만 이메일에 이미 사이트에 등록하는 데 사용되었는지 확인하는 DB 유효성 검사기도 있습니다.위의 메시지를 추가하면 전자 메일이 유효하지만 데이터베이스에있는 경우에도 사용자 지정 메시지가 표시됩니다. – Bryan

+0

그것을 확인하십시오 !! 잘 작동하지 않으면 잘 작동합니다. –

+0

나는 주말에 시험해보고 알려 줄 것이다. 덕분에 – Bryan

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을 나타냅니다.

    여기에 세 개의 유효성 검사기가 있습니다. 모두 두 번째 매개 변수 $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를 오버로드 할 수 있으므로 작업중인 양식에 상관없이 사용자 고유의 메시지를 표시 할 수 있습니다.

    누군가 도와 줄 수 있기를 바랍니다.