根據核心元件建立最適化表單的自訂函式
以核心元件為基礎的最適化Forms會根據使用者輸入調整內容和行為,以提供動態使用者體驗。 自訂函式可讓開發人員擴充功能,確保表單符合特定需求。 透過整合自訂函式,開發人員可以實作複雜的邏輯、自動化流程,並匯入符合特定業務需求或使用者期望的獨特互動。 這可確保表單不僅適應各種條件,還可為各種使用案例提供更精確有效的解決方案。
本文會逐步引導您使用核心元件,針對Adaptive Forms建立自訂函式。
考量事項
-
parameter type
和return type
不支援None
。 -
自訂函式清單中不支援的函式包括:
- 產生器函式
- 非同步/等待函式
- 方法定義
- 類別方法
- 預設引數
- Rest引數
建立自訂函式的先決條件
開始將自訂函式新增至最適化Forms之前,請確定您具備下列條件:
軟體:
-
純文字編輯器(IDE):雖然任何純文字編輯器都可以運作,但Microsoft Visual Studio Code之類的整合式開發環境(IDE)可提供進階功能,讓編輯更輕鬆。
-
Git: 管理程式碼變更需要此版本控制系統。 如果您尚未安裝,請從https://git-scm.com下載。
建立自訂函數 create-custom-function
建立使用者端程式庫以呼叫規則編輯器中的自訂函式。 如需詳細資訊,請參閱使用使用者端資料庫。
建立自訂函式的步驟如下:
建立使用者端資源庫 create-client-library
您可以透過新增使用者端資料庫來新增自訂函式。 若要建立使用者端程式庫,請執行下列步驟:
複製存放庫
複製您的AEM Formsas a Cloud Service存放庫:
-
開啟命令列或終端機視窗。
-
導覽至您電腦上要儲存存放庫的位置。
-
執行以下命令以複製存放庫:
git clone [Git Repository URL]
這個命令會下載存放庫並在您的電腦上建立複製存放庫的本機資料夾。 在本指南中,我們將此資料夾稱為[AEMaaCS專案目錄]。
新增使用者端資料庫資料夾
若要將新的使用者端程式庫資料夾新增至[AEMaaCS專案目錄],請遵循下列步驟:
-
在編輯器中開啟[AEMaaCS專案目錄]。
-
找到
ui.apps
。 -
新增資料夾。 例如,新增名為
experience-league
的資料夾。 -
導覽至
/experience-league/
資料夾並新增ClientLibraryFolder
。 例如,建立名為customclientlibs
的使用者端資料庫資料夾。Location is: [AEMaaCS project directory]/ui.apps/src/main/content/jcr_root/apps/
新增檔案和資料夾至使用者端資料庫資料夾
將下列專案新增至新增的使用者端程式庫資料夾:
- .content.xml檔案
- js.txt檔案
- js資料夾
Location is: [AEMaaCS project directory]/ui.apps/src/main/content/jcr_root/apps/experience-league/customclientlibs/
-
在
.content.xml
中新增下列幾行程式碼:code language-javascript <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:primaryType="cq:ClientLibraryFolder" categories="[customfunctionscategory]"/>
note note NOTE 您可以為 client library folder
和categories
屬性選擇任何名稱。 -
在
js.txt
中新增下列幾行程式碼:code language-javascript #base=js function.js
-
在
js
資料夾中,將JavaScript檔案新增為function.js
,其中包含自訂函式:code language-javascript /** * Calculates Age * @name calculateAge * @param {object} field * @return {string} */ function calculateAge(field) { var dob = new Date(field); var now = new Date(); var age = now.getFullYear() - dob.getFullYear(); var monthDiff = now.getMonth() - dob.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < dob.getDate())) { age--; } return age; }
-
儲存檔案。
在filter.xml中包含新資料夾:
-
導覽至[AEMaaCS專案目錄]中的
/ui.apps/src/main/content/META-INF/vault/filter.xml
檔案。 -
開啟檔案,並在結尾新增下列行:
<filter root="/apps/experience-league" />
-
儲存檔案。
將新建立的使用者端資料庫資料夾部署至您的AEM環境
將AEM as a Cloud Service [AEMaaCS專案目錄]部署至您的Cloud Service環境。 若要部署至您的Cloud Service環境:
-
提交變更
- 使用以下命令在存放庫中新增、提交和推播變更:
code language-javascript git add . git commit -a -m "Adding custom functions" git push
-
部署更新的程式碼:
- 透過現有的完整棧疊管道觸發計畫碼部署。 這會自動建置及部署更新的程式碼。
如果您尚未設定管道,請參閱上的指南如何設定AEM Formsas a Cloud Service的管道。
管道執行成功後,新增到使用者端資料庫中的自訂函式便可在最適化表單規則編輯器中使用。
將使用者端程式庫新增至最適化表單 use-custom-function
將使用者端程式庫部署到Forms CS環境後,請在最適化表單中使用其功能。 若要在最適化表單中新增使用者端程式庫
-
在編輯模式中開啟您的表單。 若要以編輯模式開啟表單,請選取表單並選取 編輯。
-
開啟內容瀏覽器,然後選取最適化表單的「指引容器」元件。
-
按一下「指引容器」屬性 圖示。此時會開啟「最適化表單容器」對話框。
-
開啟 基本 標籤,並從下拉式清單中選取 使用者端程式庫類別 的名稱(在此案例中選取
customfunctionscategory
)。note note NOTE 在 使用者端資料庫類別 欄位中指定逗號分隔的清單,可新增多個類別。 -
按一下 「完成」。
您可以使用JavaScript註解,在最適化表單🔗的規則編輯器中使用自訂函式。
在最適化表單中使用自訂函式
在最適化表單中,您可以在規則編輯器🔗中使用自訂函式。 讓我們將下列程式碼新增至JavaScript檔案(Function.js
檔案),以根據出生日期計算年齡(YYYY-MM-DD)。 建立自訂函式為calculateAge()
,它以出生日期作為輸入並傳回年齡:
/**
* Calculates Age
* @name calculateAge
* @param {object} field
* @return {string}
*/
function calculateAge(field) {
var dob = new Date(field);
var now = new Date();
var age = now.getFullYear() - dob.getFullYear();
var monthDiff = now.getMonth() - dob.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < dob.getDate())) {
age--;
}
return age;
}
在上述範例中,當使用者以(YYYY-MM-DD)格式輸入出生日期時,會叫用自訂函式calculateAge
並傳回年齡。
讓我們預覽表單,以觀察如何透過規則編輯器實作自訂函式:
自訂函式的功能
AEM表單中的自訂函式提供強大的解決方案,可擴充及個人化表單的功能。 您可以使用自訂函式來符合您組織的特定需求。
這些函式支援各種功能,包括使用特定欄位、使用全域欄位和非同步操作,以及合併快取機制。 這種靈活性可確保表單能夠適應複雜的需求,並提供有效率、量身打造的使用者體驗。 運用這些進階功能,您可以增強表單互動並最佳化效能,讓您的AEM表單功能更強大,回應速度也更快。
讓我們來探討自訂函式的功能。
自訂函式中的非同步支援 support-of-async-functions
非同步自訂函式未出現在規則編輯器清單中。 不過,您也可以在使用同步函式運算式建立的自訂函式中叫用非同步函式。
檢視以下程式碼,瞭解如何使用自訂函式叫用非同步函式:
async function asyncFunction() {
const response = await fetch('https://petstore.swagger.io/v2/store/inventory');
const data = await response.json();
return data;
}
/**
* callAsyncFunction
* @name callAsyncFunction callAsyncFunction
*/
function callAsyncFunction() {
asyncFunction()
.then(responseData => {
console.log('Response data:', responseData);
})
.catch(error => {
console.error('Error:', error);
});
}
在上述範例中,asyncFunction函式是asynchronous function
。 它透過向https://petstore.swagger.io/v2/store/inventory
發出GET
請求來執行非同步操作。 它會使用await
等待回應、使用response.json()
將回應本文剖析為JSON,然後傳回資料。 callAsyncFunction
函式是同步自訂函式,會叫用asyncFunction
函式並在主控台中顯示回應資料。 雖然callAsyncFunction
函式是同步的,但它會呼叫非同步asyncFunction函式,並以then
和catch
陳述式處理其結果。
若要檢視其運作情況,讓我們新增按鈕,並為按鈕建立規則,此規則會在按鈕按一下時叫用非同步函式。
請參考下方主控台視窗的圖例,以示範當使用者按一下Fetch
按鈕時,會叫用自訂函式callAsyncFunction
,進而呼叫非同步函式asyncFunction
。 Inspect主控台視窗中,檢視對按鈕點按的回應:
自訂函式中支援的欄位和全域範圍物件 support-field-and-global-objects
欄位物件是指表單中的個別元件或元素,例如文字欄位、核取方塊。 全域物件包含唯讀變數,例如表單例項、目標欄位例項,以及在自訂函式內進行表單修改的方法。
param {scope} globals
必須是最後一個引數,且不會顯示在調適型表單的規則編輯器中。自訂函式中的快取支援
Adaptive Forms會在規則編輯器中擷取自訂函式清單時,實作自訂函式的快取,以增強回應時間。 在error.log
檔案中會顯示訊息為Fetched following custom functions list from cache
。
具有快取支援的
如果修改自訂函式,快取會失效,並加以剖析。
疑難排解
-
如果包含自訂函式程式碼的JavaScript檔案發生錯誤,則自訂函式不會列在最適化表單的規則編輯器中。 若要檢查自訂函式清單,您可以導覽至
error.log
檔案以找出錯誤。 發生錯誤時,自訂函式清單會顯示為空白:如果沒有錯誤,則會擷取自訂函式並出現在
error.log
檔案中。 在error.log
檔案中顯示為Fetched following custom functions list
的訊息:使用適當的自訂函式
下一步
現在讓我們檢視以核心元件為基礎的最適化表單的各種自訂函式範例。