zoukankan      html  css  js  c++  java
  • 在Visualforce页面中使用Visual Flow

    在本文中,我们将通过一个示例说明如何将“流”(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页面”。

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

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

    连接Visualforce页面到按钮

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

    将按钮添加到页面布局

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

    将参数传入流

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

    编辑刚才建立的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>
    

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

    流的执行结果,显示了客户名称

  • 相关阅读:
    JSP标签介绍
    JSP四大作用域属性范围
    JSP九大内置对象及四个作用域
    maven:Fatal error compiling: 无效的目标发行版: 1.8.0_45 -> [Help 1]
    浅谈Session与Cookie的区别与联系
    Servlet入门实践
    安卓常用布局基本属性
    安卓常用布局
    Android开发中Handler的经典总结
    三种方法写监听事件
  • 原文地址:https://www.cnblogs.com/chengcheng0148/p/use_vf_flow_in_vf_page.html
Copyright © 2011-2022 走看看