1. 程式人生 > >salesforce零基礎學習(八十六)Ajax Toolkit (VF頁面中使用及javascript action使用)

salesforce零基礎學習(八十六)Ajax Toolkit (VF頁面中使用及javascript action使用)

ssi rate 基礎學習 lean 返回結果 item exceptio ont tom

Ajax Toolkit 參考文檔:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf

在項目中,我們有時會在自定義button或者action上使用javascript進行一些SOQL或者DML操作處理;有時會在VF頁面中獲取相關數據進行邏輯處理,或者進行簡單的DML操作,這時候就會使用到Ajax Toolkit。

因為Ajax Toolkit操作數據信息是在瀏覽器端的,進行復雜的邏輯或者對大量數據處理會影響前端的性能,所以不是所有的場景都適合使用ajax toolkit。可以在以下情景(不僅限於以下)下使用:

  • 展示或者更新單條數據
  • 在一些數據中展示一兩列信息
  • 執行簡單的業務邏輯

因為使用在瀏覽器端,所以保證數據量越少,業務邏輯越少,是最好的。以下從兩個方面進行Ajax Toolkit介紹:VF / JavaScript Action

Ajax Toolkit 可以分成三步走:鏈接Ajax Toolkit API,嵌入API Call,對結果進行處理。接下來會將後兩步揉成一步進行處理。

一.鏈接到Ajax Toolkit API

VF:在頁面中引入js,其中42.0代表version,這個值代表著當前connection.js的版本號。你也可以設置成41.0,40.0等等。

<script src="../../soap/ajax/42.0/connection.js" type
="text/javascript"></script> <script> sforce.connection.sessionId=‘{!GETSESSIONID()}‘; //TODO </script>

onclick javascript:引用{!requireScript("/soap/ajax/42.0/connection.js")}

當引入的javascript執行後,toolkit便會被加載並創建了一個全局的對象sforce.connection,你可以通過這個對象訪問所有的API call以及ajax toolkit toolkit的方法。toolkit支持所有的SOAP API calls.

可用的核心API介紹鏈接:https://developer.salesforce.com/docs/atlas.en-us.212.0.api.meta/api/sforce_api_calls_list.htm

二.在javascript中嵌入API Call並進行結果處理

Ajax Toolkit 支持同步和異步兩種調用。

同步調用和異步調用的區別為:同步調用為當向服務器端發送請求後,需要一直等到服務器端返回結果,並針對結果進行後期的處理;異步調用為當向服務器發送請求後,可以繼續進行其他的處理,當服務器有調用返回結果後,再進行結果處理。異步調用需要在API call中添加一個參數用來做call back的函數處理。

同步調用格式:
sforce.connection.method("argument1","argument2",...);

異步調用格式:
sforce.connection.method("argument1","argument2",...,"callback_function");

因為調用有可能出現異常,同步和異步的異常處理如下:
同步異常處理為在調用處使用try catch 來捕獲異常

異步異常處理為異步的callback result提供了一個onFailure配置,當出現異常後,會執行onFailure配置的方法,成功會執行onsuccess方法
因為異步調用為結果什麽時候返回,客戶端什麽時候處理,當後臺處理特別慢的情況下,前端等待時間太長會很不友好,異步調用提供了一個timeout配置屬性,用來設置異步調用最長時間,單位是以毫秒為單位,最小值為1
完整異步調用格式
var callback = {onSuccess: handleSuccess, onFailure: handleFailure,timeout:1000};
function handleSuccess(result) {}
function handleFailure(error) {}
sforce.connection.query("Select name from Account", callback);

ajax toolkit call 不論當前搜索的數據字段在表結構中是什麽類型,使用ajax toolkit query返回的數據類型均為string類型,如果搜索的字段在數據庫中存儲的value為null,則獲取到的值為null,如果當前沒有搜索此字段,但是在前臺js中有引用到,則值為undefined.

除了針對數據的CRUD外,ajax toolkit 還支持很多操作,比如 提交審批 / 通過Schema獲取sObject以及Field的相關元數據信息 / 發送郵件等功能

同步調用舉例:

https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples.htm

異步調用舉例:

https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples_asynch.htm

我們有時還需要調用相關類的方法。如果需要調用apex 相關類的方法,需要引入apex.js

VF寫法:<script src="/soap/ajax/41.0/apex.js" type="text/javascript"></script>

action寫法:{!requireScript("/soap/ajax/41.0/apex.js")}

調用的類的方法必須聲明稱webservice,方法的參數需要為 基本數據類型,sObject類型或者是兩者數據類型的List

js端調用結構為(如果有結果返回,則接收;如果無結果返回,則不需要接收)

var result = sforce.apex.execute("className","methodName","{param1Key:param1Value,param2Key:param2Value}");

如果調用的方法沒有參數,則調用結構為

var reuslt = sforce.apex.execute("className","methodName","{}");

三.舉例

需求:客戶上面有多個聯系人,如果沒有選擇聯系人,則提示需要選擇至少一個聯系人。選擇的聯系人要求聯系人的郵箱必須都不能為空。點擊按鈕後更新聯系人Is_Checked__c設置為true。

1.Contact上創建字段Is_Checked__c

技術分享圖片

2.創建webservice類,參數為ContactList,將參數中所有的Contact的Is_Checked__c更新為true

global without sharing class ContactController {
    
    static webservice Boolean changeContactsStatus(List<Contact> contactList) {
        List<Contact> updateContactList = new List<Contact>();
        for(Contact c : contactList) {
            Contact tempContact = new Contact();
            tempContact.Id = c.Id;
            tempContact.Is_Checked__c = true;
            updateContactList.add(tempContact);
        }
        try {
            if(updateContactList.size() > 0) {
                update updateContactList;
            }
            return true;
        } catch(Exception e) {
            return false;
        }
    }
}

3.Contact創建custom action,設置類型為List Button,勾選Display Checkboxes,Behavor選擇為execute javascript

技術分享圖片

對應的javascript代碼如下(函數描述:https://help.salesforce.com/articleView?err=1&id=customize_functions.htm&type=5)

{!requireScript("/soap/ajax/41.0/connection.js")}
{!requireScript("/soap/ajax/41.0/apex.js")}
var selectedIds = {!GETRECORDIDS($ObjectType.Contact)};
var contactIds = ‘‘;
if(selectedIds.length == 0) {
  alert(‘You have to choose at least one item‘);
} else {
  selectedIds.forEach(function(item,index){
    contactIds += ‘\‘‘ + item + ‘\‘‘;
    if(index != selectedIds.length-1) {
      contactIds += ‘,‘;
    }
  });

  var contactQuery = "SELECT ID,Name,Email,LastModifiedDate,CreatedDate FROM Contact WHERE ID in (" + contactIds + ")";
  result = sforce.connection.query(contactQuery);                                
  records = result.getArray("records");
  var isSuccess = true;
  records.forEach(function(item,index){
    if(item.Email == null || item.Email == ‘‘) {
       isSuccess = false;
    }
  })
  if(isSuccess) {
      var executeResult = sforce.apex.execute("ContactController","changeContactsStatus",{contactList:records});
      if(executeResult) {
        alert(‘Operate Success!‘);
      } else {
        alert(‘Operate Failed!‘);
      }
  } else {
    alert(‘The Items you selected have empty email.please check it again‘);
  }

}

4.將Test Action設置在Account的Related List(Contact List)設置

技術分享圖片

效果展示:

1.不選情況下

技術分享圖片

2.正常操作

技術分享圖片

總結:針對Ajax Toolkit,如果數據量不多並且需要在前臺處理情況下,可以考慮使用此種方式。不過lightning不支持action使用javascript,所以此種方式只支持classic的action 方式的javascript。

salesforce零基礎學習(八十六)Ajax Toolkit (VF頁面中使用及javascript action使用)