自定义表单

当某个元素需要的表单无法以简单的 输入对话框 显示,也无法使用常规的带注解的 Jmix 视图 方式时,可以提供一个自定义表单。该表单仍然可以是 Jmix 视图,也可以使用其他 UI 技术(例如 React)构建。

在建模器中,需要为此表单提供一个 id。自定义表单必须读取提供的输入参数并返回结果。

custom form

自定义 Jmix 表单

如需在 启动流程我的任务 视图中渲染自定义表单,请实现 ProcessFormViewCreator 接口,并将其注册到 custom 表单类型。

我们来看一个实现 ProcessFormViewCreatorMyCustomProcessFormViewCreator 示例:

@Component("MyCustomProcessFormViewCreator")
@Order(1) (1)
public class MyCustomProcessFormViewCreator implements ProcessFormViewCreator {

    @Autowired
    private DialogWindows dialogWindows;

    @Override
    public String isApplicableFor() {
        return "custom";
    }

    @Override
    public DialogWindow<?> createStartProcessView(CreationContext creationContext) { (2)
        FormData formData = creationContext.getFormData();
        View origin = creationContext.getOrigin();
        String viewId = formData.getScreenId();

        DialogWindow dialog = dialogWindows
                .view(origin, viewId)
                .open();

        if (dialog.getView() instanceof AcceptsProcessDefinition) { (3)
            ((AcceptsProcessDefinition) dialog.getView())
                    .setProcessDefinition(creationContext.getProcessDefinition());
        }
        return dialog;
    }

    @Override
    public DialogWindow<?> createUserTaskView(CreationContext creationContext) { (4)
        FormData formData = creationContext.getFormData();
        View origin = creationContext.getOrigin();

        String viewId = formData.getScreenId();
        DialogWindow dialog = dialogWindows
                .view(origin, viewId)
                .build();

        if (dialog.getView() instanceof AcceptsTask) { (5)
            ((AcceptsTask) dialog.getView())
                    .setTask(creationContext.getTask());
        }
        return dialog;
    }
}
1 @Order 注解使该实现成为框架的首选。
2 重写用于创建启动流程表单的方法。
3 检查视图是否实现了 AcceptsProcessDefinition。此时,需要为视图设置 ProcessDefiniton
4 重写用于创建任务流程表单的方法。
5 检查视图是否实现了 AcceptsTask。此时,需要为视图设置 Task

上面的代码使用了两个辅助接口。辅助接口 AcceptsProcessDefinition 的示例:

public interface AcceptsProcessDefinition {
    void setProcessDefinition(ProcessDefinition processDefinition);
}

辅助接口 AcceptsTask

public interface AcceptsTask {
    void setTask(Task task);
}

这些接口必须由自定义的启动和任务表单实现。

自定义启动表单

示例中的自定义启动表单仅带有一个 Start process 按钮:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://customStartForm.title">
    <layout>
        <button id="startProcessBtn" text="msg://startProcessBtn.caption"/>
    </layout>
</view>

自定义启动表单的视图控制器:

@ViewController(id = "CustomStartForm")
@ViewDescriptor(path = "custom-start-form.xml")
public class CustomStartForm extends StandardView implements AcceptsProcessDefinition {

    private ProcessDefinition processDefinition;

    @Autowired
    private RuntimeService runtimeService;

    @Override
    public void setProcessDefinition(ProcessDefinition processDefinition) {
        this.processDefinition = processDefinition;
    }

    @Subscribe(id = "startProcessBtn", subject = "clickListener")
    public void onStartProcessBtnClick(final ClickEvent<JmixButton> event) {
        runtimeService.startProcessInstanceByKey(processDefinition.getKey());
        closeWithDefaultAction();
    }
}

自定义任务表单

示例中的自定义任务表单仅带有一个 Task complete 按钮:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://com.company.bpmex1.view.forms/customTaskForm.title">
    <layout>
        <button id="completeTaskBtn" text="msg://com.company.bpmex1.view.forms/completeTaskBtn.text"/>
    </layout>
</view>

自定义任务表单的视图控制器:

@ViewController("CustomTaskForm")
@ViewDescriptor("custom-task-form.xml")
public class CustomTaskForm extends StandardView implements AcceptsTask {

    private Task task;

    @Autowired
    private TaskService taskService;

    @Subscribe("completeTaskBtn")
    public void onCompleteTaskBtnClick(ClickEvent<JmixButton> event) {
        taskService.complete(task.getId());
        closeWithDefaultAction();
    }

    @Override
    public void setTask(Task task) {
        this.task = task;
    }
}

使用其他的 UI 技术

可以使用其他 UI 技术(例如 React)创建表单,通过 REST 与 Jmix BPM 通信。使用 Flowable 的 FormService 可以从引擎获取表单信息,该服务提供以下方法:

  • StartFormData getStartFormData (String processDefinitionId)

  • TaskFormData getTaskFormData (String taskId)

或者,使用 Jmix 中的 ProcessFormDataExtractor 暴露表单元数据。示例请参见 获取流程表单数据 部分。