ワークフローモデルは、各種タイプの一連のステップで構成されます。これらのステップを、それぞれのタイプに応じてパラメーターやスクリプトで設定および拡張し、必要な機能とコントロールを実現することができます。
この節では、標準ワークフローのステップについて説明します。
モジュール固有のステップについては、次の資料も参照してください。
各ステップコンポーネントには、ステップのプロパティダイアログがあり、必要なプロパティを定義および編集できます。
大部分のワークフローステップコンポーネントでは、プロパティダイアログの「共通」タブで、次のプロパティを組み合わせて使用できます。
タイトル
手順のタイトル。
説明
手順の説明。
ワークフローステージ
ステップにステージを適用するドロップダウンセレクター。
タイムアウト
ステップが「タイムアウト」されるまでの期間。
次のいずれかを選択できます。オフオフ, 1h, 6h, 12h, 24h。
タイムアウトハンドラー
ステップがタイムアウトしたときにワークフローを制御するハンドラ。例:
Auto Advancer
ハンドラー処理の設定
実行後、ワークフローを自動的に次の手順に進める場合は、このオプションを選択します。 選択しない場合、実装スクリプトでワークフローの進行を処理する必要があります。
多くのワークフローステップコンポーネントでは、プロパティダイアログの「ユーザー/グループ」タブで、次のプロパティを使用できます。
電子メールでユーザーに通知します
ユーザー / グループ
AND Splitは、ワークフロー内に分割を作成します。その後、両方の分岐がアクティブになります。 必要に応じて、各ブランチにワークフローステップを追加できます。このステップを使用して、ワークフローに複数の処理パスを導入できます。例えば、複数のレビューステップを並列で発生させ、時間を節約することができます。
AND Splitプロパティを編集します。
必要に応じて、各ブランチにワークフローステップを追加します。
コンテナステップは、子ワークフローとして実行される別のワークフローモデルを開始します。
このコンテナを使用すると、一般的な手順のシーケンスを実装するためにワークフローモデルを再利用できます。 例えば、1 つの翻訳ワークフローモデルを複数の編集ワークフローで使用することができます。
このステップを設定するには、次のタブを編集および使用します。
コンテナ
移動ステップを使用すると、ワークフローモデル内で実行する次のステップを ECMAScript の結果に応じて指定できます。
true
:移動ステップが完了すると、ワークフローエンジンが指定のステップを実行します。
false
:移動ステップが完了すると、通常のルーティングロジックが次に実行するステップを決定します。
移動ステップを使用すると、ワークフローモデル内に詳細なルーティング構造を実装できます。例えば、ループを実装するには、スクリプトでループ条件を評価し、Goto Stepを定義して、ワークフロー内で前のステップを実行します。
このステップを設定するには、次のタブを編集および使用します。
プロセス
「スクリプトのパス」または「スクリプト」のどちらかを指定してください。両方のオプションを同時に使用することはできません。両方のプロパティに値を指定した場合、手順ではスクリプトパスが使用されます。
ループをシミュレートするには、発生したループの繰り返し回数を記録する必要があります。
例えば、複数の JCR ノードに対してアクションを実行するワークフローを実装するには、ループカウンターをノードのインデックスとして使用できます。回数を保持するには、ワークフローインスタンスのデータマップに integer
値を保存します。回数を増分したり、回数を終了基準と比較するには、移動ステップのスクリプトを使用します。
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 分割は、ワークフロー内に分割を作成し、どちらか 1 つのブランチだけをアクティブにします。これを使用すると、ワークフローに条件付き処理パスを導入できます。必要に応じて、各ブランチにワークフローステップを追加できます。
OR分割の作成の詳細は、次を参照してください。https://helpx.adobe.com/jp/experience-manager/using/aem64_workflow_servlet.html
OR Splitプロパティを編集します。
共通
分岐: x>
ブランチごとに別個のタブがあります。
「スクリプトのパス」または「スクリプト」のどちらかを指定してください。両方のオプションを同時に使用することはできません。両方のプロパティに値を指定した場合、手順ではスクリプトパスが使用されます。
OR 分割用のルールの定義を参照してください。
必要に応じて、各ブランチにワークフローステップを追加します。
参加者ステップでは、特定のアクションの所有者を割り当てることができます。ワークフローは、ユーザーが手動で手順を確認した場合にのみ続行されます。 これは、ワークフローに関するアクションを誰かに実行させる場合に使用します。例えば、レビューステップです。
余談になりますが、アクションを割り当てる際には、ユーザー認証を考慮する必要があります。ユーザーは、ワークフローのペイロードであるページにアクセスする必要があるからです。
このステップを設定するには、次のタブを編集および使用します。
次の場合、ワークフロー開始者には常に通知が送信されます。
一部のプロパティでは、電子メール通知を有効にするように設定する必要があります。電子メールテンプレートをカスタマイズしたり、新しい言語用の電子メールテンプレートを追加することもできます。AEMで電子メール通知を設定するには、「電子メール通知の設定」を参照してください。
ダイアログ参加者ステップは、作業項目を割り当てられたユーザーから情報を収集するために使用します。このステップは、ワークフロー内で後で使用する少量のデータを収集するのに役立ちます。
ステップの完了時、作業項目を完了ダイアログには、ダイアログで定義したフィールドが表示されます。各フィールドで収集されたデータは、ワークフローペイロードのノードに保存されます。後続のワークフローステップは、この値をリポジトリから読み取ることができます。
このステップを設定するには、作業項目を割り当てるユーザーまたはグループ、およびダイアログへのパスを指定します。
このステップを設定するには、次のタブを編集および使用します。
ダイアログ
ダイアログを作成するには:
ウィジェットデータは、ワークフローペイロードまたは作業項目のメタデータに保存できます。widget ノードの name
プロパティの形式によって、データの保存場所が決定されます。
データをペイロードと共に保存
ウィジェットデータをワークフローペイロードのプロパティとして保存するには、ウィジェットノードのnameプロパティの値に次の形式を使用します。
./jcr:content/nodename
データは、ペイロードのノードの nodename
プロパティに保存されます。ノードにこのプロパティが含まれていない場合は、プロパティが作成されます。
ペイロードと共に保存した場合は、後で同じペイロードを持つダイアログを使用したときに、プロパティの値が上書きされます。
データを作業項目と共に保存
ウィジェットデータを作業項目メタデータのプロパティとして保存するには、nameプロパティの値に次の形式を使用します。
nodename
データは、作業項目metadata
のnodename
プロパティに保存されます。 この場合は、同じペイロードを持つダイアログを使用しても、データは保存されます。
ダイアログ構造
ダイアログ参加者ステップのダイアログは、コンポーネントのオーサリング用に作成するダイアログと似ています。ダイアログは、次の場所に保存されます。
/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
値を保存するダイアログを表しています。title ノードは、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
スクリプトには、ユーザー ID を String
値として返す、getParticipant という関数を含める必要があります。カスタムスクリプトは、/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 のいずれかになります。
ただし、グループ ID を使用できるのは、参加者ステップに対してのみです(参加者のリストが返された場合)。動的参加者ステップに対して空のリストが返され、これを委任に使用することはできません。
動的参加者ステップコンポーネントに対して実装を使用可能にするには、サービスを書き出す OSGi バンドルに Java クラスを追加し、バンドルを 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と、作業項目が割り当てられているユーザーの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コンポーネントのFormsの節について説明します。
このステップを設定するには、次のタブを編集および使用します。
フォーム
通常どおり、フォーム参加者ステップで使用するフォームを作成します。ただし、フォーム参加者ステップ用のフォームには、次の設定が必要です。
フォーム]コンポーネントの[開始には、Action TypeプロパティをEdit Workflow Controlled Resource(s)
に設定する必要があります。
フォーム]コンポーネントの[開始は、Form Identifier
プロパティの値を持つ必要があります。
フォームコンポーネントでは、エレメント名プロパティを、フィールドデータを保存するノードのパスに設定する必要があります。パスは、ワークフローペイロードコンテンツ内のノードを見つける必要があります。 値には次の形式を使用します。
./jcr:content/path_to_node
フォームには、ワークフロー送信ボタンコンポーネントが含まれている必要があります。 このコンポーネントのプロパティは一切設定しないでください。
ワークフローの要件によって、フィールドデータを保存する場所が決定されます。例えば、フィールドデータを使用して、ページコンテンツのプロパティを設定できます。次のElement Nameプロパティの値は、jcr:content
ノードのredirectTarget
プロパティの値としてフィールドデータを保存します。
./jcr:content/redirectTarget
次の例では、フィールドデータがペイロードページのTextコンポーネントのコンテンツとして使用されます。
./jcr:content/par/text_3/text
"最初の例は、cq:Page
コンポーネントがレンダリングするページに使用できます。 2 番目の例は、ペイロードページに「」という ID を持つテキストtext_3
コンポーネントが含まれる場合にのみ使用できます。
フォームは、リポジトリ内のどこにでも配置できますが、ワークフローユーザーにはフォームを読み取るための権限が必要です。
ランダム参加者選択ステップは、生成された作業項目をリストからランダムに選択されたユーザーに割り当てる参加者選択機能です。
このステップを設定するには、次のタブを編集および使用します。
引数
ワークフローイニシエーター参加者選択ステップは、生成された作業項目を、そのワークフローを開始したユーザーに割り当てる参加者選択です。共通プロパティ以外に、設定するプロパティはありません。
このステップを設定するには、次のタブを使用して編集します。
プロセスステップは、ECMAScriptを実行するか、OSGiサービスを呼び出して自動処理を実行します。
このステップを設定するには、次のタブを編集および使用します。
プロセス
プロセス:実行するプロセス実装。ドロップダウンメニューを使用して、ECMAScriptまたはOSGiサービスを選択します。 参考情報:
ハンドラー処理の設定:実行後にワークフローを次のステップに自動的に進めるには、このオプションを選択します。選択しない場合、実装スクリプトでワークフローの進行を処理する必要があります。
引数:プロセスに渡される引数。