基於UEditor上開發的表單設計器--自定義文本控件

Actviti的流程功能已經很強大,但其表單的部分還是弱弱的,因此,在後續的文章中,我們會逐步通過一些開源以及商業的UI工具逐步加強這塊。儘管流程審批中的表單需要與第三方的數據進行交互,在我看來,這些都是流程的攜帶的數據模型,可以不用搞得太複雜,流程實例只需要管理與自己關聯的流程實例數據即可,而對於這些數據的來源及交互,只需要由流程的數據模型來執行即可,這就可以有效劃分了流程定義與表單的數據的職責問題,而審批的表單則由UI層結合流程的數據模型進行展示。在本文中我們不打算對這塊功能進行討論與分析其實現方案,本文目前只是談如何通過在線自定義數據的UI,即可以理解爲表單如何定義。

關於表單的展示,目前市面上有比較多的UI框架,包括開源與商用的。本文只討論近期我在一項目上採用的MiniUI,這個框架還是比較不錯,其原理是通過轉化html中帶有MINI-UI樣式的控件,本文則着重講解如何在UEditor中自定義mini控件。

儘管UEditor功能已經很強大了,但是有時候我們還是需要開發自己的插件,今天有時間就自己搞了下,發現還是挺簡單的,有需要的同學可以參考下,我使用的UEditor版本是1.4.3的。

 

步驟一

ueditor下增加form-design文件夾,如下所示:



 同時增加design-plugin.js,增加config目錄用來放置開發控件的屬性頁面,css下放工具欄的按鈕圖標及樣式,在本示例中,我們在該目錄images放置textfield.png圖標,同時在toolbars.css下定義樣式如

 

Html代碼  收藏代碼

  1. .textfield{  

  2.     background: url(images/textfield.png) no-repeat;  

  3. }  

 

 

步驟二

爲了不影響舊的ueditor,複製ueditor.all.js文件更名爲ueditor-fd.all.js,複製ueditor.config.js文件,更名爲ueditor-fd-config.js

步驟三

ueditor-fd-config.jstoolbars參數,新增一個字符串min-textbox,同時新增一個labelMap用於

鼠標移入顯示該控件的描述。如下所示:

 

        , toolbars: [[
            ......,print', 'preview', 'searchreplace', 'help'
            //, 'drafts' 從草稿箱加載
            //新增自定義按鈕
            ,'mini-textbox'
        ]]

 

找到ueditor文件夾下的ueditor-fd.all.jsbtnCmds數組,添加字符串'mini-textbox'

這個時候刷新頁面就可以在help按鈕後面新增了一個按鈕,但是按鈕的圖標顯示的是B(默認的樣式)

 

Html代碼  收藏代碼

  1. .edui-for-mini-textbox .edui-icon{  

  2.         background-position:-200px -40px;  

  3. }  

 

 

 

再定義其工具欄上按鈕的樣式圖標,進入ueditor文件夾下的themes文件夾下的default文件夾下的css文件夾下的ueditor.css,在文件的末尾加上如下css:
在本示例中,我們把這些工具欄的按鈕定義在Ueditor的外面,所以本步驟可以省略

步驟四


UEditor中註冊我們的插件,在form-design目錄下增加design-plugin.js,並且編寫如下代碼


Js代碼  收藏代碼

  1. //基礎目錄  

  2. UE.FormDesignBaseUrl = 'form-design';  

  3. //文本控制器  

  4. UE.plugins['mini-textbox'] = function () {  

  5.     var me = this,thePlugins = 'mini-textbox';  

  6.     me.commands[thePlugins] = {  

  7.         execCommand:function () {  

  8.             var dialog = new UE.ui.Dialog({  

  9.                 iframeUrl:this.options.UEDITOR_HOME_URL + UE.FormDesignBaseUrl+'/config/mini-textbox.html',  

  10.                 name:thePlugins,  

  11.                 editor:this,  

  12.                 title: '文本框',  

  13.                 c***ules:"width:600px;height:380px;",  

  14.                 buttons:[  

  15.                 {  

  16.                     className:'edui-okbutton',  

  17.                     label:'確定',  

  18.                     onclick:function () {  

  19.                         dialog.close(true);  

  20.                     }  

  21.                 },  

  22.                 {  

  23.                     className:'edui-cancelbutton',  

  24.                     label:'取消',  

  25.                     onclick:function () {  

  26.                         dialog.close(false);  

  27.                     }  

  28.                 }]  

  29.             });  

  30.             dialog.render();  

  31.             dialog.open();  

  32.         }  

  33.     };  

  34.     var popup = new baidu.editor.ui.Popup( {  

  35.         editor:this,  

  36.         content: '',  

  37.         className: 'edui-bubble',  

  38.         _edittext: function () {  

  39.               baidu.editor.plugins[thePlugins].editdom = popup.anchorEl;  

  40.               me.execCommand(thePlugins);  

  41.               this.hide();  

  42.         },  

  43.         _delete:function(){  

  44.             if( window.confirm('確認刪除該控件嗎?') ) {  

  45.                 baidu.editor.dom.domUtils.remove(this.anchorEl,false);  

  46.             }  

  47.             this.hide();  

  48.         }  

  49.     } );  

  50.     popup.render();  

  51.     me.addListener( 'mouseover'function( t, evt ) {  

  52.         evt = evt || window.event;  

  53.         var el = evt.target || evt.srcElement;  

  54.         var leipiPlugins = el.getAttribute('plugins');  

  55.         if ( /input/ig.test( el.tagName ) && leipiPlugins==thePlugins) {  

  56.             var html = popup.formatHtml(  

  57.                 '<nobr>文本框: <span onclick=

    ._edittext() class="edui-clickable">編輯</span>&nbsp;&nbsp;<span onclick=

    ._delete() class="edui-clickable">刪除</span></nobr>' );  

  58.             if ( html ) {  

  59.                 popup.getDom( 'content' ).innerHTML = html;  

  60.                 popup.anchorEl = el;  

  61.                 popup.showAnchor( popup.anchorEl );  

  62.             } else {  

  63.                 popup.hide();  

  64.             }  

  65.         }  

  66.     });  

  67. };  

 

以上有一個地方是當使用該插件時,會彈出編輯框編輯我們的自定義屬性,這是config/mini-textbox.html的代碼定義,如下:


Html代碼  收藏代碼

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  2. <html>  

  3. <head>  

  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  5.         <title>MINI-TextField</title>  

  6.         <script src="../../../boot.js" type="text/javascript"></script>  

  7.         <script type="text/javascript" src="../../dialogs/internal.js"></script>  

  8.         <link href="../../../../styles/form.css" rel="stylesheet" type="text/css" />  

  9. </head>  

  10. <body>  

  11.     <form id="miniForm">  

  12.         <table class="table-detail" cellspacing="1" cellpadding="0">  

  13.             <caption>文本框基礎屬性</caption>  

  14.             <tr>  

  15.                 <th>字段屬性*</th>  

  16.                 <td>  

  17.                     <input class="mini-textbox" name="name" id="name" required="true" vtype="maxLength:80" style="width:90%"/>  

  18.                 </td>  

  19.                 <th>必填*</th>  

  20.                 <td>  

  21.                     <input class="mini-checkbox" name="isRequired" id="isRequired"/>是  

  22.                 </td>  

  23.             </tr>  

  24.         </table>  

  25.     </form>  

  26.     <script type="text/javascript">  

  27.       

  28.         function createElement(type, name){       

  29.             var element = null;       

  30.             try {          

  31.                 element = document.createElement('<'+type+' name="'+name+'">');       

  32.             } catch (e) {}     

  33.             if(element==null) {       

  34.                 element = document.createElement(type);       

  35.                 element.name = name;       

  36.             }   

  37.             return element;       

  38.         }  

  39.           

  40.         mini.parse();  

  41.         var form=new mini.Form('miniForm');  

  42.         //編輯的控件的值  

  43.         var oNode = null,  

  44.         thePlugins = 'mini-textbox';  

  45.           

  46.         window.onload = function() {  

  47.             //若控件已經存在,則設置回調其值  

  48.             if( UE.plugins[thePlugins].editdom ){  

  49.                 //  

  50.                 oNode = UE.plugins[thePlugins].editdom;  

  51.                 //獲得字段名稱  

  52.                   

  53.                 var name = oNode.getAttribute('name');  

  54.                 var isRequried=oNode.getAttribute("required");  

  55.                 mini.get('name').setValue(name);  

  56.                 mini.get('isRequired').setValue(isRequried);  

  57.             }  

  58.         }  

  59.         //取消按鈕  

  60.         dialog.oncancel = function () {  

  61.             if( UE.plugins[thePlugins].editdom ) {  

  62.                 delete UE.plugins[thePlugins].editdom;  

  63.             }  

  64.         };  

  65.         //確認  

  66.         dialog.onok = function (){  

  67.             form.validate();  

  68.             if (form.isValid() == false) {  

  69.                 return false;  

  70.             }  

  71.             var name=mini.get('name').getValue();  

  72.             var isRequired=mini.get('isRequired').getValue();  

  73.               

  74.             //控件尚未存在,則創建新的控件,否則進行更新  

  75.             if( !oNode ) {  

  76.                 try {  

  77.                     oNode = createElement('input',name);  

  78.                     oNode.setAttribute('type','text');  

  79.                     oNode.setAttribute('class','mini-textbox');  

  80.                     oNode.setAttribute('required',isRequired);  

  81.                     //需要設置該屬性,否則沒有辦法其編輯及刪除的彈出菜單  

  82.                     oNode.setAttribute('plugins',thePlugins);  

  83.                     editor.execCommand('insertHtml',oNode.outerHTML);  

  84.                 } catch (e) {  

  85.                     try {  

  86.                         editor.execCommand('error');  

  87.                     } catch ( e ) {  

  88.                         alert('控件異常,請聯繫技術支持');  

  89.                     }  

  90.                     return false;  

  91.                 }  

  92.             } else {//已經存在,則更新屬性則可  

  93.                 oNode.setAttribute('title', name);  

  94.                 oNode.setAttribute('required', isRequired);  

  95.                 delete UE.plugins[thePlugins].editdom;  

  96.             }  

  97.         };  

  98.           

  99.     </script>  

  100. </body>  

  101. </html>  

  

步驟五:

在頁面中使用表單設計器示例,代碼如下所示:

Html代碼  收藏代碼

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  

  2. <%@include file="/commons/taglibs.jspf" %>  

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  4. <html>  

  5. <head>  

  6.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  7.         <title>MiniUI 的控件自定義</title>  

  8.         <%@include file="/commons/dynamic.jspf" %>  

  9.         <script src="${ctxPath}/scripts/boot.js" type="text/javascript"></script>   

  10.         <link href="${ctxPath}/scripts/ueditor/form-design/css/toolbars.css" rel="stylesheet" type="text/css" />  

  11.         <script type="text/javascript" charset="utf-8" src="${ctxPath}/scripts/ueditor/ueditor-fd-config.js"></script>  

  12.         <script type="text/javascript" charset="utf-8" src="${ctxPath}/scripts/ueditor/ueditor-fd.all.js"> </script>  

  13.         <script type="text/javascript" charset="utf-8" src="${ctxPath}/scripts/ueditor/lang/zh-cn/zh-cn.js"></script>  

  14.         <!-- 引入表單控件 -->  

  15.         <script type="text/javascript" charset="utf-8" src="${ctxPath}/scripts/ueditor/form-design/design-plugin.js"></script>  

  16. </head>  

  17. <body>  

  18.         <h2>表單設計器示例</h2>  

  19.           

  20.         <div class="mini-toolbar" style="padding:0px;">  

  21.             <table style="width:100%;">  

  22.                 <tr>  

  23.                     <td style="width:100%;">  

  24.                         <a class="mini-button" iconCls="textfield" plain="true" onclick="designer.execCommand('mini-textbox')">文本控件</a>  

  25.                     </td>  

  26.                 </tr>  

  27.           </table>  

  28.          </div>  

  29.        <script id="designer" type="text/plain" style="width:100%;height:500px;"></script>  

  30.   

  31.     <p>描述:  

  32.         <br/>  

  33.             表單設計器中的文本控件示例  

  34.         <br/>  

  35.     </p>  

  36.       

  37.     <script type="text/javascript">  

  38.      mini.parse();  

  39.      var designer = UE.getEditor('designer');  

  40.     </script>  

  41. </body>  

  42. </html>  

 示意圖:



 



 

 

 

 

成的html代碼爲:

<input name="code" type="text" class="mini-textbox" required="true" plugins="mini-textbox"/>

 

 

其他更多的控件屬性,請補充即可。


瞭解諮詢:1361783075


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章