こんにちは、アンダーソンです。
今回はVFに表示させる際に使っているであろう
Messageのタグについて少し深堀してみていきたいと思います。
メッセージタグの種類と違いを知ろう
まずはメッセージの表示のためのコンポーネントと違いについて確認していきます。
<apex:pageMessage>
このコンポーネントは、特定の重要度に対するエラー、警告、およびその他の種類のメッセージ用の Salesforce パターンを使用してカスタムメッセージをページに表示するために使用されます。
Visualforce 開発者ガイド
<apex:pageMessages>
このコンポーネントは、Salesforce スタイルを使用して、現在のページのすべてのコンポーネントに対して生成されたすべてのメッセージを表示します。
Visualforce 開発者ガイド
<apex:message>
現在のページのすべてのコンポーネントに生成されたすべてのメッセージです。
Visualforce 開発者ガイド
<apexes:messages>
警告またはエラーなど、特定のコンポーネントに対するメッセージです。
Visualforce 開発者ガイド
めちゃくちゃ細かい違いなんです!
みただけでは覚えられないので、
実際にどんな違いがあるのか、実装してみました。
実際の画面でみてみましょう
まずVisualforce側です。
<apex:page controller="sample">
<h1>apex:pageMessage</h1>
<apex:pageMessage summary="エラー発生!!!" severity="error"/><br/>
<h1>apex:pageMessages</h1>
<apex:pageMessages/><br/>
<h1>apex:message</h1>
<apex:message/><br/>
<h1>apex:messages</h1>
<apex:messages/><br/>
<apex:form>
<apex:commandButton action="{!getMessage}" value="メッセージを取得"/>
<apex:commandButton action="{!getException}" value="例外起こす"/>
</apex:form>
</apex:page>
次にコントローラ側です。
public class sample {
Account acc;
public void getMessage(){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO,'メッセージがきました'));
}
public PageReference getException(){
try{
update acc;
} catch (Exception ex) {
Apexpages.addMessages(ex);
}
return null;
}
}
これでどこに何が出るのかをみてみましょう。
実験開始
まず初期画面。
apex:pageMessageさんはフライング気味にもうメッセージングしてます。

まずメッセージを取得ボタンを押します。
これは
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO,'メッセージがきました'));
を呼び出すメソッドです。

変更されたのは、apex:pageMessagesとapex:messagesでした。
では次に意図的に例外を呼び出します。

今回も変更があったのはapex:pageMessagesとapex:messagesでした。
じゃあもうこの二つを使うのが楽かな〜となるんですが、
それ以外の二つはどんな場面で使うのかも気になります。
それ以外の二つは?
<apex:pageMessage> は属性として、概要やTitleを持たせることができます。
そしてこの4つのメッセージの中で唯一severityという必須属性があります。
confirm、info、warning、errorの4種類あり、何が変わるのかというと枠の色です。

微妙すぎる・・・。最初から何かユーザに通知しておくのに使えるかなって感じですね。
ちなみにおしらせはTitle、このページは・・・はsummaryという属性です。
次に<apex:message>ですが、こちらは項目に対してエラーを吐き出すのに効率的っぽいです。
<h1>apex:message</h1><br/>
<apex:message for="AccountName"/>
<apex:inputField value="{!acc.Name}" id="AccountName"/>
上記のようにDOMのid属性を参照し、参照しているコンポーネントに対して
起こったエラーを吐き出します。
今回はApex側で無理やりacc.Name.adderror(‘エラーだよ’);てのを仕込んだら

こんな感じで出力されました。
ユーザビリティを考えてそれぞれがどのような役割を持っているかを踏まえながら
実装していきたいですね!