在Salesforce中可以对某一个Object的Standard Button或Link进行重写

在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态;或者在New一个Object的时候要对一些Field进行预赋值。

1):如下图所示,展现了一个Object中所有的Button,Link和Action,那么用红框框出来的便是Standard的

 

2):这里我们以New按钮为例进行展示,点击上图中New前方所对应的Edit操作,会出现下面图示,默认状态选中的是No Override,这里我们要选中的是Visualforce Page,在右侧对应的下拉列表中可以选择对应的page

 

3):那么什么样的page可以出现在上图的下拉列表中呢,请看下面的Visualforce Page的代码,即:标记了standardController为该Object的page

<apex:page standardController="Order__c" extensions="NewOrderPrefillController" action="{!NewOrderPrefill}">
    <apex:outputPanel >
        <p>This is New Order Prefill Page.</p>
    </apex:outputPanel>
</apex:page>

 

4):根据上面的Visualforce page我们要实现对应的class代码,如下所示,这里的代码做了一个page的跳转,即:点击New按钮之后,运行NewOrderPrefillController,即构造函数,完成对RetUrl属性的赋值,之后运行NewOrderPrefill方法,跳转到对应的page中,实质上是在创建Object实例的时候对Name进行预赋值

public with sharing class NewOrderPrefillController {
    public string RetUrl {get;set;}
    
    public NewOrderPrefillController(ApexPages.StandardController stdController) {
        RetUrl = ApexPages.currentPage().getParameters().get('retURL');
        system.debug('00002 --- RerUrl' + RetUrl);
        if(RetUrl == null) RetUrl = '/';
        
        RetUrl = '/a00/e?Name=NewOrder&nooverride=1';
    }
    
    public PageReference NewOrderPrefill(){
        PageReference page = new PageReference(RetUrl);
        page.setRedirect(true);
        return page;
    }
}

 

5):点击第2步中的Save按钮保存成功之后,会看到如下的变化,New对应的第5列Content Source变成了我们选择的NewOrderPrefill(Visualforce Page),第6列的Overridden被选中

 

6):接下来我们再对Salesforce中的Url进行一个分析,假设不对New按钮进行重写,那么点击New按钮之后会跳到如下界面,对应的URL中有一个retURL参数,其对应的值为/a00/o,表示的是此Object的列表页,而前面的/a00/e表示的是此Object的New/Edit页面

 

7):如果我们对New按钮进行重写之后【将第4步中NewOrderPrefillController方法中的RetURL的赋值去掉,并且将NewOrderPrefill方法中的return page 改成return null】点击New之后的Url中会多出两个参数,一个是save_new,另外一个是sfdc.override,这里的override设置为1标识着New按钮的事件已经被重写了,当然了Url显示的是当前所指向的NewOrderPrefill页面

 

8):我们对第6步中的URL进行一个改变,如下所示,所得到的结果是来到了New/Edit页面,并且Name字段被预赋了值

 

9):通过第8步中的现象,我们再回顾第4步中的代码就不难发现这段代码所表达的含义了,并且我们追加了另外一个参数nooverride=1,表达的含义是:对Name进行预赋值之后,不再继续走我们重写的逻辑,这样有效的防止了在此处循环跳转的问题

 

综上所述,用实例简单的描述了对standard类型Button的重写,其他具体的Button或者Link以此类推即可。

其实实现上述所描述的功能,也可以自定义一个Button来完成Name字段的预赋值,但是自定义的Button目前还无法添加到New Button所在的Recent Items Page中,这一点期待着Salesforce能够提供对应的solutions【详情请看:https://success.salesforce.com/ideaView?id=08730000000BqfqAAC 】,当然了这样做还有一点是要去自己隐藏原始的New Button,倒不如直接Override了。

进一步分析,如果我们想要其他Field的值来填充Name,就在对应的Trigger中添加逻辑就可以了。

当然了,这是对Standard Field进行预填默认值的方式,如果是Custom的Field的话,可以直接在setup中设置default value.

 

posted @ 2014-05-04 19:57  Eric Sun  阅读(2290)  评论(0编辑  收藏  举报