メールテンプレートに子レコードの情報を埋め込む【Salesforce】

Free checkered pattern background Apex

普通のメールテンプレートでは「自レコード」と「親レコード」の情報を埋め込むことはできるのですが、「子レコード」の情報を埋め込むことができません。

今回はこの「子レコード」の情報を埋め込めるメールテンプレートを作成してみます。

要約

メールテンプレートの種別を「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 != 'クローズ'
        ];
    }
}

コメント

タイトルとURLをコピーしました