月度归档: 2017 年 5 月
Salesforce的SplashPage(启动页)-一天一个标准功能系列
最近有小盆友考验我,说客户想点进Tab的时候先进入一个Guide页面,然后点击继续进入list页面,点击Don’t show again下次不再显示此页面,直接进入List页面。
问我该怎么做。
我反问,”你想怎么做?”
“首先呢,建一个Tab”
“废话。哪种Tab。”
“当然是Visualforce Tabs。”
“然后呢。”
“然后我创建一个VF,并且使用标准标签和样式。”
“嗯,为了让用户觉得自己没跳进VF是么?”
“没错,然后我在VF里选中用户点的Tab,之后在页面里写上我要的内容。”
“这个简单,那俩按钮你想怎么实现呢?”
“当然是建两个Button,然后在Controller里实现两个Action。一个Button直接跳转到List页面。另一个Button。。。。”
“Don’t show again button你想怎么实现呢?”
“我在User表上加一个字段,如果用户点了Don’t show again,我就更新一下User身上的Flag,然后在VF初始化的时候就判断User身上的Flag,如果是true就直接跳转。”
“唔。。。可行,你觉得复杂么?”
“还好吧。”
“听说过Splash Page么?”
“啥?”
Splash Page,启动页,醒目页面。是Salesforce提供的标准功能之一。
其作用是在Tab上添加一个启动页面,并且原生支持Don’t show again。
其效果如图

点击Tab之后,会显示指定的内容,并提供Don’t show again与Continue按钮。
不过,我发现只有Custom Object的Tab才可以指定Splash Page,标准Object的Tab不可以。
可能Salesforce觉得标准Object应该不会像Custom Object那样复杂到需要启动页来介绍功能吧。
那么接下来介绍该如何创建一个启动页。
首先,你需要创建Custom Link,此Custom Link为Home的Custom Link,而不是该Custom Object上的Custom Link。

创建的过程与创建button或者link相同,种类有三种,JS,VF或者URL。

然后随便创建一个VF,在此选择。
值得注意的是,一定要记得关闭标准标签和标准样式,否则就会出现像下面这样奇怪的事情。

关闭标准标签标准样式的写法。
<apex:page showheader="false" standardStylesheets="false"> ...... </apex:page>
Custom Link设定好之后,去Tab的设置页面,指定这个Custom Link,大功告成。

Salesforce作为云计算平台,提供了强大的自定义开发能力。但是,现代应用开发思想是轻开发,重配置。常年从事SI的前JAVA从业者,很容易就陷入开发解决一切的思维黑洞。付出高昂的成本反复造轮子,因为其价值也只是在反复造轮子上了。利用标准功能快速的实现客户需求,才是未来的发展方向。大型开发的市场会一直存在,但将将来绝对不会是主流。
Salesforce中Picklist与翻译的故事
不同与Java系统,salesforce给Select或者Drop down,whatever你叫它什么的那个元素提供了一个很好的组织方式———-Picklist。
Picklist作为一种基本数据类型,在salesforce里任何人都可以使用其轻松的创建下拉列表,并动态的控制其中的选项。要知道,在java系统里,为了达到这个目的,可是要上三大框架的。如果不能用自定义标签库,那么在不hard coding的前提下,在画面上可控的显示一个select对于一个新手来讲,将是一个堪比穿越撒哈拉沙漠的挑战。当然,大部分项目都选择直接写死,或者使用Js操纵DOM。
不过Salesforce的Picklist与我们印象中的Select元素还是不同的。
在Spring 17之前(Spring 17 release note),picklist的值只有一个value,所以表示文本也是它,值也是它。所以好多系统就顺水推舟的在代码,validation rule等地方直接用长长的value内容做判断。
突然有一天,客户想对选项的内容做一个小小的改动。。。。。灾难了。
以前的话,更改选项的值,既存数据是不会跟着变的,要手动修数据。现在已经能够做到既存的数据自动跟着变了。但是那些代码里写死的判断等就不行了。
我们知道,html中的select是要分别设定value和label的!在页面表示label,表单里传的是value。这样根据定义好的数据字典,在程序里随便判断value。无论画面表示的本文怎么改都不会影响到程序。
所以sfdc的先贤们发明了一个绝招————翻译。
比如picklist的一个项目的value是1,则在翻译控制台将1翻译成想显示的文本,比如“A”。那么就实现了HTML的Select的特性—–显示的文本和后台传值分开。
正当群众们洋洋得意的时候,Spring17来了。给我们带来了picklist选项的Api Name,参见官方博客。
抱歉,说的不严谨,应该是给我们带来了Picklist选项的Label。
就是说现在Picklist的选项有两个设定值值,一个是Label,一个是Api Name。Api Name其实还是我们以前熟悉的那个选项value,老朋友。新增加的是Label。
那么好玩的地方来了。以前Picklist选项只有一个value的时候,翻译就直接那么翻译了。当Label和Api Name分开之后,翻译是针对谁来进行翻译呢?
这里直接公布答案—–是Label。
可以用下面的代码进行尝试。
设定好翻译之后
List<Schema.PicklistEntry> picklistValues = SomeSobject__c.SomePicklistField__c.getDescribe().getPicklistValues();
for (Schema.PicklistEntry pe: picklistValues) {
system.debug('PicklistEntry Value:' + pe.getValue() + ' Translated Label:' + pe.getLabel());
}
value既Api Name,Label既Label
这样,我们是可以做到在Apex中获取Picklist选项的Label,而且获得的还是翻译后的Label。
可曾记起我们还有Formula呢,isPickVal函数判断的又是谁呢—————没错,还是老朋友,Api Name。
目前我还没有找到如何在formula里获取Label名的方法。