普通のメールテンプレートでは「自レコード」と「親レコード」の情報を埋め込むことはできるのですが、「子レコード」の情報を埋め込むことができません。
今回はこの「子レコード」の情報を埋め込めるメールテンプレートを作成してみます。
要約
メールテンプレートの種別を「Visualforce」にすることで、Apexで取得・加工した情報をメールテンプレートに埋め込むことができます。
これを使うと、SOQLで子レコードの情報を取得し、メールテンプレートに埋め込むことも可能になります。
実装例
今回は簡単なサンプルとして、
取引先責任者に紐づくケースの「ケース番号」「件名」を表示するテンプレートを作成します。
以下テンプレートのコードです
- messaging:emailTemplate 内で recipientType={オブジェクトAPI名} を定義することで、レコードの値をテンプレートに埋め込むことができます
- 1つのテンプレートで、テキストver と HTML ver をどちらも作成できます
<messaging:emailTemplate subject="お問い合わせ内容のご確認" recipientType="Contact">
<messaging:plainTextEmailBody >
{!recipient.Account.Name}
{!recipient.Name} 様
現在以下のお問い合わせを承っております。
<c:caseSubjects type="text" contact="{!recipient.Id}"/>
</messaging:plainTextEmailBody>
<messaging:htmlEmailBody >
<html>
<body>
<span>{!recipient.Account.Name}</span><br/>
<span>{!recipient.Name} さま</span><br/>
<br/>
<span>現在以下のお問い合わせを承っております。</span><br/>
<c:caseSubjects type="html" contact="{!recipient.Id}"/>
</body>
</html>
</messaging:htmlEmailBody>
</messaging:emailTemplate>
上記テンプレート内に caseSubjects という Visualforce コンポーネントを埋め込んでいます。
- メールテンプレートで使用する場合、access は global にする必要があります
- apex:attribute で定義した変数は、メールテンプレート内で値を設定します
<apex:component controller="FindTargetCase" access="global">
<apex:attribute name="type" access="global" type="string" description="text か html かを指定する"></apex:attribute>
<apex:attribute name="contact" access="global" type="string" assignTo="{!contactId}" description="コンタクトのID"></apex:attribute>
<apex:repeat value="{!targetCases}" var="case" rendered="{!IF( type='text', true, false)}">
・{!case['CaseNumber']} {!case['Subject']}
</apex:repeat>
<apex:repeat value="{!targetCases}" var="case" rendered="{!IF( type='html', true, false)}">
<apex:outputText value="・{!case['CaseNumber']} {!case['Subject']}" />
<br/>
</apex:repeat>
</apex:component>
caseSubjects コンポーネント内で、レコード情報取得のための Apex クラスを呼び出しています。
public with sharing class FindTargetCase {
public String contactId { get; set; }
public List<Case> getTargetCases(){
return [
SELECT CaseNumber, Subject
FROM Case
WHERE ContactId = :contactId AND Status != 'クローズ'
];
}
}
コメント