在使用BDF2提供在流程模版在線配置時(shí),可以看到它還為我們提供了一個(gè)通用工具欄配置的功能,利用這個(gè)通用工具欄配置,可以實(shí)現(xiàn)在我們配置的流程處理頁(yè)面中動(dòng)態(tài)插入BDF2中提供的通用工具欄,在這個(gè)通用工具欄配置當(dāng)中還可以定義工具欄的位置,位置可以選擇在流程業(yè)務(wù)頁(yè)面的上部或下部,或者在我們的業(yè)務(wù)頁(yè)面當(dāng)中指定的工具欄中插入所配置的工具欄組件。
對(duì)于這個(gè)通用工具欄里工具里的組件,我們提供了一個(gè)名為IToolbarContentProvider接口,通過(guò)實(shí)現(xiàn)這個(gè)接口,并將接口實(shí)現(xiàn)類配置到Spring當(dāng)中,可以為我們的通用工具欄提供所需要的工具欄組件,該接口的源碼如下:
IToolbarContentProvider接口
package com.bstek.bdf2.jbpm4.view.toolbar;
/**
* @author Jacky.gao
* @since 2013-6-3
* 用于為流程中任務(wù)處理頁(yè)面的通用工具欄提供具體內(nèi)容
*/
public interface IToolbarContentProvider {
/**
* 返回包含要放置到通用工具欄上的具體內(nèi)容所在的具體dorado7的view名稱,
*
比如bdf2.jbpm4.view.toolbar.impl.completetask.CompleteTaskToolbarContentProvider,這個(gè)系統(tǒng)默認(rèn)提供
的用于完成任務(wù)的內(nèi)容提供者頁(yè)面
* @return 返回一個(gè)具體view的名稱,不包含.d
*/
String getView();
/**
* @return 返回能代表當(dāng)前這個(gè)提供者的key,一個(gè)有意義的字符串,比如SimpleCompleteTask
*/
String key();
/**
* @return 返回一段描述信息,用于說(shuō)明這個(gè)提供者作用
*/
String desc();
/**
* @return 返回這個(gè)提供者是否被禁用,返回true,那么這個(gè)提供者將不能使用
*/
boolean isDisabled();
}
默認(rèn)BDF2提供了三個(gè)IToolbarContentProvider接口的實(shí)現(xiàn)類,如下表所示:
實(shí)現(xiàn)類名 | key | desc | isDisabled |
CompleteTaskToolbarContentProvider | SimpleCompleteTask | 直接完成任務(wù) | false |
JumpNodeToolbarContentProvider | SimpleJumpToOtherTaskNode | 直接跳轉(zhuǎn)到其它任務(wù)節(jié)點(diǎn) | false |
SeeProcessImageToolbarContentProvider | SeeProcessImage | 查看流程圖 | false |
有了這三個(gè)默認(rèn)的實(shí)現(xiàn)類,所以我們?cè)谂渲昧鞒棠0娴耐ㄓ霉ぞ邫跁r(shí)默認(rèn)就可以看到這三個(gè)工具欄組件提供者,如下圖所示:

一旦我們?cè)谂渲卯?dāng)中使用了通用工具欄,并且為這個(gè)通用工具欄添加了所需要的工具欄組件,那么就可以在我們的業(yè)務(wù)處理頁(yè)面當(dāng)中看到這個(gè)通用工具欄及其相關(guān)組件,如下圖所示:

BDF2默認(rèn)提供的三個(gè)工具欄組件功能較為簡(jiǎn)單,在實(shí)際使用當(dāng)中,真正有價(jià)值的工具欄組件還需要與我們的流程業(yè)務(wù)結(jié)合起來(lái),所以需要我們自己通過(guò)編寫IToolbarContentProvider接口實(shí)現(xiàn)類來(lái)自定義我們自己的工具欄組件。
關(guān)于IToolbarContentProvider接口,前面已經(jīng)有過(guò)介紹,在這個(gè)接口當(dāng)中,比較重要的就是其中的getView方法,這個(gè)方法要求我們返回一個(gè)view的名稱,在這個(gè)view當(dāng)中就包含了需要放置到我們提供的通用工具欄的組件,比如一個(gè)toolbarButton等。為什么要求我們工具欄組件提供者要返回一個(gè)view呢?
因?yàn)槲覀冊(cè)谌蝿?wù)業(yè)務(wù)頁(yè)面當(dāng)中放置的工具欄組件一般實(shí)現(xiàn)的功能比較復(fù)雜,比如點(diǎn)擊一個(gè)ToolBarButton彈出一個(gè)Dialog,同時(shí)在Dialog里又顯示其它內(nèi)容或通過(guò)一個(gè)Action與后臺(tái)交互,對(duì)于這種比較復(fù)雜的組件,通過(guò)一個(gè)具體的View頁(yè)面來(lái)定義相對(duì)要簡(jiǎn)單許多,所以我們這里IToolbarContentProvider接口提供了一個(gè)getView方法,要求返回一個(gè)view的具體名稱,這樣系統(tǒng)在渲染我們定義的任務(wù)處理頁(yè)面時(shí),會(huì)根據(jù)傳遞過(guò)來(lái)的taskId參數(shù)查找當(dāng)前頁(yè)面是否配置了通用工具欄,如果配置了,那就取出配置的相應(yīng)組件提供者,通過(guò)調(diào)用這些組件提供者的getView方法返回的view名稱,動(dòng)態(tài)創(chuàng)建一個(gè)Dorado7的View對(duì)象,將這個(gè)View對(duì)象根包含的所有組件復(fù)制到用戶所配置業(yè)務(wù)流程處理頁(yè)面當(dāng)中,在復(fù)制組件時(shí)將排除ToolBar組件,所以我們?cè)诙x自定義工具欄組件對(duì)應(yīng)的view頁(yè)面時(shí)一定要在view的根下添加一個(gè)toolbar組件,把需要放置通用工具欄上的組件放置在這個(gè)toolbar組件下,這樣這個(gè)toolbar組件下的內(nèi)容將會(huì)被復(fù)制到我們的通用工具欄當(dāng)中。
我們以系統(tǒng)默認(rèn)提供的CompleteTaskToolbarContentProvider為例,先來(lái)看看這個(gè)通用工具欄組件提供者的源碼:
CompleteTaskToolbarContentProvider源碼
package com.bstek.bdf2.jbpm4.view.toolbar.impl.completetask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.jbpm4.service.IBpmService;
import com.bstek.bdf2.jbpm4.view.toolbar.IToolbarContentProvider;
import com.bstek.dorado.annotation.Expose;
/**
* @author Jacky.gao
* @since 2013-6-3
*/
@Component("bdf2.jbpm4.completeTaskToolbarContentProvider")
public class CompleteTaskToolbarContentProvider implements
IToolbarContentProvider {
@Value("${bdf2.jbpm4.disabledCompleteTaskToolbarContentProvider}")
private boolean disabled;
@Autowired
@Qualifier(IBpmService.BEAN_ID)
private IBpmService bpmService;
public String getView(){
return "bdf2.jbpm4.view.toolbar.impl.completetask.CompleteTaskToolbarContentProvider";
}
public String key() {
return "SimpleCompleteTask";
}
public String desc() {
return "直接完成任務(wù)";
}
public boolean isDisabled() {
return disabled;
}
@Expose
public void completeTask(String taskId){
bpmService.completeTaskById(taskId);
}
}
可以看到這個(gè)用于完成任務(wù)的工具欄組件提供者采用的view頁(yè)面名稱為“bdf2.jbpm4.view.toolbar.impl.completetask.CompleteTaskToolbarContentProvider”,我們?cè)賮?lái)看看這個(gè)View,如下圖所示:

可以在這個(gè)頁(yè)面view的根下定義了一個(gè)toolbar,在這個(gè)toolbar當(dāng)中添加了可以出現(xiàn)在通用工具欄下的ToolBarButton,再來(lái)看看這個(gè)View頁(yè)面的源碼:
View源碼
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
<Arguments/>
<Context/>
<Model/>
<View>
<AjaxAction id="ajaxActionCompleteTask">
<ClientEvent name="onSuccess">dorado.MessageBox.alert("操作成功");
var win=window.parent;
if(win){
var taskListUrl="${configure.getString("bdf2.jbpm4.listTodoTaskUrl")}";
win.open(taskListUrl,"_self");
}</ClientEvent>
<Property name="parameter">${request.getParameter("taskId")}</Property>
<Property
name="service">bdf2.jbpm4.completeTaskToolbarContentProvider#completeTask</Property>
<Property name="confirmMessage">真的要完成當(dāng)前任務(wù)嗎?</Property>
</AjaxAction>
<ToolBar>
<ToolBarButton>
<Property name="icon">url(skin>common/icons.gif) -180px -120px</Property>
<Property name="caption">完成任務(wù)</Property>
<Property name="action">ajaxActionCompleteTask</Property>
</ToolBarButton>
</ToolBar>
</View>
</ViewConfig>
需要特別注意的是,因?yàn)橥ㄓ霉ぞ邫诮M件對(duì)應(yīng)的View頁(yè)面里的所有組件將會(huì)復(fù)制到我們的業(yè)務(wù)流程處理頁(yè)面當(dāng)中,所以在定義組件ID時(shí)要小心不要與業(yè)務(wù)流程處理頁(yè)面當(dāng)中組件出現(xiàn)重名,另外,對(duì)于通用工具欄組件對(duì)應(yīng)的View頁(yè)面,系統(tǒng)只會(huì)復(fù)制View節(jié)點(diǎn)下面的組件,而不會(huì)處理Arguments、Context及Model節(jié)點(diǎn),所以在定義這個(gè)View頁(yè)面時(shí),我們需要將所有的信息都放在這個(gè)View節(jié)點(diǎn)下,如果要使用DataType,那么需要將這個(gè)DataType定義成全局的,而不能定義到Model節(jié)點(diǎn)變成私有的,否則在加載這個(gè)組件時(shí)將出現(xiàn)找不到DataType的錯(cuò)誤。
對(duì)于我們的業(yè)務(wù)流程處理頁(yè)面,如果頁(yè)面布局比較復(fù)雜,或者希望將通用工具欄放置到指定位置(而不一定是頁(yè)面頂部或底部),這個(gè)時(shí)候就可以在我們的業(yè)務(wù)頁(yè)面當(dāng)中添加一個(gè)工具欄,并將這個(gè)工具欄的ID設(shè)置為bdf2.jbpm4.genericTaskToolBarId屬性的值,這樣我們所定義的所有組件都會(huì)輸出到用戶指定的這個(gè)工具欄之上。
通過(guò)上述內(nèi)容介紹,相應(yīng)您已經(jīng)對(duì)BDF2-JBPM4模塊當(dāng)中提供的這個(gè)可配置的通用工具欄有了比較深入的認(rèn)識(shí),其實(shí)在Dorado7環(huán)境下,在開(kāi)發(fā)業(yè)務(wù)流程處理頁(yè)面時(shí),我們除了可以通過(guò)配置的方式為處理頁(yè)面添加通用工具欄外,我們還可以在開(kāi)發(fā)業(yè)務(wù)流程處理頁(yè)面時(shí)利用Dorado7提供的頁(yè)面模版功能,更為靈活的定制我們的業(yè)務(wù)流程處理頁(yè)面。與我們的通用工具欄相比,Dorado7提供的頁(yè)面模版功能更為靈活,但需要我們?cè)陂_(kāi)發(fā)業(yè)務(wù)流程處理頁(yè)面時(shí)采用這個(gè)模版,所以他們二者各有優(yōu)劣,我們可以根據(jù)項(xiàng)目情況及我們個(gè)人喜好靈活選擇。
更多建議: