




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、藍凌EKP-J表單自定義寶典 文檔控制/Document Control 修改記錄日期作者版本備注2010/8/31葉中奇1.0第一個版本 審閱人日期審閱人版本備注 分發日期分發人分發對象備注目 錄第一章導讀41.1從什么地方開始41.2相關資料4第二章快速入門42.1第一次使用表單自定義42.2表單自定義可以做什么52.3表單自定義可以用在什么地方62.4表單自定義不能做什么6第三章使用表單自定義63.1使用表單自定義工具63.2表單自定義的版本功能143.3理解表單自定義的數據存儲153.4使用表單自定義的高級控件17第四章擴展表單自定義264.1擴展表單自定義中的存儲事件264.2擴展表
2、單自定義工具中的控件(未展開說明)32第五章在應用中部署表單自定義325.1部署說明325.2部署表單模板335.3部署表單主文檔355.4部署表單存儲映射41第一章 導讀1.1 從什么地方開始ü 若您對表單自定義完全不了解,建議您先查閱“快速入門”章節。ü 若您了解表單自定義的基本概念,想使用表單自定義來完成您的業務需求,那建議您查閱“使用表單自定義”的章節。溫馨提醒:“使用表單自定義”的章節將由淺入深,告訴您如何使用表單自定義,當然,深一點的內容需要有一定的編程基礎。ü 當您發現現有的表單自定義滿足不了您的業務需求的時候,您期望做一些擴展,那您可以查閱“擴展表
3、單自定義”章節。溫馨提醒:該章節需要有一定的EKP-J編程基礎。ü 若您期望在一個新的模塊能使用表單自定義的功能,那請查閱“在應用中部署表單自定義”章節。溫馨提醒:該章節需要有一定的EKP-J編程基礎。ü 若您是一個表單自定義的使用者,一個非開發人員,建議您查閱本文的所有案例,了解通過表單自定義可以做到什么程度,若您是一個開發人員,建議您通讀全文。1.2 相關資料本文涉及到公式定義器的相關知識,請參閱詳見公式定義器寶典涉及到流程部分的知識,請參閱詳見流程寶典第二章 快速入門2.1 第一次使用表單自定義我們在費用報銷的時候經常會碰到一個這樣的需求,當報銷金額大于10000元的
4、時候,需要高一層的領導進行審批,然后再交給財務審批。在不開發新模塊的情況下,我們一般會用審批流程來完成這個需求。然而,由于我們需要在流程里面獲取到報銷金額的字段,所以我們不能采用RTF作為審批的內容,而借助表單自定義的功能,可以很好地解決該問題。自定義表單定義:打開審批流程模塊模板定義的界面,切換到審批內容標簽,我們可以看到表單自定義工具:內容編輯區操作按鈕區我們很快就可以定義出這樣的界面:由于報銷金額是數字類型,所以我們在字段的屬性中,設置“數據類型”為“數字”。流程定義:在流程定義里面,我們增加了一個條件分支的節點,通過定義公式:“$報銷金額$>10000”作為條件分支的條件公式,實
5、現當報銷金額大于10000元的時候,需要高一層的領導進行審批,然后再交給財務審批的需求。2.2 表單自定義可以做什么在普通的應用中,每種類型的文檔(或記錄)都會有自己固有的屬性(如標題、創建時間等),若期望添加而外的屬性,就必須通過修改代碼的方式實現,而EKP-J的表單自定義的功能就是為了打破該限制而產生的。通過表單自定義,我們可以不通過修改代碼,靈活得添加額外的屬性,并對界面進行排版。而這些額外添加的屬性,可能會被使用到其它的地方,如流程的判定、統計查詢等,因此這些數據的存儲必須是結構化的(而不是像RTF一樣全部保存)。此外,客戶可能已經知道針對不久的將來,當公司制度發生改革的時候,某些特定
6、表單的內容也會隨之改變,客戶期望這些表單是“活”的,是可以自己配置的。而這個時候,表單自定義將是客戶需求的最好解決方案。2.3 表單自定義可以用在什么地方目前在我們的系統中最常使用表單自定義的是審批流程模塊,在該模塊中,用戶根據不同的業務場景,定義不同的表單,滿足各種業務需求。另外,比如公文模塊,大部分客戶對公文模塊的需求基本上都一致,許多基礎的字段基本上都一致,后臺的業務邏輯也大同小異,最不一樣的地方可能就是公文的展現方式,每個企業可能會有自己的公文表單展現習慣,或者有幾個定制化的字段。若我們可以在公文模塊中啟用表單自定義的功能,就可以屏蔽掉企業間的差異,用一個標準的公文模塊通殺所有企業的公
7、文需求。還有HR的員工信息等,各個企業都會有一些差異化的字段,這也是一個表單自定義很好的實戰場景。當然,您可以根據您的實際業務需求,把表單自定義“發揚光大”。2.4 表單自定義不能做什么從前面的用途我們基本上發現,目前我們的表單自定義都是依附于某個模塊實體的(比如審批流程、公文等),通過表單自定義的功能,我們可以在上面靈活地進行屬性的擴充,但它并不包含增刪查改的功能,也不包含視圖展現等,更沒有在上面直接部署機制。所以我們無法通過自定義表單直接“開發”出一個全新的模塊。該限制可能在將來的版本中會有所改動,但至少現在的版本是無法這樣做的。第三章 使用表單自定義3.1 使用表單自定義工具我們在審批流
8、程的模塊 模板設置 審批內容標簽中,可以找到表單自定義的工具界面,如下圖:內容編輯區操作按鈕區3.1.1 表單自定義使用的小竅門1、 使用百分比定義控件寬度。當我們定義一個控件的寬度的時候,通過拖拉的方式定義,單位往往是像素,但這樣定義往往適應不了終端用戶的屏幕分辨率,就會導致寬屏終端顯示內容太少,或者窄屏用戶出現橫向滾動條等現象,為了解決該問題,您可以在屬性框中按百分比定義寬度(如: “90%”),這樣就可以適應各種終端顯示器了。2、 選擇界面控件。通過Ctrl+左鍵,可以選擇多個控件。當是界面的控件很多,難以點選的時候,還可以點擊展現控件樹,在控件樹中快速定位到相應的控件。3、 快速創建多
9、個同類型的控件。若需要創建一個單行文本輸入框,我們需要在操作按鈕區中選擇了單行文本輸入框,然后點擊內容編輯區。當我們期望創建多個輸入框的時候,我們可以在操作按鈕區中選擇單行文本輸入框,然后按住shift鍵不放,在內容編輯區的不同地方點擊,這樣就可以連續創建多個編輯框了,若期望取消,按下Esc就可以了。4、 拷貝整個表單。若我們前面做好了一個表單,我們可能期望在一個新的表單中使用原來的表單,然后在新表單里面稍微修改一下,做為新的表單使用。顯然,界面里面一個個控件的拷貝太繁瑣,我們可以這樣操作。點擊顯示高級控件:,旁邊會顯示“編輯表單HTML代碼”的按鈕,點擊該按鈕,在編輯區域里面就會顯示整個表單
10、的HTML代碼,這時候,我們可以將所有代碼拷貝到另外一個表單中使用,拷貝完畢后,記得點擊“設置HTML”按鈕,使您拷貝的HTML代碼生效。注意:除非您對表單的HTML代碼非常熟悉,否則不建議您直接通過修改HTML代碼的方式修改表單。3.1.2 控件的屬性在我們雙擊控件的時候,會彈出控件的屬性窗口,下面是一個單行文本輸入框的屬性:在屬性界面中,需要注意的有幾個地方:1、 數據類型表單中每個被存儲的數據項都是有數據類型的,數據類型對于后面的公式計算等方面起到了非常重要的地位。下表列出了表單自定義中的各種控件的數據類型:自定義表單元素類型確定單行輸入框由該控件的“數據類型”屬性確定是字符型還是數字型
11、。多行輸入框字符型單選按鈕由該控件的“數據類型”屬性確定是字符型還是數字型。多選按鈕字符型,多值用;分隔下拉菜單由該控件的“數據類型”屬性確定是字符型還是數字型。富文本框字符型附件不參與任何公式計算地址本選擇框組織架構對象類型(SysOrgElement)日期選擇框日期時間型(Date)隱藏字段由該控件的“數據類型”屬性確定是字符型、數字型、日期型。前端計算控件數字型看完了這張表以后,您可能會對日期時間型(Date)、組織架構對象類型(SysOrgElement)的概念還比較模糊,沒關系,在您往后的使用中,我們會詳細地介紹它:若您需要在公式定義器中使用,那公式定義器寶典會有詳細描述;若您在擴展
12、表單自定義的章節中使用它,那該章節也會為您進行描述。2、 初始值您可以在初始值輸入框中,輸入該字段的初始值。直接手工輸入的內容不進行公式計算,若期望初始值通過公式來進行計算,請點擊“公式定義”的按鈕,在彈出框中輸入公式,公式輸入完畢后,屬性框中的初始值被鎖定,不能直接輸入,同時下面出現“更新時重新計算”的選項。若您期望修改為非公式計算的模式,那請再次點擊“公式定義”按鈕,將公式清空后即可。公式定義器的使用,詳見公式定義器寶典。初始值的計算是有順序的,順序是按照界面從上到下,從左到右的順序執行。案例1:初始值計算順序我們在表單自定義中定義了以下幾個字段:在實際運行中,總額1的初始值計算結果為0(
13、原因是由于在計算總額1的時候,單價和數量的初始值并未初始化),總額2的計算結果為200。案例2:更新時重新計算在案例1中,我們可能期望總額是不能讓用戶自己輸入的,而且當單價和數量發生改變的時候,需要重新計算總額這個字段,那我們就可以在總額字段的屬性框中將該字段設定為“只讀”,而且是“更新時重新計算”3、 IDID是該控件的唯一標識,修改時請謹慎,否則可能導致引用地方的錯誤。案例1:字段改名對公式的影響問:我在流程中使用了公式:“$金額$>1000”,后來我把“金額”這個字段名稱修改為了“報銷金額”,可是我忘記修改了流程中的公式,這時公式的計算是否還能正常運行?答:公式計算時候引用的是字段
14、的ID,只要ID沒有發生改變,公式是能夠正常運行的。但在流程定義的界面中,公式顯示的地方可能還是出現“$金額$”這個變量,這只是顯示沒有更新而已,重新打開公式定義器的頁面就會自動更新名稱。但是若您把金額這個字段刪除了,那公式運行時就會報錯。案例2:更換控件的展現形式問:我開始用單行文本輸入框定義了一個報銷內容的字段,可用了一段時間后,發現單行文本輸入框太小了,我想把它換成多行文本輸入框,我該如何操作才能兼容以前的數據顯示?答:若您直接刪除了單行文本輸入框,然后再添加一個單行文本輸入框,這個時候系統會認為這兩個是不同的字段,所以舊數據是無法顯示在新的多行文本輸入框中。要解決該問題,您可以先將單行
15、文本輸入框的ID記錄下來,再刪除單行文本輸入框,創建多行文本輸入框后,將原來的ID寫入到多行文本輸入框中,這樣系統就會認為這兩個字段是同一個。3.1.3 控制表單字段級權限在一個標準的EKP產品模塊中,主文檔的數據基本上都是由起草人進行所有字段的信息輸入,審批人若有“編輯主文檔”的權限,那他就可以進入編輯頁面,對文檔字段進行修改,但往往在審批過程中,需要控制到字段級的權限。下面舉個員工轉正申請的例子說明表單的權限。 案例需求表單內容大概定義如下:我們需要實現申請人能填寫“申請人填寫”部分內容,流程中的“部門經理審批”節點處理人可以填寫“部門經理填寫”部分內容,流程中的“HR經理審
16、批”節點處理人可填寫“HR經理填寫”部分內容。另外,我們還期望HR經理填寫的意見,人力資源部和總裁辦的所有人可以查閱,其它人不可查閱。 案例實現第一步:插入權限區段為了實現這個需求,我們需要插入權限區段,將特殊權限的區域放入權限區段中。插入后的表單的樣子如下:注意上圖的紅色小方塊就是權限區段的作用范圍。其中,申請人填寫部分,由于跟標準的權限一致,所以可以不設置權限區段。第二步:設置默認權限定義好區段后,點擊顯示權限設置按鈕,進入權限設置界面:雙擊這里可以修改區段名稱點擊這里可以切換場景點擊這里切換本場景下的隱藏/閱讀/編輯權限點擊這里控制閱讀狀態的可訪問權限,針對所有場景生效場景
17、說明:默認權限:除起草節點外,所有的節點都默認使用“默認權限”的設定,流程審批通過以后也使用“默認權限”的設定。流程場景-起草節點:該場景下,所有權限區段默認都為編輯權限。由于我們期望HR經理填寫的意見,人力資源部和總裁辦的所有人可以查閱,其它人不可查閱,所以我們可以點擊HR經理意見區左邊的第一個小圖標,設置該區段的查看人為人力資源部和總裁辦。第三步:設置起草節點的權限需求:起草節點不能修改“部門經理填寫區”和“HR經理填寫區”的內容。操作:切換到“流程場景 起草節點”場景,將所有區段設置為閱讀權限,如下圖:小技巧:在流程場景中,權限區段會出現第三個小圖標:隨默認權限。由于這幾個區段的默認權限
18、都是閱讀權限,所以我們可以將第三個圖標點亮,這樣,將來修改默認權限的時候,起草節點的權限也會隨之改變,減少維護工作量。第四步:設置“部門經理審批”節點權限需求:部門經理可以填寫“部門經理填寫區”的內容。操作:切換到“流程場景 部門經理審批”場景,將“部門經理填寫區”的權限修改為編輯。第五步:設置“HR人事經理審批”節點權限需求:HR經理可以填寫“HR經理填寫區” 和“HR經理意見區”的內容。操作:切換到“流程場景 HR人事經理審批”場景,將“HR經理填寫區”和“HR經理意見區”的權限修改為編輯。 案例總結從上面的案例,總結一下權限設置的思路:1、 在EKP的標準應用中,所有的字段
19、都是起草節點可編輯,審批節點不可編輯。2、 即使您插入了一個權限區段,這個權限區段默認的設置也遵循上一條規則。3、 您可以通過切換場景的方式,對特殊的場景加以描述,滿足實際的需求。如切換到起草節點場景,將區段的權限設定為閱讀,切換到某個審批節點場景,將某個區段設定為編輯。另外:1、 通過修改“默認權限”的場景,您可以修改所有場景的默認權限狀態,包括流程結束后的狀態。2、 通過修改可閱讀者,您可以限制某個區段的可閱讀者范圍(為空則不約束可閱讀者范圍),可閱讀者僅僅是對閱讀權限的擴充,編輯和隱藏權限不受此范圍影響。可閱讀者將作用于所有的場景。3、 權限區段可以控制單個字段(如:“HR經理意見區”)
20、,也可以控制整個表格(如:“HR經理填寫區”)。4、 權限區段是可以進行嵌套的,在上面的案例中,“HR經理意見區”就嵌入在了“HR經理填寫區”里面,若“HR經理填寫區”不可見,那“HR經理意見區”也相應的隱藏了,但“HR經理填寫區”一旦可見,那“HR經理意見區”的具體權限就由該區段的設置決定。 明細表的權限控制我們來看兩個例子:案例1:由于明細表的行是動態添加的,所以當權限區段設定在某個字段的時候,該權限將擴展到明細表的該列的所有同類字段。從上面的案例看,您可以編輯明細表中所有行的“采購數量”字段。案例2:同樣的明細表,但這次我們把權限區段擴展到了整個明細表,這時候,您除了可以編
21、輯明細表的所有字段外,還可以進行增加、刪除、移動行的操作。3.2 表單自定義的版本功能當您對一份已經定義好的表單進行了修改,再次保存的時候會彈出以下提示框:雖然版本號沒有在界面中進行體現,為了描述的方便,我還是加上版本號進行說明。假如該表單第一次保存的時候,版本號為V1,然后進行了一次修改,選擇了保存為新版本,這時候版本號為V2,現在又做了一次修改,最新版本的版本號為V3。表單展現的情況如下表:執行操作基于V1創建的文檔基于V2創建的文檔保存為新版本使用V1表單使用V2表單保存為原版本使用V1表單使用V3表單當然,以后新建的文檔都會基于V3創建。舉個例子:我們在自定義表單中定義了一個名字為“金
22、額”的字段,然后創建了一份文檔A,接下來我們對表單進行修改,將“金額”字段修改為“報銷金額”,這時候,若我們執行的操作是“保存為新版本”,那打開文檔A看到的還是“金額”這個名字,但若我們執行的操作是“保存為原版本”,那打開文檔A看到的就是“報銷金額”這個名字。一個不能保存為原版本的案例:我們在自定義表單里面定義了一個名字為“金額”的字段,由于一開始的疏忽,所以將金額的字段設置成了字符串類型,結果在創建文檔的時候,不少用戶可能就在金額字段里面直接寫入了“10萬”、“10萬元”這樣的數據。后面我們發現這個金額字段無法用于計算,于是我們期望把金額字段修改為數字類型,在輸入框后面,我們再加了個“萬元”
23、作為單位,提醒用戶的輸入,若此時保存為原版本,那系統在打開舊文檔的時候,會將“10萬”這樣的數據轉換成數字類型,這種轉換明顯是無法成功的,系統只能拋出錯誤,在這種情況下,只能通過“保存為新版本”方式進行保存。綜上所述:當您期望所做的修改對于舊文檔生效的時候,執行“保存為原版本”的操作,否則執行“保存為新版本”的操作,然而當您對數據進行了類型變化的時候,建議還是“保存為新版本”,以便兼容舊數據。3.3 理解表單自定義的數據存儲溫馨提醒:本章節內容需要有一定編程技術。3.3.1 表單自定義數據存儲方式介紹在默認的情況下,表單的數據將以XML(詳見3.3.2章節)的方式,存儲到主文檔的表中。這種存儲
24、方式雖然為可以保證表單的變動不會影響到數據庫表結構,但同時也帶來了查詢的困難。具體的內容詳見3.3.2章節。為了解決查詢的問題,表單自定義提供了另外一種存儲的擴展:表單數據映射(詳見3.3.3章節)。表單數據映射允許您將表單的字段跟EKP-J使用的關系數據庫的某張表的字段一一對應,從而解決了數據的查詢問題。表單數據映射是應查詢的需求而產生的,所以加了與EKP-J同一數據庫的限制。為了突破這個限制,系統還提供了另外兩種擴展:表單存儲事件(詳見4.1章節)和流程機器人節點(詳見流程寶典相關章節),這兩種方式可以通過編程或寫SQL語句的方式,往異構系統或其它數據庫中寫入表單數據。其中表單存儲事件是隨
25、表單保存觸發的,必須通過編程方式實現;流程機器人節點則在流程流轉過程中觸發,適用于在某種特定條件下寫入數據的場景,流程機器人節點可以使用編程或SQL語句方式,往其它系統中寫入表單數據。3.3.2 默認存儲方式:XML表單自定義的數據始終會在主文檔表中一個大文本字段中以XML的格式保存。為了方便數據的讀寫,系統提供了“erfaces.ISysMetadataParser”接口,屏蔽了對XML數據操作的復雜性,具體的操作可參閱“擴展表單自定義中的存儲事件”章節的案例。3.3.3 表單數據映射前面我們已經知道,表單數據映射是為查詢而產
26、生的需求。通過表單映射,我們可以方便地通過SQL語句,查詢到表單自定義中的數據,并進行統計分析。此外,EKP-J將來會推出自定義表單數據的查詢功能,可以查詢到表單中進行了數據映射的字段。什么樣的數據適合做數據映射?一般的,當我們需要進行查詢統計的數據,建議進行數據映射。比如:報銷總額、所屬區域等。對一些描述性的字段,如:出差原因等,不建議做數據映射。雖然數據映射可以方便查詢,但一旦將數據寫入到數據庫表中,就會受到數據庫的字段類型、長度等約束,為數據的修改帶來很大的困難,所以建議針對“合適”的字段進行映射,對于可能經常發生變動的字段,不做數據映射。如何做數據映射?案例:將一個項目報銷單的所有字段
27、進行數據映射。報銷單如下:其中,項目成員是多值字段,是多對多的關系。步驟:1、 我們得在數據庫中創建表,由于上面的表單中有明細表,還有一個多對多的字段,所以我們需要創建三張表來進行數據映射,表結構如下:主表:cf_project_cost字段描述字段名字段類型備注主鍵fd_idvchar(36)唯一主鍵,跟主文檔ID對應項目名稱fd_namevchar(200)項目經理fd_manager_idvchar(36)存儲人員的ID,可以設置為外鍵,連接到sys_org_element的fd_id報銷時間fd_timetimestamp報銷金額fd_moneydouble項目成員多對多表:cf_pr
28、oject_menber字段描述字段名字段類型備注主文檔IDfd_main_idvchar(36)主鍵+外鍵,存儲主文檔的ID,關聯到cf_project_cost的fd_id字段項目成員IDfd_member_idvchar(36)主鍵+外鍵,存儲項目成員的ID,關聯到sys_org_element的fd_id字段報銷明細表:cf_project_cost_detail字段描述字段名字段類型備注主鍵fd_idvchar(36)唯一主鍵主文檔IDfd_main_idvchar(36)外鍵,存儲主文檔ID,連接到cf_project_cost的fd_id字段細項名稱fd_item_namevch
29、ar(200)報銷金額fd_moneydouble2、 進入表單自定義所在模板的閱讀界面,點擊“表單數據映射”按鈕,進行數據映射,具體操作步驟略。整個操作中比較麻煩的是建表的動作,上述的案例中,已經包含了字符型、數字型、日期型、組織架構(單值、多值)、明細表字段的建表。在后續的流程表單版本中,會提供自動創建表結構的功能,您只需要在IE界面里面填寫表名和字段名,系統會自動幫您在數據庫中創建相應的表結構。由于數據庫對字段的類型和長度的管理非常嚴格,刪除字段、修改字段類型或長度這些操作可能會導致數據的丟失問題,所以系統不提供刪除字段、修改字段類型或長度的功能,若需要執行這些操作,只能是到數據庫中直接
30、操作數據庫了。3.4 使用表單自定義的高級控件3.4.1 使用前端計算控件前端計算控件一般用來做前端的簡單計算,如:總額=單價*數量,當單價和數量發生改變的時候,總額將馬上重新計算。雖然前端計算控件的公式跟公式定義器非常類似,但相比起公式定義器來說,前端計算控件的功能要弱很多:參與計算的值只能是日期型和數字型的值(對于日期型的數據,系統會自動轉換成毫秒數),而且返回的結果也只能是數字類型的值。但由于前端計算控件能即時地將運算結果展現給最終用戶,而公式定義器只能在數據提交后才能計算,所以前端計算控件給最終用戶帶來了更好的體驗。前端計算控件的語法完全是JavaScript的語法,不過即使您對Jav
31、aScript語法不熟悉,您同樣可以使用里面的簡單功能。案例1:使用前端計算控件,計算開始時間和結束時間的時間差,返回天數。( $結束時間$ - $開始時間$ ) / ( 1000 * 3600 * 24 )說明:開始時間和結束時間在公式運算時會轉換成毫秒,所以兩者相減就是時間差,單位為毫秒,再轉換為天就可以了。案例2:下面是一個采購申請單的樣例,使用了明細表控件。其中:小計=單價*數量,總額為所有小計的總和。根據上面的要求,小計字段的計算表達式:$明細表1.單價$*$明細表1.數量$總額字段的計算表達式:$列表.求總和$($明細表1.小計$)要理解這兩個公式,首先得理解運行的上下文。第一個公
32、式,小計字段是在明細表里面的,所以“$明細表1.單價$”的值取的是同一行記錄中的單價字段,是單值。第二個公式,總額字段是在明細表外面的,所以“$明細表1.小計$”的取值不是針對單行記錄而言,是針對所有記錄而言,是多值。故通過“$列表.求總和$()”函數可以將所有的小計進行求和。這個案例摘自公式定義器寶典,其實前端計算控件的語法和原理基本上一樣,只是小計和總額的控件換成前端計算控件而已。案例3:表單中有個分數的字段,期望通過分數自動計算出等級,等級和分數的對應關系為:90100:等級18090:等級26080:等級34060:等級440以下:等級5表達式:function()if ( $分數$&
33、gt;=90 )return 1;if ( $分數$>=80 )return 2;if ( $分數$>=60 )return 3;if ( $分數$>=40 )return 4;return 5;()其實這就是一段簡單的JavaScript,外面套一層function()()是為了能寫return語句。3.4.2 JSP片段和隱藏字段簡介小提示:在表單自定義的操作按鈕區中點擊,就可以看到JSP控件和隱藏字段的按鈕。表單中的大部分控件都是面向非程序員設計的,這些控件是無法寫代碼的,但有些復雜的業務需求只能通過寫部分代碼來實現。為了解決這個問題,表單自定義提供了一個JSP片段的控
34、件,允許您在表單中寫入JSP代碼,系統會將您的這些代碼原封不動地放在最終展現的JSP頁面中。理論上,您可以通過JSP片段的功能,實現任何界面編程能實現的功能。表單自定義中的每個字段都會有名字和類型。雖然您可以通過JSP片段來定義一個界面里面無法實現的字段,但由于JSP片段是直接交由J2EE容器解釋的,所以我們無法辨別您在表單中定義了什么樣的字段,字段的類型是什么,也就導致了這些字段無法正常保存,也無法正常參與公式運算。隱藏字段正是為了這個矛盾而設計的,隱藏字段不會在最終的JSP中生成任何代碼,但它可以告訴系統有這個字段,字段的類型是什么,剛好擬補了前面提到的不足。通過JSP片段+隱藏字段,您就
35、可以方便地對擴展界面的字段了。3.4.3 在JSP片段中編寫JavaScript 溫馨提醒:本小節需要有一定的EKP-J的開發基礎。 JSP片段中的JavaScript簡介既然JSP片段是將代碼原封不動地輸出到最終的JSP頁面中,所以您可以借助JSP片段來編寫JavaScript代碼。在大部分情況下,您可以通過事件的方式觸發您的JS代碼,常用的事件捕獲的方法有:JS代碼樣例說明Com_AddEventListener(window, "load",function()alert("window加載事件"););在窗口加載的時候觸發事件。Co
36、m_Parameter.event"submit".push(function()alert("表單提交事件");return true;);表單提交事件,您可以在這里編寫數據校驗的方法,返回false則阻止表單正常提交。XFormOnValueChangeFuns.push(function(value, domElement)alert("字段值變化事件"););當任意字段值發生變化的時候觸發,您可以通過domElement對象獲取到發生變化的字段對象(若為checkbox或radio時候為dom數組),通過value獲取到改變后
37、的值。AttachXFormValueChangeEventById("字段ID", function(value, domElement)alert("指定字段值變化事件"););當id為“字段ID”的字段的值發生變化的時候,觸發該事件,比上一個方法更加常用。此外,表單自定義為您提供了一系列實用的JavaScript函數,您可以通過點擊JSP片段輸入框右下角的按鈕,查看這些函數的說明。某些JavaScript可能需要在編輯狀態下加載,另外一些可能需要在閱讀狀態下加載,遇到這種情況,請使用xform:editShow標簽或xform:viewShow標簽
38、。如:<xform:editShow><script>alert("這段代碼僅在編輯狀態下加載");</script></xform:editShow><xform:viewShow><script>alert("這段代碼僅在閱讀狀態下加載");</script></xform:viewShow> 案例1:根據值變化禁用某個字段需求:在一個出差申請單中,有個字段是“是否需要訂酒店”的字段,若需要訂酒店,則“酒店名稱”可以輸入,為必填項,否則“酒店
39、名稱”不可填。實現:表單定義如下:其中,是否需要訂酒店ID為“fd_2d964215788088”,酒店名稱ID為“fd_2d96478e3ae0b0”。JSP片段代碼如下:<script>function changeHotelEnabled()var fields = GetXFormFieldById("fd_2d964215788088");if(fields.length=0)return;GetXFormFieldById("fd_2d96478e3ae0b0")0.disabled = fields1.checked;Com_A
40、ddEventListener(window, "load", changeHotelEnabled);AttachXFormValueChangeEventById("fd_2d964215788088", changeHotelEnabled);</script>說明:上面代碼中,定義了一個changeHotelEnabled的函數,該函數判斷若“否需要訂酒店”的字段存在(注意:閱讀狀態下該字段對象會不存在),若存在則修改“酒店名稱”的disabled屬性。其中,函數GetXFormFieldById返回的值為數組。通過Com_AddEv
41、entListener函數將處理方法綁定到頁面加載事件中,通過AttachXFormValueChangeEventById函數綁定到“否需要訂酒店”的值改變事件中。 案例2:獲取明細表中的字段需求:在明細表中,小計=單價*數量,合計=小計的總和,表單樣例如下:實現:其實這個功能可以通過前端計算控件非常容易地實現,但我們現在通過JSP片段的JS來實現這個功能。幾個字段的ID為:單價:fd_2d964f6ba33a40數量:fd_2d964f6cf8747c小計:fd_2d964f6e658cfa合計:fd_2d964f77cd6c6eJSP片段的代碼如下:<script&g
42、t;function changeMoney(value, domElement)/同一行的小計var subtotalField = GetXFormSameRowFieldById(domElement, "fd_2d964f6e658cfa")0;/同一行的單價var priceField = GetXFormSameRowFieldById(domElement, "fd_2d964f6ba33a40")0;/同一行的數量var quantityField = GetXFormSameRowFieldById(domElement, "
43、fd_2d964f6cf8747c")0;subtotalField.value = priceField.value * quantityField.value;/所有行小計var subtotalFields = GetXFormFieldById("fd_2d964f6e658cfa");var sum = 0;for(var i=0; i<subtotalFields.length; i+)sum += subtotalFieldsi.value;/合計var totalField = GetXFormFieldById("fd_2d964
44、f77cd6c6e")0;totalField.value = sum;AttachXFormValueChangeEventById("fd_2d964f6ba33a40", changeMoney);AttachXFormValueChangeEventById("fd_2d964f6cf8747c", changeMoney);</script>說明:GetXFormSameRowFieldById獲取跟發生變化的元素的同一行指定id的字段。GetXFormFieldById則獲取所有行的字段。通過AttachXFormVal
45、ueChangeEventById綁定單價和數量兩個字段改變的事件。注意:JSP片段的位置(見圖片),請不要將JSP片段寫入到明細表的第二行(即動態行)!3.4.4 使用JSP片段擴展字段溫馨提醒:本小節需要有一定的EKP-J的開發基礎。 案例1:從數據庫中獲取下拉選擇框選項需求:表單中需要定義一個區域的字段,該字段為一個下拉選擇框,選項來自客戶的另外一套CRM系統,CRM系統給我們暴露了一個表,我們可以直接通過SQL語句查詢到相關數據。實現:1、 創建數據源由于需要訪問到其它數據庫的表,所以我們需要配置一個名稱為“CRM”的數據源,配置地方見下圖。2、 創建隱藏字段,拷貝隱藏字
46、段的ID,供后面使用3、 在隱藏字段右邊創建一個JSP片段控件,在里面插入代碼:<xform:select property="extendDataFormInfo.value(fd_2d93229a39f4f0)" subject="區域" required="false" showPleaseSelect="true"><xform:SQLDataSource dbConnect="CRM" sql="select fd_key, fd_name from tb_
47、area" /></xform:select>說明:在xform:select的property屬性中將ID粘貼進來。xform:SQLDataSource為select提供了選項數據,sql語句的返回值中,第一個值為選項id,第二個值為選項名字(可不返回第二個值,說明id和名字一致),忽略后面的值。xform標簽的詳細參數,請查閱xform標簽的使用幫助手冊。 案例2:使用對話選擇框需求:在另外一個模塊中已經定義了項目信息,我們需要在表單自定義中定義一個“所屬項目”的字段,該字段能夠通過選擇按鈕選擇到項目信息。分析:要保存所屬項目信息,我們需要借助一
48、個不顯示的字段來保存項目的ID,再需要一個顯示的字段來保存項目的名稱,此外,還需要一個超鏈接,點擊后彈出項目現在框。實現:1、 創建一個“所屬項目ID”的字段,去掉“顯示”的選項,如下圖:2、 創建一個“所屬項目”的字段,勾中“只讀”,如下圖:3、 創建一個JSP片段,在片段中輸入代碼:<xform:editShow><a href="#" onclick="Dialog_Tree(false,'extendDataFormInfo.value(fd_2d963561b5d04e)','extendDataFormInfo
49、.value(fd_2d963562c51f28)',null,'kmProjectMainTree&parentId=!value','項目信息');">選擇</a></xform:editShow>說明:這里加入了xform:editShow標簽,是為了讓選擇按鈕僅在編輯狀態下顯示,而不在閱讀狀態下顯示。函數Dialog_Tree是EKP-J中標準的對話框的JS調用,就不在此多加描述了。 案例3:明細表中的JSP片段需求:同案例1的需求,只是將下拉選擇框放入到明細表中。實現:假設我們已經完
50、成了案例1的所有步驟。接下來,我們創建一個明細表,并將案例1中定義好的隱藏字段和JSP片段拖動到明細表中。接下來我們需要對JSP片段進行一些小修改,在此之前,我們需要獲取到明細表的ID,為此,我們可以打開控件樹,雙擊明細表控件,查看明細表,查看明細表控件屬性,將ID記錄下來,如下圖:修改JSP片段代碼,如下:<xform:select property="extendDataFormInfo.value(fd_2d962d7b322e5e.!index.fd_2d93229a39f4f0)" subject="區域" required="
51、false" showPleaseSelect="true"><xform:SQLDataSource dbConnect="CRM" sql="select fd_key, fd_name from tb_area" /></xform:select>說明:在明細表中編寫JSP片段,字段的property屬性格式應該修改為:“extendDataFormInfo.value(明細表ID.!index.字段ID)”其余的地方跟不在明細表一樣。另外,不建議在明細表中添加JavaScript代碼,因
52、為明細表添加行的時候,會動態將每行的信息進行復制,若添加了JavaScript代碼可能會導致運行時的錯誤。3.4.5 控制JSP片段的權限若您還不了解表單自定義如何控制字段級權限,請查閱“控制表單字段級權限”章節。表單自定義中字段級的權限是通過權限區段進行控制的,因此若您可以將JSP片段放入權限區段中,那JSP片段也將受到權限的控制。權限區段可以控制整個區段的隱藏、閱讀和編輯三種權限。當區段的權限為隱藏的時候,整個JSP片段將不輸出到頁面中;當區段的權限為閱讀或編輯的時候,JSP片段會完整地輸出到頁面中。所以,進一步的閱讀和編輯權限需要在JSP片段代碼中進行控制。對于xform標簽的定義的控件
53、,如案例1中的xform:select等,xform標簽在輸出的時候自動依據權限輸出閱讀狀態或編輯狀態的HTML。對于無法使用xform標簽的地方,如:3.4.3中的JavaScript代碼,還有中的選擇超鏈等,我們可以使用以下標簽,區分編輯或閱讀狀態下需要顯示的代碼:<xform:editShow><%- 在這里編寫僅編輯狀態下使用的代碼 -%></xform:editShow><xform:viewShow><%- 在這里編寫僅閱讀狀態下使用的代碼 -%></xform:viewShow>第四章 擴展表單
54、自定義溫馨提醒:本章節內容需要有一定的EKP-J的開發基礎。4.1 擴展表單自定義中的存儲事件4.1.1 表單自定義的存儲事件簡介表單自定義提供了四個觸發事件,您可以通過編寫代碼的方式,在這四個事件觸發的時候執行您的代碼程序。事件名稱事件描述onInit初始化事件,在表單的所有初始值初始化完畢后觸發。onAdd添加事件,在表單數據第一次寫入數據庫時觸發。onUpdate更新事件,在表單除第一次寫入數據庫外其它更新數據時觸發。onDelete刪除事件,在表單數據即將被刪除之前觸發。4.1.2 一個綜合案例 需求描述客戶現有一個銷售訂單管理的系統,由于該系統的流程功能相對比較弱,所以
55、期望對與某些訂單,能夠啟用EKP-J的流程進行流轉。啟動流程時會將銷售訂單號傳遞過來,并期望能通過訂單號獲取到訂單的相關信息。在流程審批通過以后能將一些結果數據寫回到銷售訂單系統中。表單的樣例如下:訂單號:啟動流程時傳遞。客戶名稱、訂單日期、產品名稱、原價、購買數量:根據訂單號從銷售訂單系統獲取。銷售人員默認為當前用戶,實際購買價格默認等于原價。實際購買價格可以在流轉中填寫,審批通過后寫回銷售訂單管理系統。 思路分析這是一個系統整合的需求,若需要從后臺啟動一個流程,那難度有點高,可以通過另外一種簡單的方式實現客戶需求。首先,在EKP-J的審批流程模塊中,定義一個銷售訂單審批的模板,假設通過該模板創建一個審批文檔的URL為:接下來,我們需要改造一下客戶的訂單系統,當某個銷售訂單需要啟動流程的時候,出現一個按鈕,點擊按鈕后,跳轉到:&orderNum=123
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備耗材儲備管理制度
- 設計公司費用管理制度
- 證書補貼規定管理制度
- 診所醫患溝通管理制度
- 診所藥品儲存管理制度
- 試劑耗材存貨管理制度
- 財務統計制度管理制度
- 貨物交接環節管理制度
- 貨車出車日常管理制度
- 2025年中國單色眼影行業市場全景分析及前景機遇研判報告
- NY-T 3213-2023 植保無人駕駛航空器 質量評價技術規范
- 2023年春季內蒙古高一化學學業水平合格性考試卷真題
- 5A景區規劃方案
- 機械制圖教案(完整版)
- 工業互聯網與智能制造
- 司母戊鼎的介紹
- 肺炎衣原體醫學課件
- 2024年兒童童車行業分析報告及未來發展趨勢
- 23秋國家開放大學《漢語基礎》期末大作業(課程論文)參考答案
- 《公務接待》課件
- 中醫內科學消渴課件
評論
0/150
提交評論