Forms 如何向Activiti工作流中的所有用户任务表单添加标题?

Forms 如何向Activiti工作流中的所有用户任务表单添加标题?,forms,workflow,share,alfresco,activiti,Forms,Workflow,Share,Alfresco,Activiti,我正在Alfresco Share中使用Activiti工作流,我需要为工作流中的所有用户任务表单添加一个通用的标题。此标题将是一组只读属性(字段),在工作流中所有用户任务表单的顶部显示上下文工作流信息。例如,在客户端管理工作流中,标题可能显示客户端名称和姓氏、客户端文件代码等,并在只读文本框或标签中显示每个值 是否有一种简单的方法向工作流中的所有用户任务表单添加一组信息字段(并填充它们)?我知道可以创建一个包含所需属性的新方面,但如何在运行时将该方面添加到任务类型中,并在需要时通过JavaSc

我正在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>

如上所述,定义自定义表单模板非常容易。作为该模板的一部分,可以在开始渲染字段本身之前显示所需的任何信息。如果需要在多个表单模板中显示,您甚至可以创建一个通用的“包含”模板

问题是您希望在标题中显示哪些信息,这些信息存储在哪里?这将影响您需要如何检索它以显示给用户

如果您需要的属性在任务项上可用,则可以通过表单字段值轻松检索它们。然后可以将它们直接呈现到输出HTML中

然而,从您的问题来看,我怀疑更有可能的是,这些值存储在其他地方,必须在显示之前从那里检索。在这种情况下,您需要使用标准共享模式实现客户端功能(或组件),并修改表单模板,使其生成的HTML在浏览器加载时运行该代码

在该组件中,您可以对存储库API进行XHR调用,以检索属性值,然后使用回调函数更新HTML页面以填充数据以供用户显示

作为类似示例,请参见Share提供的
任务所有者.ftl
字段模板

<#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函数填充数据


但正如我所说,确切的方法取决于数据的位置和显示方式。

谢谢你的回答,威尔。我用更多的信息更新了我的问题,你能告诉我你的见解吗?根据你的代码,我的理解是在你的所有自定义工作流任务中添加显示客户名称和姓氏的标题。但我想知道的是,这些标题值是从哪里来的??我的意思是,您在启动工作流时保存了这些值,并且希望在任务中显示这些信息???感谢您的评论。我从一开始调用的web服务中获取字段值,然后将其保存在流程上下文中以供以后使用。如果您可以在所有自定义任务上设置额外属性(如您所示,您需要创建多个自定义任务),那么我可以看到这一点。然而,像这样复制数据不一定是最好的解决方案-如果它发生变化,那么您的工作流将不会反映这一点。因此,我将坚持我的观点,即自定义表单模板仍然是最好的解决方案。维基上有很多关于这方面的学习和参考资料,例如,所以我建议你从那里开始,通过文档来学习。
<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>
    var customerName = execution.getVariable('customerName');
    var customerSurname = execution.getVariable('customerSurname');
    task.setVariable('myns_customerName', customerName);
    task.setVariable('myns_customerSurname', customerSurname);
<#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>