2012-11-20 5 views
7

電子メールアドレスが無効な場合、表示されるメッセージは "Invalid email.Invalid email"です。メッセージには、要約と詳細という2つの部分があることがわかります。私はこれらの両方が必要ですが、それぞれにそれぞれ異なる情報が必要です。 「無効なメールアドレス:有効なメールアドレスを入力してください」と表示するようにメッセージを変更するにはどうすればよいですか?重複するテキスト<p:messages>概要と詳細

<p:messages showDetail="true" autoUpdate="true" closable="true" /> 
<h:panelGrid columns="2"> 
    <h:outputText value="#{label.email}: *" /> 
    <p:inputText required="true" value="#{userWizard.emailAddress}" 
     validatorMessage="#{label.invalidEmail}" label="#{label.email}"> 
     <f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$"> 
     </f:validateRegex> 
    </p:inputText> 
</h:panelGrid> 
+0

validatorMessageを「無効な電子メール:有効な電子メールアドレスを入力してください」と変更した場合、このメッセージは表示されるメッセージに2回表示されます:無効な電子メール:有効な電子メールアドレスを入力してください無効な電子メール:有効な電子メールアドレスを入力してください。 – Seitaridis

答えて

8

これはvalidatorMessageconverterMessagerequiredMessageでもない)では不可能です。値はとして使用され、の要約と詳細の両方が使用されます。

FacesMessageを両方ともにのように構成することができます。カスタムバリデーターを作成する必要があります。あなたがメッセージの詳細を表しlabel.emaillabel.email_detailの隣にきたと仮定すると、それはこのようなものになります(

@FacesValidator("emailValidator") 
public class EmailValidator implements Validator { 

    private static final Pattern PATTERN = Pattern.compile("([^[email protected]]+)(\\.[^[email protected]]+)*@([^[email protected]]+\\.)+([^[email protected]]+)"); 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     if (value == null || ((String) value).isEmpty()) { 
      return; // Let required="true" handle. 
     } 

     if (!PATTERN.matcher((String) value).matches()) { 
      String summary = context.getApplication().evaluateExpressionGet(context, "#{label.email}", String.class); 
      String detail = context.getApplication().evaluateExpressionGet(context, "#{label.email_detail}", String.class); 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail)); 
     } 
    } 

} 

を私は世界征服のより良い準備のための電子メールの正規表現に適していることに注意してください。非など中国語、ヘブライ語、キリル文字、などの-latin文字はつまり、ドメイン名に使用でき、ひいては

<p:inputText ... validator="emailValidator" /> 
として使用されるように、その後で新しいIANA decision in 2010

ので、電子メールアドレスされています

+0

私はあなたのソリューションをテストしています。私は2つの部分を変更しました。 'required = true'は' validatorMessage'と同じ問題を抱えています(同じテキストを2回表示します)。したがって、同じ電子メール正規表現で空の文字列値の検証を処理しました。 'String'クラスは' matches'メソッドを持ち、 'Pattern'クラスの代わりにそのメソッドを使いました。 – Seitaridis

+1

ようこそ。 'required =" true "'は、そのサマリーとディテールがまったく同じ場合にのみ、その問題を持ちます。 JSF ''の 'javax.faces.component.UIInput.REQUIRED'と' javax.faces.component.UIInput.REQUIRED_DETAIL'プロパティを変更する必要があります。また、http://www.mkyong.com/jsf2/customize-validation-error-message-in-jsf-2-0/ – BalusC

+0

も参照してください。 'Pattern'アプローチに関しては、' String#matches ) '、しかしそれは非常に高価な仕事である毎回パターンを再コンパイルします。一度定数としてコンパイルしてから再利用する方がはるかに高速です。これは単なるパフォーマンス向上のアプローチです。 – BalusC

4

ここでのドキュメントによると:スタイリングのために...

<p:messages showSummary="true" showDetails="true" /> 

ます。また、それらを離れて置くことができます:http://www.primefaces.org/docs/vdl/3.4/primefaces-p/messages.html

あなたはそのような何かを行うことができ

<p:messages showSummary="false" showDetails="true" /> 
<p:messages showSummary="true" showDetails="false" /> 

しかし、validatorMessageで2つのエラーメッセージを定義することはできません:

http://www.primefaces.org/docs/vdl/3.4/primefaces-p/inputText.html

+0

ありがとう、私は\tを追加する zedtimi

関連する問題