このレッスンでは、スコープと参照について説明します。これらは、ルールやアクションを再利用可能にしたり、コンポーネント全体のデータにアクセスしたり管理したりするのに役立ちます。
ルール、アクション、データの保存を宣言できるスコープは2つある:
- ステップを持つ:コンポーネントの各ステップは独自のスコープを持つ。ここで定義されたルール、アクション、データは、他の場所では利用できない。
- ワークフロー:コンポーネントの全ステップは、ワークフロースコープに追加されたルール、アクション、データにアクセスできる。
さらに、データを保存するために3つのスコープが用意されている:
- ルート:ワークフローの全コンポーネントはルートスコープにアクセスできる。これはコンポーネント間のデータ受け渡しに利用できる。
- user_session:user_session: ユーザーがログアウトしない限り、user_session スコープに保存されたデー タは、ワークフロー実行終了後(別のワークフロー内や、同じワークフローを複数回 実行した場合など)でもアクセス可能です。
- global: Frontline Workplace アプリケーションが閉じられていない限り、ユーザーがサインアウトして別のユーザーがサインインしても、グローバルスコープに保存されたデータにアクセスできます。
コンポーネント例
<workflow [ATTRIBUTES]>
<context> [...] </context> \
<actions> [...] </actions> -\
<rules> --\
<rule id="menu_button_selection"> ---\
<expression>[..]</expression> ----\
<actions> -----|--> Workflow scope
[...] ----/
</actions> ---/
</rule> --/
</rules> -/
<steps>
<step id="stepA" [ATTRIBUTES]>
<context> [...] </context> ----\
<rules> [...] </rules> -----|--> Step scope
<actions> [...] </actions> ----/
<states>
<onevent>
<rule ref="menu_button_selection"/> -------> Referencing a rule from the workflow scope
<rule id="show_notification"> --\
<expression>[..]</expression> ---\
<actions> ----\
[...] -----|--> Direct definition (could still reference a pre-defined action)
</actions> ----/
</rule> ---/
</onevent>
</states>
</step>
<step id="stepB" [ATTRIBUTES]>
<states>
<onevent>
<rule ref="menu_button_selection"/> -------> Referencing a rule from the workflow scope
</onevent>
</states>
</step>
</steps>
</workflow>
この例では
id="menu_button_selection "
のルールがワークフロースコープで定義され、ref
属性を使ってステップid="stepA "
とステップid="stepB "
の両方で参照される。
注:ルールとアクションを再利用することで、コンポーネントの動作に一貫性を持たせ、保守性を向上させ、コード量を最小限に抑えることができます。
- スコープ内のIDは一意でなければなりません。他のスコープで同じIDを使うこともできますが、よほどの理由がない限り、混乱を避けるために使わないことをお勧めします。同一IDを使用した場合、優先順位は下から順になります。
id="menu_button_selection "
を持つルールがステップスコープで直接定義されている場合、ワークフロースコープで同じIDを持つ定義済みのルールよりも優先して実行されます。 - また、ステップの1つでしか必要とされないが、そのステップの複数のステート/ルールで必要とされるルール/アクションがあるかもしれない。この場合、ステップスコープでルール/アクションを定義し、同じように参照することができます。
- 最後に、ルールやアクションを必要な場所に直接定義することもできる。そのようなルール/アクションは、他の場所では利用できない。ルールやアクションが再利用されないことがわかっている場合、直接定義することで、コンポーネントをより見やすくすることができます。
注意:IDはスコープ内で一意でなければなりません。既存のルールやアクションをテンプレートとしてコピー&ペーストして新規作成する場合、典型的なミスはID属性の変更を忘れることです。まずIDを変更する習慣をつけましょう。
📌課題
選択コンポーネントをリファクタリングする:
finish_workflow
アクションをグローバルスコープに入れ、ルール内で参照する。menu_button_selection
ルールをグローバル・スコープに入れ、ステップで参照する。- コンポーネントが意図したとおりに動作することを確認する
ダウンロードコンポーネント(事前課題)
ヘルプとリソース
ここでは、ワークフローとコンポーネントの開発を少し簡単にするためのヒントをいくつか紹介する:
プレビューモード
このモードでは、ワークフローを公開することなく、変更をすぐにテストすることができます。詳しくは「ワークフローのプレビュー」をご参照ください。
サーバーとクライアントのログ
FCCとデバイスのログには、sysadminユーザーでログインするか、UBIMAX_HOMElogsフォルダに直接アクセスしてアクセスできます。デバイスログは定期的にサーバーにプッシュされますが、sysadminユーザーとして即時アップロードを要求できます。
ソリューション・ノート
もしまだ開発のための準備がすべて整っていないのであれば、それがこの最初の実践的な課題の主要な課題であったはずだ。
注目すべきは、ルール定義の中で、同じスコープで定義された定義済みアクションを参照していることだ。<actions>タグと
<rules>
タグの順番は関係ありません。コンポーネントは以下のようになります:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<workflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" wfd_version="1.0" reporting="false"
id="choice" name="choice" descriptor="Choice component" startstep="choose"
xsi:noNamespaceSchemaLocation="../../../configuration/workflow.xsd">
<actions>
<finish_workflow id="finish_workflow">
<output>
<param name="selected_button" type="string">#{event:command}</param>
</output>
</finish_workflow>
</actions>
<rules>
<rule id="menu_button_selection">
<expression>#{event:command} == 'APPLE' || #{event:command} == 'PEAR'</expression>
<actions>
<action ref="finish_workflow"/>
</actions>
</rule>
</rules>
<steps>
<step id="choose" descriptor="the user selects between two options" uitemplate="ChoiceScreen">
<states>
<onevent>
<rule ref="menu_button_selection"/>
</onevent>
</states>
</step>
</steps>
</workflow>
ダウンロード・コンポーネント(事後課題)
これで2回目のレッスンは終了です。次回はデータ変数について学びます。