此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)

我们在lightning中在前台会经常碰到获取picklist的values然后使用select option进行渲染成下拉列表,此篇用于实现针对指定的sObject以及fieldName(Picklist类型)获取此字段对应的所有可用的values的公用组件。因为不同的record type可能设置不同的picklist values,所以还有另外的参数设置针对指定的record type developer name去获取指定的record type对应的Picklist values.

一. PicklistService公用组件声明实现

Common_PicklistController.cls:有三个形参,其中objectName以及fieldName是必填参数,recordTypeDeveloperName为可选参数。

 public without sharing class Common_PicklistController {

     @AuraEnabled(cacheable=true)
public static List<Map<String,String>> getPicklistValues(String objectName, String fieldName,String recordTypeDeveloperName) {
//1. use object and field name get DescribeFieldResult and also get all the picklist values
List<Schema.PicklistEntry> allPicklistValuesByField;
try {
List<Schema.DescribeSobjectResult> objDescriptions = Schema.describeSObjects(new List<String>{objectName});
Schema.SObjectField field = objDescriptions[0].fields.getMap().get(fieldName);
Schema.DescribeFieldResult fieldDescribeResult = field.getDescribe();
allPicklistValuesByField = fieldDescribeResult.getPicklistValues();
} catch (Exception e) {
throw new AuraHandledException('Failed to retrieve values : '+ objectName +'.'+ fieldName +': '+ e.getMessage());
} //2. get all active field name -> label map
List<Map<String,String>> activeOptionMapList = new List<Map<String,String>>();
Map<String,String> optionValue2LabelMap = new Map<String,String>();
List<String> optionValueList;
for(Schema.PicklistEntry entry : allPicklistValuesByField) {
if (entry.isActive()) {
System.debug(LoggingLevel.INFO, '*** entry: ' + JSON.serialize(entry));
optionValue2LabelMap.put(entry.getValue(), entry.getLabel());
}
} //3. generate list with option value(with/without record type)
if(String.isNotBlank(recordTypeDeveloperName)) {
optionValueList = PicklistDescriber.describe(objectName,recordTypeDeveloperName,fieldName);
} else {
optionValueList = new List<String>(optionValue2LabelMap.keySet());
} //4. generate and format result
if(optionValueList != null) {
for(String option : optionValueList) {
String optionLabel = optionValue2LabelMap.get(option);
Map<String,String> optionDataMap = new Map<String,String>();
optionDataMap.put('value',option);
optionDataMap.put('label', optionLabel);
activeOptionMapList.add(optionDataMap);
}
} return activeOptionMapList;
}
}

Common_PicklistService.cmp:声明了getPicklistInfo方法,有以下三个主要参数.objectName对应sObject的API名字,fieldName对应的此sObject中的Picklist类型的字段,recordTypeDeveloperName对应这个sObject的record type的developer name

 <aura:component access="global" controller="Common_PicklistController">
<aura:method access="global" name="getPicklistInfo" description="Retrieve active picklist values and labels mapping with(without) record type" action="{!c.getPicklistInfoAction}">
<aura:attribute type="String" name="objectName" required="true" description="Object name"/>
<aura:attribute type="String" name="fieldName" required="true" description="Field name"/>
<aura:attribute type="String" name="recordTypeDeveloperName" description="record type developer name"/>
<aura:attribute type="Function" name="callback" required="true" description="Callback function that returns the picklist values and labels mapping as [{value: String, label: String}]"/>
</aura:method>
</aura:component>

Common_PicklistServiceController.js: 获取传递过来的参数,调用后台方法并对结果放在callback中。

 ({
getPicklistInfoAction : function(component, event, helper) {
const params = event.getParam('arguments');
const action = component.get('c.getPicklistValueList');
action.setParams({
objectName : params.objectName,
fieldName : params.fieldName,
recordTypeDeveloperName : params.recordTypeDeveloperName
});
action.setCallback(this, function(response) {
const state = response.getState();
if (state === 'SUCCESS') {
params.callback(response.getReturnValue());
} else if (state === 'ERROR') {
console.error('failed to retrieve picklist values for '+ params.objectName +'.'+ params.fieldName);
const errors = response.getError();
if (errors) {
console.error(JSON.stringify(errors));
} else {
console.error('Unknown error');
}
}
}); $A.enqueueAction(action);
}
})

二. 公用组件调用

上面介绍了公用组件以后,下面的demo是如何调用。

SimplePicklistDemo引入Common_PicklistService,设置aura:id用于后期获取到此component,从而调用方法

 <aura:component implements="flexipage:availableForAllPageTypes">
<!-- include common picklist service component -->
<c:Common_PicklistService aura:id="service"/>
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/> <aura:attribute name="accountTypeList" type="List"/>
<aura:attribute name="accountTypeListByRecordType" type="List"/> <lightning:layout verticalAlign="center" class="x-large">
<lightning:layoutItem flexibility="auto" padding="around-small">
<lightning:select label="account type">
<aura:iteration items="{!v.accountTypeList}" var="type">
<option value="{!type.value}" text="{!type.label}"></option>
</aura:iteration>
</lightning:select>
</lightning:layoutItem> <lightning:layoutItem flexibility="auto" padding="around-small">
<lightning:select label="account type with record type">
<aura:iteration items="{!v.accountTypeListByRecordType}" var="type">
<option value="{!type.value}" text="{!type.label}"></option>
</aura:iteration>
</lightning:select>
</lightning:layoutItem>
</lightning:layout> </aura:component>

SimplePicklistDemoController.js:初始化方法用于获取到公用组件component然后获取Account的type的values,第一个是获取所有的values/labels,第二个是获取指定record type的values/labels。

 ({
doInit : function(component, event, helper) {
const service = component.find('service');
service.getPicklistInfo('Account','type','',function(result) {
component.set('v.accountTypeList', result);
}); service.getPicklistInfo('Account','type','Business_Account',function(result) {
component.set('v.accountTypeListByRecordType',result);
});
}
})

三.效果展示:

1. account type的展示方式

2. account type with record type的展示方式。

总结:篇中介绍了Picklist values针对with/without record type的公用组件的使用,感兴趣的可以进行优化,篇中有错误的欢迎指出,有不懂的欢迎留言。

salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)的更多相关文章

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

    我们做的项目好多都是多语言的项目,针对不同国家需要展示不同的语言的标题.我们在classic中的VF page可谓是得心应手,因为系统中已经封装好了我们可以直接在VF获取label/api name等 ...

  2. salesforce lightning零基础学习(十四) Toast 浅入浅出

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:showToast/specification h ...

  3. salesforce lightning零基础学习(十二) 自定义Lookup组件的实现

    本篇参考:http://sfdcmonkey.com/2017/01/07/custom-lookup-lightning-component/,在参考的demo中进行了简单的改动和优化. 我们在ht ...

  4. salesforce lightning零基础学习(十三) 自定义Lookup组件(Single & Multiple)

    上一篇简单的介绍了自定义的Lookup单选的组件,功能为通过引用组件Attribute传递相关的sObject Name,捕捉用户输入的信息,从而实现搜索的功能. 我们做项目的时候,可能要从多个表中获 ...

  5. salesforce lightning零基础学习(十) Aura Js 浅谈三: $A、Action、Util篇

    前两篇分别介绍了Component类以及Event类,此篇将会说一下 $A , Action以及 Util.  一. Action Action类通常用于和apex后台交互,设置参数,调用后台以及对结 ...

  6. salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...

  7. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...

  8. salesforce lightning零基础学习(一) lightning简单介绍以及org开启lightning

    lightning对于开发salesforce人员来说并不陌生,即使没有做过lightning开发,这个名字肯定也是耳熟能详.原来的博客基本都是基于classic基于配置以及开发,后期博客会以ligh ...

  9. salesforce lightning零基础学习(五) 事件阶段(component events phase)

    上一篇介绍了lightning component events的简单介绍.此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Phase). 一. 阶段(Phase)的概念 ...

随机推荐

  1. django-URL应用命名空间(十)

    在多个app下有相同函数时,可能会出现混乱,这时要给每个app取名 基本目录: settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'djan ...

  2. 在docker中创建使用MySQL,并实现远程连接navicat

    在 docker 中使用 mysql 安装完docker之后,在命令行中输入docker images可以查看自己创建的image(安装下载docker的教程很多了,大家需要可以去查一下就可以了)这里 ...

  3. 并发中如何保证缓存DB双写一致性(JAVA栗子)

    并发场景中大部分处理的是先更新DB,再(删缓.更新)缓存的处理方式,但是在实际场景中有可能DB更新成功了,但是缓存设置失败了,就造成了缓存与DB数据不一致的问题,下面就以实际情况说下怎么解决此类问题. ...

  4. 用node实现发送邮箱验证码

    首先,你需要注册一个支持发送的邮箱,我注册是网易邮箱,然后配置smtp. 然后,创建一个node项目,输入npm install nodemailer --save安装邮件依赖. 接着创建一个文件(s ...

  5. deepin扬声器/耳机没有声音解决方案

    昨天准备在deepin系统下看视频学习一下Linux,结果登入deepin系统后发现不论是外放还是插耳机竟然都没有声音,这种情况以前也出现过,只不过没有在意,后来就自己又好了,今天这次可真是让我决定要 ...

  6. 学习笔记49_Redis

    Redis和memcache区别: 1 . mm是通过客户端驱动实现集群化,Redis是通过服务器配置文件集群 2. redis是可以进行持久化的存储 3. redis提供高级的数据结构,队列,栈都提 ...

  7. Ubuntu13.10编译android源码中遇到的问题

    1. jdk的版本不对 我开始安装的是最新的jdk7,但是编译时会出现jdk的版本

  8. vue中组件的data为什么是一个函数

    1. 前言 在学习vue的时候,一直纳闷一件事:组件的data数据为什么必须要以函数返回的形式,为什么不是简单的对象形式呢?遂带着问题去翻官方文档,文档中自然也写明了这么做的原因,本篇博文以官方文档给 ...

  9. wordpress插件:multiple post thumbnails(可为文章添加多个特色图片)

    我们经常会给wordpress的文章加上特色图片来实现日志缩略图的需求,但是很多时候一张图片并不能够完美而又全面的表达我们wordpress文章的内容,这时候您可能就会需要这样一个能让wordpres ...

  10. Python - selenium自动化-Chrome(headless)

    什么是 Headless Chrome Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序.相比于现代浏览 ...