学习目标
- 描述Apex元数据API如何简化配置过程。
- 使用Apex元数据API自动执行配置更改。
为管理员自动执行重复性任务
我们已经看到了如何使用Apex元数据API来使用后期安装脚本将自定义字段添加到我们所有组织中的页面布局。现在让我们考虑一下不同的情况。假设您已经创建了一个必须配置并部署到您的组织中的自定义元数据类型。 Apex Metadata API允许您使用Apex内的自定义元数据类型的记录。您可以轻松构建自定义设置UI,使管理员可以使用Apex配置和部署新的自定义元数据类型。
例如,假设您已经创建了代表增值税(VAT)税率的自定义元数据类型。您需要为您所支持的每个国家/地区配置不同的税率。借助Apex Metadata API,您可以创建自己的设置UI,以简化管理员的配置过程。一个可能的解决方案是创建一个Visualforce页面,让管理员在一个地方配置值。该页面使用Apex元数据API将您的自定义元数据类型记录部署到您的组织中。让我们深入细节。
添加一个新的自定义元数据类型
第一步是创建我们的自定义元数据类型。我们在安装程序中创建类型,但正如您在上一个单元中所看到的那样,您也可以使用Apex元数据API以编程方式执行此操作。
- 从设置中,输入自定义元数据类型,然后单击 Custom Metadata Types.
- 点击新建自定义元数据类型。
- 输入标签的增值税税率,带有多个VAT税率标签,然后点击 Save.
保存之后,您将登录增值税详情页面,您可以在其中添加自定义字段。对于我们的自定义元数据类型,我们需要两个自定义字段:单击“新建”以创建类型为“百分比”和标签“速率”的字段,以及类型为“复选框”和标签为“默认”的字段。您可以保留其余的默认选项。
创建增值税率记录
现在让我们创建一些新的自定义元数据类型的记录。
- 在增值税详情页面中,点击 Manage VAT Rates,,然后点击New.
- 输入US作为标签,然后点击 Save & New 为以下国家/地区添加VAT税率:
- UK
- SE
- IT
- RO
这些记录的自定义字段的值在这一点上并不重要。管理员从Visualforce页面配置值,并通过Apex以编程方式更新记录。
构建一个Visualforce页面和控制器
接下来,创建一个使用Apex元数据API的Apex控制器类。该类的构造函数创建一个VAT Rate值列表,我们通过Visualforce页面收集这些值。 save方法为我们的记录检索相应的元数据,并用我们收集的值更新值。最后,新的元数据值被添加到我们的部署容器中,并排队等待部署到组织中。
- 在开发者控制台中,点击 .
- 命名类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() {
// 创建一个元数据容器
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);
}
// 将记录添加到容器。
container.addMetadata(vatRecord);
}
// 使用新组件部署容器。
Id asyncResultId = Metadata.Operations.enqueueDeployment(container, null);
return null;
}
}
- 点击设置装置,然后点击开发者控制台,打开 Developer Console.
- 在开发者控制台中,点击 .
- 命名页面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>