SalesforceのVisualforce Emailテンプレートで、コンポーネントを使用しpicklistの翻訳を取得する

Visualforce形式のEmailテンプレートでは、通常のEmailテンプレートで出来ないような複雑なことも出来ますが、(グローバル)ピックリストはコード値で定義しておき、その表示値を翻訳している場合に、 そのピックリストの翻訳値をメールの本文に埋め込むのは、「コンポーネント」を使う必要がありました。

コンポーネントを使うと、さらに複雑なビジネスロジックをコンポーネントで使用するクラスに持たせることができるので、SOQL文を使ったレコードの取得や加工なども行うことができます。 特に、翻訳されたラベルを取得するのは、SOQL文でtoLabel()関数を使う方法が簡単なので、コンポーネント内でSOQL文を発行してラベルを取得した結果を返却するメソッドを定義しておけば、表題のようなことができます。

そのやり方のメモです。

Apexクラスを定義

初めに、コンポーネントで使用するApexクラスを定義します。

この中では、コンポーネントを通してEmailテンプレートと値をやり取りするための変数「myId」を定義し、setter/getterを定義します。

また、「myId」を使って何らかのロジックを行う関数を定義しますが、それを変数「labelvalue」で返すために、関数名をのget<変数名>(この例ではgetLabelvalue)とします。

public class My_TemplateCtrl {
    public Id myId {get;set;}
    public String getLabelvalue() {
        T_Shiryo_Seikyu__c ss = [select Id, toLabel(Shiryo_Todofuken__c) FROM T_Shiryo_Seikyu__c where Id =: shiryoseikyuId ];
        return ss.Shiryo_Todofuken__c;
    }
}

コンポーネントを定義

次に、上記のApexクラスを使ったコンポーネントを定義します。 コンポーネント名は、「My_Template_Component」としました。後程、Emailテンプレート内で、この名前でコンポーネントを使用します。

このコンポーネントで定義しているのは、外部に公開するプロパティ「passedId」で、それを、My_TemplateCtrlの変数「myId」にアサイン(assign to)する宣言を行います。

<apex:component controller="My_TemplateCtrl" access="global">
    <apex:attribute name="passedId" assignTo="{!myId}" type="Id" description="my id for variable pass" />
    {!labelvalue}
</apex:component>

コンポーネントをEmailテンプレート内で使用

上記2つを定義すれば、それをEmailテンプレート内で使用できるようになります。定義したコンポーネントを使用する場合は、下記のように<c:<コンポーネント名> />のように記述しましょう。

なお、下記の例では、公開されたプロパティ「passedId」に「{!relatedTo.Id}」を渡しています。(※relatedToについては下に解説)

<c:My_Template_Component passedId="{!relatedTo.Id}" />

なお、上記のrelatedToですが、テンプレートの最初に以下のような定義をしている場合は、カスタムオブジェクト「My_Custom__c」ということになりますね。