0

Alfresco Share で Activiti ワークフローを使用していますが、ワークフロー内のすべてのユーザー タスク フォームに共通のヘッダーを追加する必要があります。このヘッダーは、ワークフロー内のすべてのユーザー タスク フォームの上部にコンテキスト ワークフロー情報を表示する一連の読み取り専用プロパティ (フィールド) になります。たとえば、クライアント管理ワークフローでは、ヘッダーにクライアントの名前と姓、クライアント ファイル コードなどが表示され、各値が読み取り専用のテキスト ボックスまたはラベルに表示されます。

ワークフロー内のすべてのユーザー タスク フォームに、一連の情報フィールドを追加する (および入力する) 簡単な方法はありますか? 必要なプロパティを含む新しいアスペクトを作成できることはわかっていますが、実行時にそのアスペクトをタスク タイプに追加し、必要に応じて JavaScript を介してそれらのプロパティ値を設定するにはどうすればよいでしょうか? 現在、ワークフロー内の各ユーザー タスクは、フォーム キーとして「wf:activitiReviewTask」を使用している一部の「標準」レビュー タスクを除いて、ワークフロー モデル定義 (XML ファイル) 内に独自のカスタム タイプ (つまり、フォーム) を持っています。一連の読み取り専用情報フィールドは、標準のレビュー タスク フォームを含むすべてのフォームに表示される必要があります。

私はこのようなことを達成したい (赤い四角を参照):

情報フィールドを含むタスク フォーム

事前にご協力いただきありがとうございます。

更新 1

フォーム テンプレートの経験がありません。私のフォームは非常にシンプルなので、いくつかのモデル定義 (アスペクトとタイプ) といくつかの共有カスタム構成を組み合わせて設計しました。ヘッダーに表示したい情報は、いくつかのワークフロー コンテキスト変数に格納されているため、JavaScript コードから簡単に取得できます。これは私が考えていたもので、まだテストしていません。実行可能なアイデアかどうか教えてください。そうでない場合は、フォーム テンプレートを使用してそれを行う方法の例を提供できますか?

mynsModel.xml

<aspect name="myns:customerTaskHeader">
    <title>Customer task header</title>
    <properties>
        <property name="myns:customerName">
            <title>Name</title>
            <type>d:text</type>
        </property>
        <property name="myns:customerSurname">
            <title>Surname</title>
            <type>d:text</type>
        </property>         
    </properties>
</aspect>

ワークフローモデル.xml

<type name="wf:customerDelivery">
    <title>Delivery to customer</title>
    <parent>bpm:workflowTask</parent>
    <properties>
        <property name="wf:customerDeliveryType">
            <title>Delivery type</title>
            <type>d:text</type>         
        </property>
        <property name="wf:customerDeliveryStatus">
            <title>Signed</title>
            <type>d:boolean</type>                  
        </property>
    </properties>
    <mandatory-aspects>
        <aspect>myns:customerTaskHeader</aspect>
    </mandatory-aspects>    
</type>

share-config-custom.xml

<config evaluator="task-type" condition="wf:customerDelivery">
    <forms>
        <form>
            <field-visibility>
                <show id="myns:customerName" />
                <show id="myns:customerSurname" />
                <show id="packageItems" />
                <show id="wf:customerDeliveryType" />
                <show id="wf:customerDeliveryStatus" />
                <show id="bpm:comment" />   
                <show id="transitions" />
            </field-visibility>
            <appearance>
                <set id="" appearance="title" label-id="workflow.set.general" />
                <set id="items" appearance="title" label-id="workflow.set.items" />
                <set id="response" appearance="title" labelid="workflow.set.response" />
                <field id="bpm:comment" labelid="workflow.field.message">
                    <control template="/org/alfresco/components/form/controls/textarea.ftl">
                        <control-param name="style">width: 95%</control-param>
                    </control>
                </field>
                <field id="packageItems" set="items" />
                <field id="transitions" set="response" />
                <field id="myns:customerName" read-only="true">
                    <control template="/org/alfresco/components/form/controls/info.ftl" />
                </field>
                <field id="myns:customerSurname" read-only="true">
                    <control template="/org/alfresco/components/form/controls/info.ftl" />
                </field>
            </appearance>
        </form>
    </forms>
</config>

この(可能な)回避策で見られるいくつかの欠点:

  1. すべてのタスク タイプの定義には、customerTaskHeaderアスペクトが含まれている必要があります。問題は、ワークフロー内の多くのユーザー タスクにカスタム タイプではなく組み込みタイプがあることです。JavaScript コードによって、実行時にすべての必要な値を持つアスペクトをタスク タイプに追加できると便利ですが、これはおそらく不可能です。
  2. share-config-custom.xml のタスク タイプごとに異なるカスタム構成エバリュエーターが必要です。同じ問題。
  3. 使い方がかなり面倒で、維持するのが難しいと思います。さらに、間違っている場合は訂正してください。ワークフロー内のすべてのタスク フォームのヘッダー フィールドに値を設定する簡単な方法がわかりません。次のコードを使用して、すべてのユーザー タスクに「作成」イベント リスナーを追加する必要があると思います。

【JavaScriptコード】

    var customerName = execution.getVariable('customerName');
    var customerSurname = execution.getVariable('customerSurname');
    task.setVariable('myns_customerName', customerName);
    task.setVariable('myns_customerSurname', customerSurname);
4

1 に答える 1

0

http://wiki.alfresco.com/wiki/Formsに記載されているように、カスタム フォーム テンプレートを定義するのは非常に簡単です。そのテンプレートの一部として、フィールド自体のレンダリングを開始する前に必要な情報を表示できます。これを複数のフォーム テンプレートで表示する必要がある場合は、共通の「インクルード」テンプレートを作成することもできます。

問題は、ヘッダーに表示したい情報と、その情報がどこに保存されているかということです。これは、ユーザーに表示するために取得する必要がある方法に影響します。

必要なプロパティがタスク アイテムで利用できる場合、フォーム フィールドの値から簡単に取得できます。その後、出力 HTML に直接レンダリングできます。

しかし、あなたの質問から、値が別の場所に保存されており、表示する前にそこから取得する必要がある可能性が高いと思われます。その場合、標準の共有パターンを使用してクライアント側関数 (またはコンポーネント) を実装し、フォーム テンプレートを変更して、生成された HTML がブラウザーによって読み込まれたときにそのコードが実行されるようにする必要があります。

そのコンポーネント内で、たとえばリポジトリ API に対して XHR 呼び出しを行い、プロパティ値を取得してから、コールバック関数を使用して HTML ページを更新し、ユーザーに表示するデータを入力できます。

類似の例として、task owner.ftlShare が提供するフィールド テンプレートを参照してください。

<#if field.value?? && field.value?length &gt; 0>
...
<script type="text/javascript">//<![CDATA[
YAHOO.util.Event.onContentReady("${fieldHtmlId}", function ()
{
   YAHOO.util.Dom.get("${fieldHtmlId}").innerHTML = Alfresco.util.userProfileLink("${userName}", "${fullName}", "", ${disableLink?string});
}, this);
//]]></script>
</#if>

ここでは、クライアント側の関数は を使用していますが、または類似のものを使用してデータを取得し、YAHOO.util.Dom 関数を使用してデータを入力するAlfresco.util.userProfileLink独自の関数を実装することもできます。Alfresco.util.Ajax.jsonGet()

しかし、私が言うように、正確な方法は、データがどこにあり、どのように表示する必要があるかによって異なります。

于 2012-10-24T18:24:41.847 に答える