在Visualforce頁面中使用Visual Flow

在本文中,我們將通過一個示例說明如何將「流」(Visual Flow)用於Visualforce頁面。

更全面的知識可以參考官方文檔。

創建流

我們要創建一個流,它的作用是得到一個「客戶」(Account)變數,然後根據其中的自定義欄位「是否破產」(Bankrupt__c)來決定是否在客戶名稱後面加上「已破產」的字樣。

步驟如下:

  • 在新的流中創建一個「SObject對象變數」,這個變數會用於存儲「客戶」對象的信息

  • 創建一個「決策」元素,在其中檢查剛才建立的客戶變數的「是否破產」欄位值

  • 創建一個「分配」元素,和上一步「決策」變數中「已破產」的結果相連接,在其中將客戶變數的名稱欄位後面加上「已破產」字樣

  • 創建一個「快速更新」元素,更新客戶變數

完成後的流程圖如下:

保存為「流」類型,設置名稱為「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">n <flow:interview name="Check_and_update_bankrupt"></flow:interview>n</apex:page> n

  • 這裡使用了「flow:interview」組件調用了剛才建立的「流」,並且將頁面的「StandardController」屬性設置為「Account」,標明該頁面和「客戶」對象相聯繫

保存此Visualforce頁面

建立按鈕調用Visualforce頁面

在「客戶」的「按鈕、鏈接和操作」部分,新建一個按鈕,並將「內容源」設置為「Visualforce頁面」。

系統會自動檢測所有的Visualforce頁面,並在下拉列表中顯示「StandardController」屬性為「Account」的頁面。

在下拉列表中選擇剛才建立的頁面,保存。

然後將此按鈕添加到「客戶」的頁面布局。

這樣,用戶在客戶的詳細信息頁面點擊「檢查破產並更新名稱」按鈕,就可以使用流了。

將參數傳入流

現在還差最後一步工作,就是將按鈕所在的客戶頁面的客戶變數傳入流中,讓流知道哪個「客戶」對象需要被檢查和更新。

編輯剛才建立的Visualforce頁面,在「flow:interview」組件中進行如下修改:

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

從上面的代碼中可以看到,我們使用了「apex:param」標籤來設置流中使用的變數「AccountVar」。

但是這時,如果在客戶頁面中點擊剛才建立的按鈕,會直接出現錯誤。當我們檢查調試日誌時,會發現這樣的錯誤信息:「流無法訪問AccountVar.Bankrupt__c的值」。

這是因為我們在Visualforce頁面中通過標準的「Account」控制器傳入參數時,標準的控制器並不會調用「客戶」對象下面的欄位,從而無法檢查「Bankrupt__c」的值。

這時,我們需要新建一個Apex類,作為標準「Account」控制器的擴展,在其中要求系統調用「Name」和「Bankrupt__c」欄位的值。新建的Apex類如下:

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

然後將剛才的Visualforce頁面修改為:

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

這時,在「是否破產」值為「真」的客戶頁面點擊「檢查破產並更新名稱」按鈕,就可以運行流了。

設置返回跳轉鏈接

雖然流可以順利運行了,但是流的執行是在新的窗口中執行,結束後會給出「流執行完畢」的字樣。為了提高用戶體驗,我們需要讓流在運行結束後返回處理的「客戶」頁面,從而直接將結果展示為用戶。

將剛才的Visualforce頁面修改為:

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

在這裡,我們使用了「finishLocation」屬性來設置流完成後跳轉的頁面,即跳轉到「客戶」變數詳細信息頁面。

執行結果

現在我們就可以檢查整個過程了。

首先,進入一個客戶的詳細信息頁面,將「是否破產」改為「真」。

將「是否破產」改為「真」

然後點擊「檢查破產並更新名稱」按鈕,會彈出一個新的頁面。這就是剛才建立的Visualforce頁面。在其中,流將會被執行。結束後,跳轉到剛才的客戶頁面。

可以看到,「客戶」的「名稱」部分已經被加入了「(已破產)」的字樣。流執行成功了。

擴展知識

流的變數設定

在流中新建「SObject變數」時,需要將變數的「輸入/輸出類型」設置為「輸入和輸出」。否則,此變數有可能無法被Visualforce頁面和相應的控制器調用。

在Apex代碼中使用Flow.Interview類

在Apex代碼中使用Flow.Interview類可以直接引用執行的流的實例,並且可以使用getVariableValue()函數來得到流中的變數的值。

比如上述的示例中,將Apex代碼改為:

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

在代碼中增加了一個變數「flowInstance」,類型是「Flow.Interview.流的名字」。同時也增加了一個函數getAccName(),使用了getVariableValue()函數得到流中的「客戶」變數的名稱。

將Visualforce頁面的代碼改為:

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

這樣,我們成功的得到了客戶的名稱,顯示在頁面底部。


推薦閱讀:

Salesforce.com 收購 Heroku 中有什麼故事?
Salesforce和SAP的區別是什麼?

TAG:Salesforce | 业务流程 | 流程设计 |