自動設定変更のためのシステム管理者ツールの作成
学習の目的
システム管理者の反復作業を自動化する
Apex メタデータ API を使用して、インストール後スクリプトでカスタム項目をすべての組織のページレイアウトに追加する方法を確認しました。次は別の状況を考えてみましょう。設定と組織へのリリースが必要なカスタムメタデータ項目を作成したとします。Apex メタデータ API を使用すると、Apex 内からカスタムメタデータ型のレコードを操作できます。Apex を使用して簡単にカスタム設定 UI を作成でき、システム管理者は新しいカスタムメタデータ型を設定して組織にリリースできます。
たとえば、付加価値税 (VAT) 率を表すカスタムメタデータ型を作成したとします。サポートする国ごとに異なる税率を設定する必要があります。Apex メタデータ API を使用して、独自の設定 UI を作成し、システム管理者の設定プロセスを簡略化できます。可能なソリューションの 1 つは、システム管理者が 1 か所で値を設定できる Visualforce ページを作成することです。このページは Apex メタデータ API を使用してカスタムメタデータ型のレコードを組織にリリースします。では詳しい説明を始めましょう。
新しいカスタムメタデータ型を追加する
最初のステップでは、[設定] からカスタムメタデータ型を作成します。カスタムメタデータ型のレコードは Apex メタデータ API を使用してプログラムによって作成できますが、カスタムメタデータ型は作成できません。
- [設定] から、「カスタムメタデータ型」と入力し、[カスタムメタデータ型] をクリックします。
- [新規カスタムメタデータ型] をクリックします。
- [表示ラベル] に「VAT Rate」 (VAT 率)、[表示ラベル (複数形)] に「VAT Rates」 (VAT 率) と入力し、[保存] をクリックします。
保存すると、[VAT Rate (VAT 率)] 詳細ページが表示され、そこでカスタム項目を追加できます。このカスタムメタデータ型で 2 つのカスタム項目が必要です。[新規] をクリックして、Percent 型で表示ラベルが「Rate」 (率) の項目と、Checkbox 型で表示ラベルが「Default」 (デフォルト) の項目を作成します。残りのデフォルトオプションはそのままで構いません。
VAT Rate レコードを作成する
では、新しいカスタムメタデータ型のレコードを作成してみましょう。
- [VAT Rate (VAT 率)] の詳細ページで、[Manage VAT Rates (VAT 率の管理)] をクリックし、[新規] をクリックします。
- [表示ラベル] に「US」と入力し、[保存 & 新規] をクリックし、次の国の VAT 率を追加します。
- UK
- SE
- IT
- RO
これらのレコードのカスタム項目の値は、現時点ではそれほど重要ではありません。システム管理者は Visualforce ページから値を設定し、レコードは Apex でプログラムにより更新されます。
Visualforce ページおよびコントローラを作成する
次は、Apex メタデータ API を使用する Apex コントローラクラスを作成します。クラスのコンストラクタは、VAT Rate の値のリストを作成します。この値を Visualforce ページで収集します。save メソッドがレコードの対応するメタデータを取得し、その値を収集した値で更新します。最後に、新しいメタデータ値がリリースコンテナに追加され、組織へのリリースのキューに追加されます。
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
- このクラスに VATController という名前を付け、[OK] をクリックします。
- 既存のコードをすべて削除し、次のコード例をコピーしてその場所に貼り付けます。
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 ページを作成します。
- [設定] ギア、[開発者コンソール] の順にクリックして開発者コンソールを開きます。
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Visualforce Page (Visualforce ページ)] をクリックします。
- このページに VATRateForm という名前を付け、[OK] をクリックします。
- 既存のコードをすべて削除し、次のコード例をコピーしてその場所に貼り付けます。
<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 ページを作成できました。次のステップでは、リリースをテストします。