在本文中,我们将通过一个示例说明如何将“流”(Visual Flow)用于Visualforce页面。

更全面的知识可以参考官方文档。

创建流

我们要创建一个流,它的作用是得到一个“客户”(Account)变量,然后根据其中的自定义字段“是否破产”(Bankrupt__c)来决定是否在客户名称后面加上“已破产”的字样。

步骤如下:

  1. 在新的流中创建一个“SObject对象变量”,这个变量会用于存储“客户”对象的信息

  1. 创建一个“决策”元素,在其中检查刚才建立的客户变量的“是否破产”字段值

  1. 创建一个“分配”元素,和上一步“决策”变量中“已破产”的结果相连接,在其中将客户变量的名称字段后面加上“已破产”字样

  1. 创建一个“快速更新”元素,更新客户变量

完成后的流程图如下:

保存为“流”类型,设置名称为“Check_and_update_bankrupt”,并启用该流。

这时,我们还不能使用它,因为这个流在使用前需要先得到一个“客户”对象。要实现这一点,就需要使用一个Visualforce页面来加载“客户”对象并调用流。

创建Visualforce页面

要将创建的“流”使用于Visualforce页面中,可以使用以下步骤:

  1. 在“设置”界面搜索“Visualforce 页面”,点击“Visualforce 页面”链接,进入Visualforce页面的一览表

  2. 点击“新建”按钮,新建Visualforce页面

  3. 设置“标签”和“名称”属性。设置名称为“Check_Bankrupt_And_Update_Name”

  4. 在“Visualforce Markup”部分删除原有的代码,改为:
<apex:page StandardController="Account"><flow:interview name="Check_and_update_bankrupt"></flow:interview>
</apex:page>
  1. 这里使用了“flow:interview”组件调用了刚才建立的“流”,并且将页面的“StandardController”属性设置为“Account”,标明该页面和“客户”对象相联系

  2. 保存此Visualforce页面

建立按钮调用Visualforce页面

在“客户”的“按钮、链接和操作”部分,新建一个按钮,并将“内容源”设置为“Visualforce页面”。

系统会自动检测所有的Visualforce页面,并在下拉列表中显示“StandardController”属性为“Account”的页面。

在下拉列表中选择刚才建立的页面,保存。

然后将此按钮添加到“客户”的页面布局。

这样,用户在客户的详细信息页面点击“检查破产并更新名称”按钮,就可以使用流了。

将参数传入流

现在还差最后一步工作,就是将按钮所在的客户页面的客户变量传入流中,让流知道哪个“客户”对象需要被检查和更新。

编辑刚才建立的Visualforce页面,在“flow:interview”组件中进行如下修改:

<apex:page StandardController="Account"><flow:interview name="Check_and_update_bankrupt"><apex:param name="AccountVar" value="{!account}"/></flow:interview>
</apex:page>

从上面的代码中可以看到,我们使用了“apex:param”标签来设置流中使用的变量“AccountVar”。

但是这时,如果在客户页面中点击刚才建立的按钮,会直接出现错误。当我们检查调试日志时,会发现这样的错误信息:“流无法访问AccountVar.Bankrupt__c的值”。

这是因为我们在Visualforce页面中通过标准的“Account”控制器传入参数时,标准的控制器并不会调用“客户”对象下面的字段,从而无法检查“Bankrupt__c”的值。

这时,我们需要新建一个Apex类,作为标准“Account”控制器的扩展,在其中要求系统调用“Name”和“Bankrupt__c”字段的值。新建的Apex类如下:

public class AccountCheckBankruptExtension {private final Account acc;public AccountCheckBankruptExtension(ApexPages.StandardController stdController) {stdController.addFields(new List<String>{'Name', 'Bankrupt__c'});this.acc = (Account)stdController.getRecord();}
}

然后将刚才的Visualforce页面修改为:

<apex:page StandardController="Account" Extensions="AccountCheckBankruptExtension"><flow:interview name="Check_and_update_bankrupt"><apex:param name="AccountVar" value="{!account}"/></flow:interview>
</apex:page>

这时,在“是否破产”值为“真”的客户页面点击“检查破产并更新名称”按钮,就可以运行流了。

设置返回跳转链接

虽然流可以顺利运行了,但是流的执行是在新的窗口中执行,结束后会给出“流执行完毕”的字样。为了提高用户体验,我们需要让流在运行结束后返回处理的“客户”页面,从而直接将结果展示为用户。

将刚才的Visualforce页面修改为:

<apex:page StandardController="Account" Extensions="AccountCheckBankruptExtension"><flow:interview name="Check_and_update_bankrupt" finishLocation="{!URLFOR('/' + account.Id)}"><apex:param name="AccountVar" value="{!account}"/></flow:interview>
</apex:page>

在这里,我们使用了“finishLocation”属性来设置流完成后跳转的页面,即跳转到“客户”变量详细信息页面。

执行结果

现在我们就可以检查整个过程了。

首先,进入一个客户的详细信息页面,将“是否破产”改为“真”。

然后点击“检查破产并更新名称”按钮,会弹出一个新的页面。这就是刚才建立的Visualforce页面。在其中,流将会被执行。结束后,跳转到刚才的客户页面。

可以看到,“客户”的“名称”部分已经被加入了“(已破产)”的字样。流执行成功了。

扩展知识

流的变量设定

在流中新建“SObject变量”时,需要将变量的“输入/输出类型”设置为“输入和输出”。否则,此变量有可能无法被Visualforce页面和相应的控制器调用。

在Apex代码中使用Flow.Interview类

在Apex代码中使用Flow.Interview类可以直接引用执行的流的实例,并且可以使用getVariableValue()函数来得到流中的变量的值。

比如上述的示例中,将Apex代码改为:

public class AccountCheckBankruptExtension {public Flow.Interview.Check_and_update_bankrupt flowInstance {get; set;}private final Account acc;public AccountCheckBankruptExtension(ApexPages.StandardController stdController) {stdController.addFields(new List<String>{'Name', 'Bankrupt__c'});this.acc = (Account)stdController.getRecord();}public String getAccName() {Account accInFlow = (Account) flowInstance.getVariableValue('AccountVar');return accInFlow.Name;}
}

在代码中增加了一个变量“flowInstance”,类型是“Flow.Interview.流的名字”。同时也增加了一个函数getAccName(),使用了getVariableValue()函数得到流中的“客户”变量的名称。

将Visualforce页面的代码改为:

<apex:page StandardController="Account" Extensions="AccountCheckBankruptExtension"><flow:interview name="Check_and_update_bankrupt" interview="{!flowInstance}"><apex:param name="AccountVar" value="{!account}"/></flow:interview><apex:outputtext>客户名称:{!accName}</apex:outputtext>
</apex:page>

这样,我们成功的得到了客户的名称,显示在页面底部。

转载于:https://www.cnblogs.com/chengcheng0148/p/use_vf_flow_in_vf_page.html

在Visualforce页面中使用Visual Flow相关推荐

  1. 在Asp.net页面中实现数据饼图

    ASP.NET之所以能够在客户端浏览器中形成各种数据图片,是因为在ASP.NET中提供了绘图功能,具体的作法是先在服务器端创建一个Bitmap实例,然后利用ASP.NET中提供的绘图功能,按照要生成的 ...

  2. 在ASP.NET页面中实现数据柱状图

    棒图有时又称为"Bar"图,在ASP.NET中拥有了一个新功能--绘图功能,通过此功能就能够按照要实现的图表的模样来绘制,最后在客户端的浏览器中形成一个图片,从而显示出图表来. 本 ...

  3. VS2008 Tips #008 如何创建ASP.NET Web 用户控件并包含在Web 页面中

    在 Visual Web Developer 中创建 ASP.NET Web 用户控件就像 ASP.NET Page 页面一样简单. 以下是创建步骤: 1.打开您想添加用户控件的站点. 2.右键点击站 ...

  4. 如何添加地图控件到Windows Phone 8的页面中

    原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目.该地图控件在Windows Phone的SDK 8.0的库 ...

  5. sharedpreferences使用方法_Google 推荐在 MVVM 架构中使用 Kotlin Flow

    前言 在之前分享过一篇 Jetpack 综合实战应用 Jetpack 实战:神奇宝贝 ,这个项目主要包了以下功能: 自定义 RemoteMediator 实现 network + db 的混合使用 ( ...

  6. ASP页面中访问基于.net的COM组件[转]

    在我的编程实践中,需要从.NET的Web Form页面传递加密的字符串信息(如用户名和密码等)到ASP页面,然后在该页面对该加密字符串进行解密.如果传递的不是加密串,通过GET或POST的方式就可以直 ...

  7. JSP页面中常用四种标签

    JSP页面常用四种标签: 1. EL表达式:  ${} 2. jstl表达式(sun apache): <%@ taglib prefix="c" uri="htt ...

  8. 用JavaScript和CSS实现“在页面中水平和垂直居中”的时钟

    思路:实现起来最麻烦的事实上是水平居中和垂直居中,当中垂直居中是最麻烦的. 考虑到浏览器兼容性,网上看了一些资料,发如今页面中垂直居中确实没有什么太好的办法. 于是就採用了position:fixed ...

  9. 小程序全局状态管理,在页面中获取globalData和使用globalSetData

    GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex.redux全局状态管理的解决方案,但是在一个完整的项目中各组件 ...

  10. 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...

    转载:<关于JSP页面中的pageEncoding和contentType两种属性的区别> pageEncoding是jsp文件本身的编码 contentType的charset是指服务器 ...

最新文章

  1. 人工智能及其应用(第5版).蔡自兴-2章课后习题。【参考答案】
  2. python写扫雷脚本_Python自动扫雷实现方法
  3. python观察日志(part4)--字符串拼接方式
  4. 精通语言不等于是一个好的软件开发人员
  5. php语句insert,SQL INSERT INTO
  6. kubernetes视频教程笔记 (2)-kubernetes的组件
  7. MongoVue 使用技巧
  8. 红外热像仪中的“TD”是什么NE?
  9. java 重写或者覆父类方法的使用throws 抛出异常,为什么要小于父类父类,java面试点
  10. 对话冉小波:NULS三年来的实战心得与反思 |链捕手
  11. linux无法解析域名
  12. “对症下药”的11种新的编程语言
  13. html设置图片与边框的距离,css图片如何设置上边框距离
  14. 腾讯云tca认证是什么?含金量怎么样?证书有什么有事吗
  15. 用netcat,SSH构建IP层Tunnel
  16. 可信数智云,联通云的个性化标签
  17. catti二级笔译综合能力真题_【CATTI二级笔译】综合能力知识点总结(一)
  18. LoadRunner 2016首次更新,增强多项功能,支持更多平台|附下载
  19. 人脑如果是台计算机,那么电从哪里来?
  20. 谭浩强c语言不讲位运算呢,谭浩强C语言_CHAR12位运算.DOC

热门文章

  1. MAC编译OpenJDK8:error: ‘‘ within ‘||‘ [-Werror,-Wlogical-op-parentheses]
  2. 一个开发人员,遇到问题一句“加载出错“就完事了?
  3. 如何清理cmake产生的各种文件
  4. 解决办法:E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
  5. 编译OpenJDK12:a microsoft compiler is required
  6. 为不干活的员工辩护,要小心
  7. 联发科想办法与大陆合作是生存的唯一出路
  8. 管理感悟:深入理解软件
  9. 哈佛结构 Linux,哈佛结构与冯诺依曼结构区别
  10. bat脚本 rar压缩文件 rar压缩文件带一层路径 带路径压缩