Use Apex Metadata API to add a custom field to a page layout.
Create an Apex class to retrieve the existing metadata for the Contact page layout. Update this metadata with a new custom field that represent a Twitter username.
https://trailhead.salesforce.com/ja/content/learn/modules/apex_metadata_api/apex_metadata_api_updates
- Create a public Apex class called UpdateContactPageLayout.
- Add a public method called addLayoutItem to the class. The method returns Metadata.Layout and takes no parameters.
- In the addLayoutItem method, retrieve the metadata for the Contact page layout, by using the Metadata.Operations.retrieve method. Assign the metadata retrieved to a variable called layoutsList that’s a list of Metadata.Metadata objects.
- Get the first layout in the list and assign it to a variable named layoutMetadata of type Metadata.Layout.
- Create a variable called contactLayoutSection of type Metadata.LayoutSection and set it to null.
- Use the layoutSections property of layoutMetadata to iterate through the layout sections to find the section named Additional Information. Assign this section to contactLayoutSection.
- Create a variable called contactColumns that’s a list of Metadata.LayoutColumn objects. Use the layoutColumns property on contactLayoutSection to assign columns to contactColumns.
- Create a variable called contactLayoutItems that’s a list of Metadata.LayoutItem objects. Assign a value to this variable by using the layoutItems property on the first element in the contactColumns list.
- Create an object called newField of type Metadata.LayoutItem.
- Assign the following values to the new field:
Add the new field to the contactLayoutItems metadata. Return layoutMetadata.
- behavior: Metadata.UiBehavior.Edit
- field: ‘AMAPI__Apex_MD_API_Twitter_name__c’
CHALLENGEの内容が翻訳されていなくて辛い\(^o^)/
参考までに、DeepLさんを使って翻訳したのがこちら。
Apex Metadata APIを使用して、ページレイアウトにカスタムフィールドを追加します。
Apexクラスを作成して、Contactページレイアウトの既存のメタデータを取得します。Twitterのユーザー名を表す新しいカスタムフィールドでこのメタデータを更新します。
UpdateContactPageLayoutというパブリックApexクラスを作成します。
クラスにaddLayoutItemというパブリックメソッドを追加します。このメソッドはMetadata.Layoutを返し、パラメータは取りません。
addLayoutItem メソッドで、Metadata.Operations.retrieve メソッドを使用して、Contact ページ・レイアウトのメタデータを取得します。取得したメタデータを、Metadata.MetadataオブジェクトのリストであるlayoutsListという変数に代入します。
リストの最初のレイアウトを取得し、それをMetadata.Layout型のlayoutMetadataという変数に代入します。
Metadata.LayoutSection型のcontactLayoutSectionという変数を作成し、nullに設定します。
layoutMetadataのlayoutSectionsプロパティを使用して、レイアウト・セクションを繰り返し、Additional Informationというセクションを見つけます。このセクションをcontactLayoutSectionに割り当てます。
Metadata.LayoutColumnオブジェクトのリストであるcontactColumnsという変数を作成します。contactLayoutSectionのlayoutColumnsプロパティを使用して、contactColumnsに列を割り当てます。
Metadata.LayoutItemオブジェクトのリストであるcontactLayoutItemsという変数を作成します。contactColumnsリストの最初の要素のlayoutItemsプロパティを使用して、この変数に値を割り当てます。
Metadata.LayoutItem型のnewFieldというオブジェクトを作成します。
新しいフィールドに以下の値を割り当てます:
ビヘイビア: Metadata.UiBehavior.Edit。
フィールド: ‘AMAPI__Apex_MD_API_Twitter_name__c’
新しいフィールドをcontactLayoutItemsメタデータに追加します。Return layoutMetadata.
言われている通りにコーディングしていけば良さげだけですが、やること多くて面倒なパターン。。。
CHALLENGEをクリアできたソースコードはこちら。
public class UpdateContactPageLayout {
public Metadata.Layout addLayoutItem() {
// Contactレイアウトのメタデータを取得
List<Metadata.Metadata> layoutsList = Metadata.Operations.retrieve(
Metadata.MetadataType.Layout,
new List<String> {'Contact-Contact Layout'}
);
// リストから最初のレイアウトを取得
Metadata.Layout layoutMetadata = (Metadata.Layout) layoutsList.get(0);
// 変数をnullで初期化
Metadata.LayoutSection contactLayoutSection = null;
// 'Additional Information'という名前のセクションを見つけるためにレイアウトセクションを反復処理
for (Metadata.LayoutSection section : layoutMetadata.layoutSections) {
if (section.label == 'Additional Information') {
contactLayoutSection = section;
break;
}
}
// レイアウトセクションの列を取得
List<Metadata.LayoutColumn> contactColumns = contactLayoutSection.layoutColumns;
// 最初の列のレイアウトアイテムを取得
List<Metadata.LayoutItem> contactLayoutItems = contactColumns.get(0).layoutItems;
// カスタムフィールド用の新しいレイアウトアイテムを作成
Metadata.LayoutItem newField = new Metadata.LayoutItem();
newField.behavior = Metadata.UiBehavior.Edit;
newField.field = 'AMAPI__Apex_MD_API_Twitter_name__c';
// 新しいフィールドをレイアウトアイテムに追加
contactLayoutItems.add(newField);
// 更新されたレイアウトメタデータを返す
return layoutMetadata;
}
}
内容を簡単に説明すると、以下になります。
- まず、既存のContactページレイアウトのメタデータを取得して、
layoutsList
というMetadata.Metadata
オブジェクトのリストに格納します。 - そのリストの最初のレイアウトを取り出し、
layoutMetadata
というMetadata.Layout
オブジェクトに格納します。 - メソッドは次に、
layoutMetadata
の中の各LayoutSection
を反復処理して、「Additional Information」というセクションを見つけます。 - そのレイアウトセクションの列を取得し、最初の列のレイアウトアイテムを取得します。
- 最後に、Twitterユーザーネームフィールドを表す新しい
LayoutItem
を追加し、更新されたLayout
メタデータを返します。
ぶっちゃけ、今回もchatGPTさんにソースコード書かせてみましたが、このくらいだと一発で書いてくれるのね・・・。
コメント