工作流模型由各種類型的一系列步驟組成。 根據類型,這些步驟可以配置並擴展參數和指令碼,以提供所需的功能和控制。
每個步驟元件都有一個步驟屬性對話框,用於定義和編輯所需屬性。
在屬性對話框的Common頁籤上,大多數工作流步驟元件都可以使用以下屬性組合:
標題
步驟的標題。
說明
步驟的說明。
工作流程分段
將舞台套用至步驟的下拉式選擇器。
逾時
步驟將在此時段後「逾時」。
您可以選擇:Off、Immediate、1h、6h、12h、24h。
逾時處理常式
當步驟逾時時,控制工作流程的處理程式;例如:
Auto Advancer
處理常式前進
選擇此選項可自動將工作流推進到執行後的下一個步驟。 如果未選取,實施指令碼必須處理工作流程的進階。
屬性對話框的用戶/組頁籤上的許多工作流步驟元件可以使用以下屬性:
透過電子郵件通知使用者
使用者/群組
AND Split會在工作流中建立拆分,之後兩個分支都將處於活動狀態。 您可以視需要將工作流程步驟新增至每個分支。 此步驟可讓您在工作流程中引入多個處理路徑。 例如,您可以允許同時執行某些審核步驟,以節省時間。
編輯AND Split屬性:
視需要將工作流程步驟新增至分支。
容器步驟會啟動另一個以子工作流程執行的工作流程模型。
此容器可讓您重複使用工作流程模型,以實作一般的步驟順序。 例如,翻譯工作流程模型可用於多個編輯工作流程。
若要設定步驟,請編輯並使用下列標籤:
容器
轉至步驟允許您根據ECMAScript的結果指定要執行的工作流模型中的下一個步驟:
true
:「轉 至步 驟完成」(Goto Stepcompletes)和工作流引擎執行指定步驟。
false
:Goto步 驟完 成和常規路由邏輯決定要執行的下一步。
轉至步驟可讓您在工作流模型中實施高級路由結構。 例如,要實施循環,可以定義Goto步驟以在工作流中執行前一步驟,指令碼將評估循環條件。
若要設定步驟,請編輯並使用下列標籤:
程序
指定指令碼路徑或指令碼。 兩個選項不能同時使用。 如果您為這兩個屬性指定值,則步驟會使用指令碼路徑。
模擬for循環需要您保持已發生循環迭代次數的計數:
例如,要實施對多個JCR節點執行操作的工作流,可以使用循環計數器作為節點的索引。 若要保存計數,請將integer
值儲存在工作流程例項的資料地圖中。 使用Goto Step的指令碼來增加計數,並比較計數與退出標準。
function check(){
var count=0;
var keyname="loopcount"
try{
if (workflowData.getMetaDataMap().containsKey(keyname)){
log.info("goto script: found loopcount key");
count= parseInt(workflowData.getMetaDataMap().get(keyname))+1;
}
workflowData.getMetaDataMap().put(keyname,count);
}catch(err) {
log.info(err.message);
return false;
}
if (parseInt(count) <7){
return true;
} else {
return false;
}
}
OR Split會在工作流中建立拆分,之後只有一個分支處於活動狀態。 此步驟可讓您將條件式處理路徑引入工作流程中。 您可以視需要將工作流程步驟新增至每個分支。
編輯OR Split屬性:
常見
分支: x>
每個分支都有一個單獨的頁籤:
指定指令碼路徑或指令碼。 兩個選項不能同時使用。 如果您為這兩個屬性指定值,則步驟會使用指令碼路徑。
請參閱定義OR分割的規則。
視需要將工作流程步驟新增至分支。
參與者步驟可讓您為特定動作指派所有權。 只有當使用者已手動確認步驟時,工作流程才會繼續。 當您希望某人對工作流程採取動作時,就會使用此功能;例如,審核步驟。
雖然不直接相關,但在指派動作時必須考慮使用者授權;使用者必須擁有工作流程裝載之頁面的存取權。
若要設定步驟,請編輯並使用下列標籤:
當出現以下情況時,始終會通知工作流啟動器:
必須設定某些屬性,才能啟用電子郵件通知。 您也可以自訂電子郵件範本,或新增新語言的電子郵件範本。 請參閱設定電子郵件通知以在AEM中設定電子郵件通知。
使用對話參與者步驟從指派工作項目的使用者收集資訊。 此步驟對於收集稍後在工作流程中使用的少量資料非常有用。
完成步驟後,「完成工作項目」(Complete Work Item)對話框將包含您在對話框中定義的欄位。 在欄位中收集的資料會儲存在工作流程裝載的節點中。 隨後的工作流步驟可以從儲存庫讀取值。
要配置步驟,請指定要將工作項指定給的組或用戶,以及對話框的路徑。
若要設定步驟,請編輯並使用下列標籤:
對話方塊
要建立對話框:
您可以將介面工具集資料儲存在工作流程裝載或工作項目中繼資料中。 介面工具集節點的name
屬性格式決定資料的儲存位置。
將資料與裝載一起儲存
要將Widget資料儲存為工作流裝載的屬性,請對Widget節點的name屬性值使用以下格式:
./jcr:content/nodename
資料儲存在裝載節點的nodename
屬性中。 如果節點不包含該屬性,則會建立該屬性。
當與裝載一起儲存時,後續使用相同裝載的對話方塊會覆寫屬性的值。
將資料與工作項目一起儲存
要將Widget資料儲存為工作項目元資料的屬性,請對name屬性的值使用以下格式:
nodename
資料儲存在工作項metadata
的nodename
屬性中。 如果對話方塊隨後與相同的裝載搭配使用,則會保留資料。
對話框結構
「對話方塊參與者步驟」(Dialog Participant Steps)對話框與您為編寫元件而建立的對話框類似。 它們儲存在:
/apps/myapp/workflow/dialogs
標準觸控式UI的對話方塊具有下列節點結構:
newComponent (cq:Component)
|- cq:dialog (nt:unstructured)
|- content
|- layout
|- items
|- column
|- items
|- component0
|- component1
|- ...
有關詳細資訊,請參閱建立和配置對話框。
對話框路徑屬性
對話參與者步驟具有對話路徑屬性(以及參與者步驟的屬性)。 對話路徑屬性的值是對話框dialog
節點的路徑。
例如,該對話框包含在儲存在節點中名為EmailWatch
的元件中:
/apps/myapp/workflows/dialogs
對於啟用觸控的UI,對話路徑屬性會使用下列值:
/apps/myapp/workflow/dialogs/EmailWatch/cq:dialog
示例對話框定義
以下XML代碼片段代表一個對話框,該對話框將String
值儲存在裝載內容的watchEmail
節點中。 標題節點表示TextField元件:
jcr:primaryType="nt:unstructured"
jcr:title="Watcher Email Address Dialog"
sling:resourceType="cq/gui/components/authoring/dialog">
<content jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/foundation/container">
<layout jcr:primaryType="nt:unstructured"
margin="false"
sling:resourceType="granite/ui/components/foundation/layouts/fixedcolumns"
/>
<items jcr:primaryType="nt:unstructured">
<column jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/foundation/container">
<items jcr:primaryType="nt:unstructured">
<title jcr:primaryType="nt:unstructured"
fieldLabel="Notification Email Address"
name="./jcr:content/watchEmails"
sling:resourceType="granite/ui/components/foundation/form/textfield"
/>
</items>
</column>
</items>
</content>
</cq:dialog>
此範例會在啟用觸控功能的UI中產生對話方塊,例如:
動態參與者步驟元件與參與者步驟類似,其差異是在運行時自動選擇參與者。
要配置步驟,請選擇參與者選擇器,該選擇器標識要將工作項目分配給的參與者,以及對話框。
若要設定步驟,請編輯並使用下列標籤:
參與者選擇器
對話方塊
您會建立參與者選擇器。 因此,您可以使用任何選擇邏輯或標準。 例如,您的參與者選擇器可以選取工作項目最少的使用者(在群組內)。 您可以建立任意數量的參與者選擇器,以便用於工作流模型中動態參與者步驟元件的不同實例。
建立OSGi服務或ECMAScript,以選擇使用者將工作項目指派給。
ECMAscript
指令碼必須包含名為getParticipant的函式,其會傳回使用者ID為String
值。 將自訂指令碼儲存在/apps/myapp/workflow/scripts
資料夾或子資料夾中。
標準AEM例項中包含範例指令碼:
/libs/workflow/scripts/initiator-participant-chooser.ecma
您必須不要變更/libs
路徑中的任何項目。
這是因為下次升級實例時會覆寫/libs
的內容(當您套用修補程式或功能套件時可能會覆寫)。
此指令碼選擇工作流啟動器作為參與者:
function getParticipant() {
return workItem.getWorkflow().getInitiator();
}
工作流啟動器參與者選擇器元件擴展動態參與者步驟並使用此指令碼作為步驟實施。
OSGi服務
服務必須實作com.day.cq.workflow.exec.ParticipantStepChooser介面。 介面定義以下成員:
SERVICE_PROPERTY_LABEL
欄位:使用此欄位指定參與者選擇器的名稱。名稱會出現在動態參與者步驟屬性中的可用參與者選擇器清單中。getParticipant
方法:將動態解析的承擔者ID返回 String
值。getParticipant
方法返回動態解析的承擔者ID。 這可以是群組ID或使用者ID。
但是,在返回參與者清單時,組ID只能用於參與者步驟。 對於動態參與者步驟,會傳回空白清單,這無法用於委派。
若要將您的實作提供給動態參與者步驟元件,請將您的Java類別新增至匯出服務的OSGi套件,並將套件部署至AEM伺服器。
隨機參與 者選擇是選擇隨機使用者( com.day.cq.workflow.impl.process.RandomParticipantChooser
)的範例服務。隨機參與者選擇器步驟元件示例擴展動態參與者步驟並使用此服務作為步驟實施。
以下Java類實現ParticipantStepChooser
介面。 類返回啟動工作流的參與者的名稱。 程式碼使用的邏輯與範例指令碼(initator-participant-chooser.ecma
)使用的邏輯相同。
@Property
注釋將SERVICE_PROPERTY_LABEL
欄位的值設定為Workflow Initiator Participant Chooser
。
package com.adobe.example;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.ParticipantStepChooser;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.metadata.MetaDataMap;
@Component
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION, value = "An example implementation of a dynamic participant chooser."),
@Property(name = ParticipantStepChooser.SERVICE_PROPERTY_LABEL, value = "Workflow Initiator Participant Chooser (service)") })
public class InitiatorParticipantChooser implements ParticipantStepChooser {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public String getParticipant(WorkItem arg0, WorkflowSession arg1,
MetaDataMap arg2) throws WorkflowException {
String initiator = arg0.getWorkflow().getInitiator();
logger.info("Assigning Dynamic Participant Step work item to {}",initiator);
return initiator;
}
}
在動態參與者步驟屬性對話方塊中,參與者選擇器清單包含代表此服務的項目Workflow Initiator Participant Chooser (script)
。
「啟動工作流模型時,日誌會指出啟動工作流的用戶的ID,以及分配了工作項的用戶。 在此示例中,admin
用戶啟動了工作流。
13.09.2015 15:48:53.037 *INFO* [10.176.129.223 [1347565733037] POST /etc/workflow/instances HTTP/1.1] com.adobe.example.InitiatorParticipantChooser Assigning Dynamic Participant Step work item to admin
表單參與者步驟在開啟工作項目時顯示表單。 當用戶填寫並提交表單時,欄位資料被儲存在工作流負載的節點中。
要配置步驟,請指定要將工作項目分配給的組或用戶,以及表單的路徑。
本節介紹Foundation Components for Page Authoring的 Forms部分。
若要設定步驟,請編輯並使用下列標籤:
建立表單,以便正常使用表單參與者步驟。 但是,表單參與者步驟的表單必須具備下列組態:
Start of Form元件必須將Action Type屬性設定為Edit Workflow Controlled Resource(s)
。
Start of Form元件必須具有Form Identifier
屬性的值。
表單元件必須將元素名稱屬性設定為儲存欄位資料的節點的路徑。 路徑必須在工作流裝載內容中找到節點。 值使用下列格式:
./jcr:content/path_to_node
表單必須包含Workflow Submit Button(s)元件。 不要配置元件的任何屬性。
工作流程的需求會決定您應將欄位資料儲存在何處。 例如,欄位資料可用來設定頁面內容的屬性。 元素名稱屬性的下列值將欄位資料儲存為jcr:content
節點的redirectTarget
屬性的值:
./jcr:content/redirectTarget
在以下示例中,欄位資料用作裝載頁上Text元件的內容:
./jcr:content/par/text_3/text
"第一個示例可用於cq:Page
元件呈現的任何頁。 第二個範例僅在裝載頁面包含ID為text_3
的Text元件時才可使用。
表單可以位於儲存庫的任意位置,但工作流用戶必須獲得讀取表單的授權。
隨機參與者選擇器步驟是參與者選擇器,用於將生成的工作項目指派給從清單中隨機選擇的用戶。
若要設定步驟,請編輯並使用下列標籤:
引數
工作流啟動器參與者選擇器步驟是參與者選擇器,用於將生成的工作項目分配給啟動工作流的用戶。 除了Common屬性外,沒有其他屬性可進行配置。
若要設定步驟,請使用下列標籤進行編輯:
處理步驟會執行ECMAScript或呼叫OSGi服務以執行自動處理。
若要設定步驟,請編輯並使用下列標籤:
程序
流程:要執行的進程實施。使用下拉式選單來選取ECMAScript或OSGi服務。 如需下列相關資訊:
處理常式進階:選擇此選項可自動將工作流推進到執行後的下一個步驟。如果未選取,實施指令碼必須處理工作流程的進階。
引數:要傳遞給進程的參數。