salesforce lightning零基础学习(十六) 公用组件之 获取字段label信息

我们做的项目好多都是多语言的项目,针对不同国家需要展示不同的语言的标题。我们在classic中的VF page可谓是得心应手,因为系统中已经封装好了我们可以直接在VF获取label/api name等方法。但是我们在lightning aura中开发却发现这个常用的功能并没有包含,好吧,既然没有现成可用的那我们就要有workaround的方式去后台获取。此篇主要封装好组件去实现获取某个object或者某些object相关字段的label。

那我们来开始进行这个组件的开发,开发以前我们需要先思考一下,组件化的东西,传参应该是什么,返回应该是什么,应该实现哪些功能解决哪些痛点。如何用到更好的优化。本人思考可能并不特别的完全,感兴趣的可以进行优化。

1. object 的API name应该为必填项。 这里应该实现可以同时获取多个表的字段的label信息,我们画component时,很可能需要获取当前的对象,父对象以及相关的子对象的字段的label,所以此处传参应该能做到传递list而不是单一的object

2. object对应的指定的field的api name列表,此项应该为可选项,非必填。我们都知道aura开发现在很慢,而且我们在前台获取label时,可能一个object有上百个字段,但是我们在页面只需要某几个字段的label的信息,如果全部查出来放在前台特别影响view state,所以我们此处应该支持可以通过指定的一些字段进行查询。因为object传参是list,所以此参数应该为Map<String,List<String>>方式。

3. 返回类型应该为 Map<String,Map<String,String>>类型,外层的key是objectAPIName,内层的map的key是fieldAPIName,内层的map的value为我们需要的field label

OK,上面的已经梳理出来,那干就完了。

一. 公用组件搭建

FieldLabelServiceController.cls 用于后台搭建查询指定的obj / field的value -> label信息

1 public with sharing class FieldLabelServiceController { 2 /* 3 * @param objApiNameList : object API name list. eg:['Account','Contact'] 4 * @param objApiName2FieldsMap: object API name 2 fields map. eg:{'Account':['Name','Type'],'Contact':['LastName','Phone']} 5 * @return object API name 2 map of field API name -> label name. eg:{'Account':{'Type':'类型'},'Contact':{'LastName':'姓'}} 6 */ 7 @AuraEnabled 8 public static Map<String,Map<String,String>> getFieldLabelService(List<String> objApiNameList,Map<String,List<String>> objApiName2FieldsMap) { 9 // key: object API name ; value : (Map: key:field API name, value: field label) 10 Map<String,Map<String,String>> object2FieldLabelMap = new Map<String,Map<String,String>>(); 11 //get all sobject sObjectType map 12 Map<String,sObjectType> objName2ObjTypeMap = Schema.getGlobalDescribe(); 13 for(String objApiName : objApiNameList) { 14 15 //1. get specific object sObjectType 16 sObjectType objType = objName2ObjTypeMap.get(objApiName); 17 //2. get all of the fields map via specific object 18 Map<String,Schema.SObjectField> fieldsMap = objType.getDescribe().fields.getMap(); 19 20 //3. check if retrieve specific field list or all the fields mapping via object 21 Set<String> retrieveFieldList = new Set<String>(); 22 if(objApiName2FieldsMap != null && objApiName2FieldsMap.containsKey(objApiName)) { 23 retrieveFieldList = new Set<String>(objApiName2FieldsMap.get(objApiName)); 24 } 25 26 Map<String,String> fieldApiName2FieldLabelMap = new Map<String,String>(); 27 //4. get all / specific field api name -> label name mapping 28 for(String fieldApiName : fieldsMap.keySet()){ 29 if(retrieveFieldList.size() > 0 && !retrieveFieldList.contains(fieldApiName)) { 30 continue; 31 } 32 33 String label = fieldsMap.get(fieldApiName).getDescribe().getLabel(); 34 fieldApiName2FieldLabelMap.put(String.valueOf(fieldsMap.get(fieldApiName)), label == null ? fieldApiName : label); 35 } 36 37 object2FieldLabelMap.put(objApiName, fieldApiName2FieldLabelMap); 38 } 39 return object2FieldLabelMap; 40 } 41 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzpyd.html