進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

自動設定変更のためのシステム管理者ツールの作成

学習の目的

この単元を完了すると、次のことができるようになります。
  • Apex メタデータ API で設定プロセスをどう簡略化するかを説明する。
  • Apex メタデータ API を使用して設定変更を自動化する。

システム管理者の反復作業を自動化する

Apex メタデータ API を使用して、インストール後スクリプトでカスタム項目をすべての組織のページレイアウトに追加する方法を確認しました。次は別の状況を考えてみましょう。設定と組織へのリリースが必要なカスタムメタデータ項目を作成したとします。Apex メタデータ API を使用すると、Apex 内からカスタムメタデータ型のレコードを操作できます。Apex を使用して簡単にカスタム設定 UI を作成でき、システム管理者は新しいカスタムメタデータ型を設定して組織にリリースできます。

たとえば、付加価値税 (VAT) 率を表すカスタムメタデータ型を作成したとします。サポートする国ごとに異なる税率を設定する必要があります。Apex メタデータ API を使用して、独自の設定 UI を作成し、システム管理者の設定プロセスを簡略化できます。可能なソリューションの 1 つは、システム管理者が 1 か所で値を設定できる Visualforce ページを作成することです。このページは Apex メタデータ API を使用してカスタムメタデータ型のレコードを組織にリリースします。では詳しい説明を始めましょう。

メモ

メモ

注意: この例は、プロセスの基礎に集中できるように意図的に簡略化されています。より現実的な例では、作成する Visualforce ページを設定ウィザードに含めることがあります。システム管理者は、ウィザードに従いながら一連のページでより複雑な設定を行うことができます。ただしここでは、よりシンプルなケースを理解することで、より複雑なシナリオに取り組めるように準備をします。

新しいカスタムメタデータ型を追加する

最初のステップでは、カスタムメタデータ型を作成します。データ型は [設定] で作成しますが、前の単元で確認したように、Apex メタデータ API を使用してプログラムで自動的に行うこともできます。

  1. [設定] から、「カスタムメタデータ型」と入力し、[カスタムメタデータ型] をクリックします。
  2. [新規カスタムメタデータ型] をクリックします。
  3. [表示ラベル] に「VAT Rate」(VAT 率)、[表示ラベル (複数形)] に「VAT Rates」(VAT 率) と入力し、[保存] をクリックします。

保存すると、[VAT Rate (VAT 率)] 詳細ページが表示され、そこでカスタム項目を追加できます。このカスタムメタデータ型で 2 つのカスタム項目が必要です。[新規] をクリックして、Percent 型で表示ラベルが「Rate」(率) の項目と、Checkbox 型で表示ラベルが「Default」(デフォルト) の項目を作成します。残りのデフォルトオプションはそのままで構いません。

VAT Rate レコードを作成する

では、新しいカスタムメタデータ型のレコードを作成してみましょう。

  1. [VAT Rate (VAT 率)] の詳細ページで、[Manage VAT Rates (VAT 率の管理)] をクリックし、[新規] をクリックします。
  2. [表示ラベル] に「US」と入力し、[保存 & 新規] をクリックし、次の国の VAT 率を追加します。
    1. UK
    2. SE
    3. IT
    4. RO

これらのレコードのカスタム項目の値は、現時点ではそれほど重要ではありません。システム管理者は Visualforce ページから値を設定し、レコードは Apex でプログラムにより更新されます。

Visualforce ページおよびコントローラを作成する

次は、Apex メタデータ API を使用する Apex コントローラクラスを作成します。クラスのコンストラクタは、VAT Rate の値のリストを作成します。この値を Visualforce ページで収集します。save メソッドがレコードの対応するメタデータを取得し、その値を収集した値で更新します。最後に、新しいメタデータ値がリリースコンテナに追加され、組織へのリリースのキューに追加されます。

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
  2. このクラスに VATController という名前を付け、[OK] をクリックします。
  3. 既存のコードをすべて削除し、次のコード例をコピーしてその場所に貼り付けます。
public class VATController {
    
    public final List<VAT_Rate__mdt> VATs {get;set;}
    final Map<String, VAT_Rate__mdt> VATsByApiName {get; set;}
    
    public VATController() { 
        VATs = new List<VAT_Rate__mdt>();
        VATsByApiName = new Map<String, Vat_Rate__mdt>();
        for (VAT_Rate__mdt v : [SELECT QualifiedApiName, MasterLabel, Default__c, Rate__c
                                FROM VAT_Rate__mdt]) { 
                                    VATs.add(v);
                                    VATsByApiName.put(v.QualifiedApiName, v);
                                }
    }
    
    public PageReference save() {        
        
        // Create a metadata container.
        Metadata.DeployContainer container = new Metadata.DeployContainer();
        List<String> vatFullNames = new List<String>();
        for (String recordName : VATsByApiName.keySet()) {
            vatFullNames.add('VAT_Rate.' + recordName);
        }
        
        List<Metadata.Metadata> records = 
            Metadata.Operations.retrieve(Metadata.MetadataType.CustomMetadata, 
                                         vatFullNames);
        
        for (Metadata.Metadata record : records) {
            Metadata.CustomMetadata vatRecord = (Metadata.CustomMetadata) record;
            String vatRecordName = vatRecord.fullName.substringAfter('.');
            VAT_Rate__mdt vatToCopy = VATsByApiName.get(vatRecordName);
            
            for (Metadata.CustomMetadataValue vatRecValue : vatRecord.values) {
                vatRecValue.value = vatToCopy.get(vatRecValue.field);
            }
            
            // Add record to the container.
            container.addMetadata(vatRecord);
        }   
        
        // Deploy the container with the new components. 
        Id asyncResultId = Metadata.Operations.enqueueDeployment(container, null);
        
        return null;
    }
}

次に、システム管理者が 5 か国すべての VAT 率を設定できる Visualforce ページを作成します。

  1. [設定] ギア、[開発者コンソール] の順にクリックして開発者コンソールを開きます。
  2. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Visualforce Page (Visualforce ページ)] をクリックします。
  3. このページに VATRateForm という名前を付け、[OK] をクリックします。
  4. 既存のコードをすべて削除し、次のコード例をコピーしてその場所に貼り付けます。
<apex:page controller="VATController">
    <apex:form >
        <apex:pageBlock title="VAT Rates" mode="edit">
            <apex:pageMessages />
            
            <apex:pageBlockButtons >
                <apex:commandButton action="{!save}" value="Save"/>
            </apex:pageBlockButtons>
            
            <apex:pageBlockTable value="{!VATs}" var="v">
                <apex:column value="{!v.MasterLabel}"/>
                <apex:column headerValue="Rate">
                    <apex:inputText value="{!v.Rate__c}"/>
                </apex:column>
                <apex:column headerValue="Default">
                    <apex:inputCheckbox value="{!v.Default__c}"/>
                </apex:column>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

メタデータ値を収集してリリースするための Apex コントローラと Visualforce ページを作成できました。次のステップでは、リリースをテストします。