2012-10-24 35 views
0

我正在Alfresco Share中使用Activiti工作流程,我需要爲工作流程中的所有用戶任務表單添加一個通用標題。該標題將是一組只讀屬性(字段),用於在工作流程的所有用戶任務表單頂部顯示上下文工作流程信息。例如,在客戶端管理工作流程中,標題可以顯示客戶端名稱和姓氏,客戶端文件代碼等,以只讀文本框或標籤顯示每個值。如何向Activiti工作流程中的所有用戶任務表單添加標題?

是否有一種簡單的方法將一組信息字段添加到工作流中的所有用戶任務表單中(並將它們填充)?我知道可以創建一個包含所需屬性的新方面,但是如何在運行時將該方面添加到我的任務類型並在需要時通過JavaScript設置它們的屬性值?目前,工作流中的每個用戶任務在工作流模型定義(XML文件)中都有自己的自定義類型(即表單),但某些「標準」審閱任務使用「wf:activitiReviewTask」作爲表單鍵。該組只讀信息字段應顯示在所有表單中,包括標準審閱任務表單。

我想要實現這樣的事情(見紅方):

Task form with information fields

感謝您的幫助提前。

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

workflowModel.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); 
+0

根據我們的代碼,我的理解是添加顯示客戶端名稱和姓氏的標題給自定義工作流程的所有任務。但我想知道這些標題值是從哪裏來的?我的意思是,當你的工作流程和你想在你的任務中顯示這些信息時,你保存了這些值? – swemon

+0

感謝您的評論。我從開始時調用的Web服務獲取字段值,然後將它們保存在流程上下文中供以後使用。 –

+0

如果您可以在所有自定義任務上設置額外的屬性(如您所示,您需要創建多個自定義任務),那麼我可以看到這個工作。但是,像這樣複製數據不一定是最好的解決方案 - 如果它發生變化,那麼您的工作流程將不會反映這一點。 –

回答

0

這是很容易定義自定義表單模板,如記錄在http://wiki.alfresco.com/wiki/Forms。作爲該模板的一部分,您可以在開始渲染字段之前顯示需要的任何信息。如果你需要在多個表單模板中顯示,你甚至可以創建一個通用的'包含'模板。

問題是您希望在標題中顯示哪些信息,以及信息存儲在哪裏?這將影響您需要檢索它以顯示給用戶的方式。

如果您需要的屬性在任務項中可用,那麼通過表單字段值很容易檢索它們。然後可以將它們直接渲染到輸出HTML中。

然而,我懷疑是更可能從您的問題,是價值存儲在別的地方,必須在顯示之前從那裏檢索。在這種情況下,您需要使用標準共享模式來實現客戶端功能(或組件),並修改您的表單模板,以使其生成的HTML導致代碼在瀏覽器加載時運行。

在該組件中,可以將XHR呼叫發送到存儲庫API,以檢索屬性值,然後使用回調函數更新HTML頁面以填充數據以供用戶顯示。

由於類似的例子,看到分享

<#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提供的task owner.ftl字段模板,但你可以實現自己的功能,它採用Alfresco.util.Ajax.jsonGet()或類似檢索數據,然後使用YAHOO.util.Dom函數填充它。

但正如我所說,確切的方法取決於您的數據在哪裏以及您需要如何顯示它。

+0

謝謝你的回答,威爾。我用更多的信息更新了我的問題,請問您能告訴我您的洞察力嗎? –

相關問題