force.comでフォーム的な画面を作ることはよくあると思いますが

その際に<apex:inputField>とかでVFを組んでると、必須項目の制約とかメールアドレスの形式チェックとか

Salesforceのシステムバリデーションが効いてくれる上に

型に合わせてhtmlを生成してくれるから日付型とか使うときに便利だったりします。

 

が、<apex:inputField>でシステムが出すバリデーションは”エラー: 値を入力してください”

というように決められた文言でしか出すことができずエラーを出す位置も決まってしまうため

Salesforceのオペレータ側ではなく対顧客に対するフォームを作成するときには

デザイン・UI的にちょっと難が…。

 

そこで<apex:message>というのを使ってみようと思ったけど、

色々と苦戦した挙句、挙動が?だったので、ちょっと書いてみる。

 

パターン1. <apex:inputField>のみ

検証用VFページ↓

以下のように固定のエラーメッセージが出る。

inputfieldのみ

このメッセージを自由に変更して、自由な位置に出力したい!というのが今回の趣旨。

 

パターン2. <apex:inputField> + <apex:message/>

では実際にmessageタグを使ってみる。

検証用VF↓

こうすると、inputFieldタグが出すエラーメッセージと

messageタグが出すエラーメッセージで2重に出力されちゃう。

inputfield_message

 

パターン3. <apex:inputField> + <apex:message/> + commandButtonのimmediate

SalesforceのSystemバリデーションを走らせないで送信したらどうなるかを検証。

結果、commandButtonのactionで何もしていないせいか何も出力されず…。

空送信フォーム

 

パターン4. <apex:inputField> + <apex:message > + immediate + action指定

実際にアクションでインサートしてエラーをキャッチしてページにエラーメッセージを出してみる。

検証用VF↓

検証用Apexクラス↓

inputField, messageタグの方にはエラーメッセージは表示されず。

pagemessage

 

addError(ex)とaddMessages(ex)の2つのエラーメッセージが出力されているように見えるけど

DML Exceptionが発生した時点でSalesforceが自動的に

ApexPages.addMessages(ex)をやっているっぽく、addMessages消しても同じ出力結果に。

 

パターン5. <apex:inputField> + <apex:message > + immediate + action指定2

項目に直接addErrorしてみる。

検証用VF↓

検証用クラス↓

adderror_field

お、うまくいってる!と、思いきや、生成されたhtmlタグをよく見てみると…。

gakkari2

inputFieldのエラーメッセージは出力されているけど、

messageの方にはエラーメッセージが出力されてないorz

 

ということで、<apex:message>の利用方法がよくわからないっす…。

<apex:inputText>には使えないみたいだし。

 

対顧客用のフォーム画面を作成する場合には、エラーメッセージ用のプロパティを用意した方が懸命かもしれないっす。

”自前でやった方が早いし確実”っていうのはforce.comにはよくあることです!!w