0

我正在使用 Alfresco Share 中的 Activiti 工作流,我需要为工作流中的所有用户任务表单添加一个通用的标题。此标题将是一组只读属性(字段),在工作流中所有用户任务表单的顶部显示上下文工作流信息。例如,在客户管理工作流中,标题可能会显示客户姓名和姓氏、客户文件代码等,在只读文本框或标签中显示每个值。

是否有一种简单的方法可以向工作流中的所有用户任务表单添加一组信息字段(并填充它们)?我知道可以创建一个包含所需属性的新方面,但是如何在运行时将该方面添加到我的任务类型并在需要时通过 JavaScript 设置它们的属性值?目前,工作流中的每个用户任务在工作流模型定义(XML 文件)中都有自己的自定义类型(即表单),除了一些“标准”审查任务使用“wf:activitiReviewTask”作为表单键。只读信息字段集应出现在所有表单中,包括标准审阅任务表单。

我想实现这样的目标(见红色方块):

带有信息字段的任务表

提前感谢您的帮助。

更新 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>

共享配置-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>

这里客户端函数使用Alfresco.util.userProfileLink,但您可以实现自己的函数,该函数使用Alfresco.util.Ajax.jsonGet()或类似的方法来检索数据,然后使用 YAHOO.util.Dom 函数填充它。

但正如我所说,确切的方法取决于您的数据在哪里以及您需要如何显示它。

于 2012-10-24T18:24:41.847 回答