Как добавить заголовок ко всем формам пользовательских задач в рабочем процессе Activiti?

Я работаю с рабочими процессами Activiti в Alfresco Share, и мне нужно добавить общий заголовок для всех пользовательских форм задач в рабочем процессе. Этот заголовок будет набором свойств (полей) только для чтения, отображающих контекстную информацию рабочего процесса в верхней части всех форм пользовательских задач в рабочем процессе. Например, в рабочих процессах управления клиентами заголовок может отображать имя и фамилию клиента, код клиентского файла и т. Д., Отображая каждое значение в текстовом поле или метке только для чтения.

Есть ли простой способ добавить набор информационных полей (а также заполнить их) ко всем формам пользовательских задач в рабочем процессе? Я знаю, что можно создать новый аспект, содержащий желаемые свойства, но как я могу добавить этот аспект во время выполнения к моим типам задач и при необходимости установить их значения свойств с помощью JavaScript? В настоящее время каждая пользовательская задача в рабочем процессе имеет свой собственный настраиваемый тип (т.е. форму) в определении модели рабочего процесса (файл XML), за исключением некоторых «стандартных» задач проверки, которые используют «wf: activitiReviewTask» в качестве ключа формы. Набор информационных полей только для чтения должен отображаться во всех формах, включая стандартные формы задач проверки.

Я хочу добиться чего-то вроде этого (см. Красный квадрат):

Форма задачи с информационными полями

Заранее благодарны за Вашу помощь.

ОБНОВЛЕНИЕ 1

У меня нет опыта работы с шаблонами форм. Поскольку мои формы очень просты, я просто использовал несколько определений модели (аспекты и типы) и некоторую пользовательскую конфигурацию Share, объединенную для их разработки. Информацию, которую я хочу отобразить в заголовке, можно легко получить из кода 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>

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. Я считаю его довольно громоздким в использовании и сложным в обслуживании. Более того, поправьте меня, если я ошибаюсь, я не вижу простого способа установить значения в поля заголовков всех форм задач в рабочем процессе. Я думаю, мне следует добавить прослушиватель событий create к каждой пользовательской задаче со следующим кодом:

[Код JavaScript]

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

person Community    schedule 24.10.2012    source источник
comment
Согласно коду ur, я понимаю, что нужно добавить заголовок, который показывает имя и фамилию клиента, для всех ваших задач пользовательского рабочего процесса. Но я хочу знать, откуда взялось это значение заголовка ?? Я имею в виду, что вы сохранили эти значения при запуске рабочего процесса и хотите показать эту информацию в своей задаче ???   -  person swemon    schedule 26.10.2012
comment
Спасибо за ваш комментарий. Я получаю значения полей от веб-службы, которую вызываю вначале, а затем сохраняю их в контексте процесса для дальнейшего использования.   -  person YahooER YER    schedule 26.10.2012
comment
Если вы можете установить дополнительные свойства для всех своих настраиваемых задач (как вы указываете, вам нужно будет создать несколько настраиваемых задач), то я вижу, что это работает. Однако такое дублирование данных не обязательно является лучшим решением - если оно изменится, ваш рабочий процесс не отразит это.   -  person Will Abson    schedule 30.10.2012
comment
Поэтому я буду придерживаться своей точки зрения, что настраиваемый шаблон формы по-прежнему является лучшим решением. На вики есть множество обучающих и справочных материалов, например wiki.alfresco.com/wiki/Forms_Developer_Guide#Form_Templates, поэтому я предлагаю вам начать там и поработайте над документами.   -  person Will Abson    schedule 30.10.2012


Ответы (1)


Определить собственный шаблон формы довольно просто, как описано на http://wiki.alfresco.com/wiki/Forms. В рамках этого шаблона вы можете отображать любую информацию, которая вам нужна, прежде чем вы начнете рендеринг самих полей. Вы даже можете создать общий шаблон включения, если вам нужно отобразить его в нескольких шаблонах форм.

Вопрос в том, какую именно информацию вы хотите отображать в заголовке и где эта информация хранится? Это повлияет на то, как вам нужно получить его для отображения пользователю.

Если требуемые свойства доступны в элементе задачи, их легко получить с помощью значений полей формы. Затем они могут быть преобразованы прямо в выходной HTML.

Однако из вашего вопроса я подозреваю, что значения хранятся где-то еще и должны быть извлечены оттуда до отображения. В этом случае вам потребуется реализовать клиентскую функцию (или компонент) с использованием стандартного шаблона общего доступа и изменить шаблон формы, чтобы генерируемый HTML-код запускал этот код при загрузке браузером.

В этом компоненте вы можете сделать XHR-вызовы, скажем, API репозитория, чтобы получить значения свойств, а затем обновить HTML-страницу с помощью функции обратного вызова для заполнения данных для отображения пользователем.

В качестве примера чего-то подобного см. Шаблон поля task owner.ftl, предоставленный Share

<#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.

Но, как я уже сказал, точный метод зависит от того, где находятся ваши данные и как вам нужно их отображать.

person Will Abson    schedule 24.10.2012
comment
Спасибо за ответ, Уилл. Я обновил свой вопрос, добавив гораздо больше информации. Не могли бы вы поделиться своим мнением, пожалуйста? - person YahooER YER; 25.10.2012