自定义表单
当需要以非标准方式展示表单时,可以使用自定义流程表单。在建模器中,可以为自定义表单提供一个表单 id,一组表单参数和一组输出。
如果你使用的是另一种 UI 技术(比如,React),那么你需要获取表单的信息,并根据信息渲染表单。可以使用 FormService
接口获取表单信息,接口有如下方法:
-
StartFormData getStartFormData(String processDefinitionId)
-
TaskFormData getTaskFormData(String taskId)
如需在 Start process(开始流程) 和 My tasks(我的任务) 界面中展示自定义表单,你需要为自定义表单类型定义 ProcessFormScreenCreator
。为了覆盖默认的 ProcessFormScreenCreator
,你需要添加 @Order
注解。
我们看看下面示例 MyCustomProcessFormScreenCreator
实现了 ProcessFormScreenCreator
:
@Component("samples_MyCustomProcessFormScreenCreator")
@Order(1) (1)
public class MyCustomProcessFormScreenCreator implements ProcessFormScreenCreator {
@Autowired
private ScreenBuilders screenBuilders;
@Override
public String isApplicableFor() { (2)
return "custom";
}
@Override
public Screen createStartProcessScreen(CreationContext creationContext) { (3)
Screen screen = screenBuilders.screen(creationContext.getFrameOwner())
.withScreenId(creationContext.getFormData().getScreenId())
.withOpenMode(OpenMode.DIALOG)
.build();
if (screen instanceof AcceptsProcessDefinition) { (4)
((AcceptsProcessDefinition) screen)
.setProcessDefinition(creationContext.getProcessDefinition());
}
return screen;
}
@Override
public Screen createUserTaskScreen(CreationContext creationContext) { (5)
Screen screen = screenBuilders.screen(creationContext.getFrameOwner())
.withScreenId(creationContext.getFormData().getScreenId())
.withOpenMode(OpenMode.DIALOG)
.build();
if (screen instanceof AcceptsTask) { (6)
((AcceptsTask) screen).setTask(creationContext.getTask());
}
return screen;
}
}
1 | @Order 注解表示 ProcessForScreenCreator 接口的当前实现会第一个使用。 |
2 | ScreenCreator 用在自定义表单。 |
3 | 重写该方法,创建启动流程表单。 |
4 | 检查界面是否实现了 AcceptsProcessDefinition 接口,如是,则需要设置 ProcessDefiniton 。 |
5 | 重写该方法,创建任务流程表单。 |
6 | 检查界面是否实现了 AcceptsTask 接口,如是,则需要设置 Task 。 |
AcceptsProcessDefinition
接口示例:
public interface AcceptsProcessDefinition {
void setProcessDefinition(ProcessDefinition processDefinition);
}
AcceptsTask
接口示例:
public interface AcceptsTask {
void setTask(Task task);
}
自定义流程启动表单 XML,只有 Start process 按钮:
<window xmlns="http://jmix.io/schema/ui/window"
caption="msg://customStartForm.caption">
<layout>
<button id="startProcessBtn" caption="msg://startProcessBtn.caption"/>
</layout>
</window>
自定义启动表单界面控制器:
@UiController("smpl_CustomStartForm")
@UiDescriptor("custom-start-form.xml")
public class CustomStartForm extends Screen implements AcceptsProcessDefinition {
private ProcessDefinition processDefinition;
@Autowired
private RuntimeService runtimeService;
@Subscribe("startProcessBtn")
public void onStartProcessBtnClick(Button.ClickEvent event) {
runtimeService.startProcessInstanceById(processDefinition.getId());
closeWithDefaultAction();
}
@Override
public void setProcessDefinition(ProcessDefinition processDefinition) {
this.processDefinition = processDefinition;
}
}
自定义任务表单 XML,只有 Task complete 按钮:
<window xmlns="http://jmix.io/schema/ui/window"
caption="msg://customTaskForm.caption">
<layout>
<button id="completeTaskBtn" caption="msg://completeTaskBtn.caption"/>
</layout>
</window>
自定义任务表单界面控制器:
@UiController("smpl_CustomTaskForm")
@UiDescriptor("custom-task-form.xml")
public class CustomTaskForm extends Screen implements AcceptsTask {
private Task task;
@Autowired
private TaskService taskService;
@Subscribe("completeTaskBtn")
public void onCompleteTaskBtnClick(Button.ClickEvent event) {
taskService.complete(task.getId());
closeWithDefaultAction();
}
@Override
public void setTask(Task task) {
this.task = task;
}
}
本页是否有帮助?
感谢您的反馈