我正在开发 Salesforce 应用程序。该应用程序包含一些自定义对象,其中之一是 Project。我创建了一个 Visualforce 页面来管理这些项目。我们也在开发一个扩展。在扩展中,一个新的自定义字段被添加到 Project 对象中。在原始包中,我想更改visualforce页面以显示该字段的值(如果安装了扩展)。所以我需要检查扩展是否已安装,如果是,则显示该扩展中的一个字段。
有没有办法做到这一点?
我正在开发 Salesforce 应用程序。该应用程序包含一些自定义对象,其中之一是 Project。我创建了一个 Visualforce 页面来管理这些项目。我们也在开发一个扩展。在扩展中,一个新的自定义字段被添加到 Project 对象中。在原始包中,我想更改visualforce页面以显示该字段的值(如果安装了扩展)。所以我需要检查扩展是否已安装,如果是,则显示该扩展中的一个字段。
有没有办法做到这一点?
我最终使用的解决方案是在基类中创建一个接口,它的默认实现并没有做太多的事情。然后我创建了一个自定义设置,其中应该输入另一个实现该接口的类名。同样在基类中,我创建了一个工厂,可用于获取接口的实现。我以本指南为基础。
您最好在Salesforce 专用的 Stack 站点上问同样的问题。似乎有很多成员构建托管包。
我会尝试一些动态 Apex(如describe methods)来检查对象和字段是否存在。
例如,如果您从 AppExchange 安装了 Chatter Unfollow 应用程序并希望依赖其对象:
String objectName = 'chttrunfollow__UnfollowRule__c';
String fieldName = 'chttrunfollow__Active__c';
Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe();
Schema.SObjectType t = gd.get(objectName);
if(t != null) {
Schema.DescribeSObjectResult sobjectDescribe = t.getDescribe();
System.debug(sobjectDescribe.isAccessible());
Map<String, Schema.SObjectField> fields = sobjectDescribe.fields.getMap();
if(fields != null && fields.get(fieldName) != null && fields.get(fieldName).getDescribe().isAccessible()) {
System.debug('Show it!');
}
} else {
System.debug(LoggingLevel.ERROR, 'Not found');
}
这可能是一项非常昂贵的操作,因此您可能希望将结果缓存在某处(自定义设置?)。
有一个System.requestVersion()
电话,但我认为它只返回“你的”当前版本(不能用它来询问给定组织中还安装了什么)。如果您使用许可证 -UserInfo.isCurrentUserLicensed('namespace')
可能值得检查?