logo

[ELMA3] Использование разметки Razor для создания интерфейса пользовательской задачи в бизнес-процессе

Внимание!
Компания не несет ответственности за изменения, внесенные Вами в системные формы. После обновления системы на новую версию некоторые измененные Вами представления могут работать некорректно.
Чтобы использовать разметку Razor, необходимо в настройках пользовательской задачи на вкладке Настройки формы установить флаг Использовать шаблон Razor и прописать путь до этого шаблона в формате: Forms/Workflow/{Имя класса вашего процесса}/{Название файла вашей формы без расширения}.При этом файл TaskForm.cshtml необходимо предварительно создать в каталоге .../<Общая папка с файлами системы ELMA>/UserConfig/WebApplication/Views/Shared/Forms/Workflow/{Имя класса вашего процесса}.

Для отображения значений блока требуется нажать на значок и отредактировать шаблон:
1. В область директив добавить @using EleWise.ELMA.Services. Требуется для доступа к ObjectViewData и ContextVars.
2. Для вывода переменных добавить @using (var data = new ObjectViewData(Html, Html.ViewData, @ContextVars.GetOrDefault<object>("ContextPropertyViewItemModel"), true)).

Пример отображения шаблона:

@using EleWise.ELMA.BPM.Web.Tasks.Models
@using EleWise.ELMA.Web.Mvc.Html.Forms
@using EleWise.ELMA.Services

@using (var data = new ObjectViewData(Html, Html.ViewData, @ContextVars.GetOrDefault<object>("ContextPropertyViewItemModel"), true))
{
	@Html.EditableProperty("Entity.ContextPropertyBlok");
	@Html.EditableProperty("Entity.ContextPropertyStroka");
}
Контекстные переменные процесса можно вывести так (с помощью свойства style="margin-top:10px" можно регулировать ширину поля):
<table style="margin-top:10px">
@Html.EditableProperty("Entity.value1")
</table>
где value1 - это имя свойства контекстной переменной процесса.
Для вывода переменных в режиме Только для чтения вместо EditableProperty необходимо использовать метод Property:
<table style="margin-top:10px">
@Html.Property("Entity.value1")
</table>
При этом следует помнить, что @Html.EditableProperty вставляет строку таблицы с названием переменной и полем ввода. Если возникает необходимость вывести две контекстные переменные в одну строку, можно использовать методы Caption (выводит название переменной) и Editor (выводить поле ввода для этой переменной) в отдельных столбцах таблицы:
<table>
<tr>
<td>@Html.Caption("Entity.value1")</td>
<td>@Html.Editor("Entity.value1")</td>
<td>@Html.Caption("Entity.value2")</td>
<td>@Html.Editor("Entity.value2")</td>
</tr>
</table> 
Если необходимо вывести в задаче несколько контекстных переменных в одну строку, но в режиме Только для чтения, то код будет таким же, но вместо метода Editor нужно использовать метод Display.
Для того чтобы вывести две контекстные переменные типа какого-либо объекта в одну строку, можно использовать следующую конструкцию:
<table style="margin-top:10px; width:75%">
   <tr>
      <td style="width:50%">
        <table>
        @Html.EditableProperty("Entity.Klient", a=>a.Required=true)
        </table>
      </td>
      <td>
      <div style="width:10px;" />
      </td>
      <td style="width:50%">
        <table>
        @Html.EditableProperty("Entity.Usluga")
        </table>
      <td>
   </tr>
</table>
Каждая переменная выводится в отдельной таблице в колонке общей таблицы: это позволяет избежать влияния встроенных свойств метода EditableProperty (как и метода Property), которые всегда формируют отдельную строку таблицы для выводимого значения.
Для применения нескольких CSS свойств синтаксис следующий:
@Html.EditableProperty("Entity.value1", a => {a.Html.style["width"]="250px"; a.Html.style["height"]="250px";}) 
Перемення типа Блок отображается так же, как и остальные контекстные переменные:
@Html.EditableProperty("Entity.blok")
При этом можно выводить не все свойства блока, а только добавленные в контекст этой задачи, делается это так:
<table>
@Html.Property("Entity.blok", a =>
{
a.TablePartParentId = Model.Entity.Id;
a.ViewProviderUid = EleWise.ELMA.Workflow.Web.Integration.WorkflowTaskObjectViewItemProvider.UID;
a.ViewItemId = Model.Task.Id.ToString();
})
</table>   
Признак обязательности заполнения выводимого поля (Required) указывается следующим образом:
@Html.EditableProperty("Entity.value1", a=>a.Required=true) 
Кнопки исполнения задачи выводятся так:
@Html.Partial("WorkflowTask/Buttons", Model) 
Если необходимо, чтобы название переменной на форме задачи и ее значение отображались с разными стилями форматирования, можно использовать следующую конструкцию (в тегах можно задать любые нужные параметры форматирования):
<td style="color:red">
@Html.Caption("Entity.value1")
</td>
<td style="color:blue">
@Html.Display("Entity.value1", a => {})
</td>
Ниже приведен пример содержимого файла шаблона Razor, в котором создается 2 вкладки на форме задачи (Общие поля и Дополнительно). На вкладке Общие поля отображаются те переменные, которые выбраны в настройках задачи на вкладке Контекст. На вкладке Дополнительно отображается контекстная переменная value1 как в приведенных выше примерах. С помощью первых двух строк выводится информация о задаче.
@using (var data = new ObjectViewData(this))
@inherits EleWise.ELMA.Web.Mvc.DynamicViewControl<EleWise.ELMA.Workflow.Web.Models.WorkflowTaskInfo>

@Html.Partial("WorkflowTask/ExecutedInfo", Model.ExecutedInfo)

@(TabPanel("WorkflowTask1").Items(tabs =>
{

    tabs.Add(
        new EleWise.ELMA.Web.Mvc.Models.Selectors.TabPanelItem()
        {
            Text = SR.T("Общие поля"),
            Selected = Model.SelectedTab == 0
        }).Content(@<text> @Html.Partial("~/Modules/EleWise.ELMA.Workflow.Web/Views/WorkflowTask/DefaultFieldsView.cshtml") </text>);    

    tabs.Add(
        new EleWise.ELMA.Web.Mvc.Models.Selectors.TabPanelItem()
        {
            Text = SR.T("Дополнительно")
        }).Content(@<table style="margin-top:10px">@Html.EditableProperty("Entity.value1")</table>);

}).Render())

@Html.Partial("WorkflowTask/Buttons", Model)