本帖最后由 cgft 于 2017-4-7 11:24 编辑
三、解决方案
插件由运行在客户端的前台程序和运行于服务器端的后台程序两部分组成。
(一)前台程序
采用JavaScript语言编写插件的前台程序: 1. 充分利用OA系统提供的函数、表单对象和js变量,与工作流程序实现无缝衔接(参见图1的下半段,工作流运行代码)。 2. 使用jQuery元素选择器,依据id识别源动控件,确保插件的通用性。 见图2,源动控件在表单的源代码中,其name被指定为“DATA_4”。由于每个表单,源动控件的name值会依据设计顺序的不同而不同,为了插件的通用性,应该为控件指定一个特定的元素加以标记。本插件要求人为地对源动控件增加一个id元素,并约定如下: ⑴ “工作名称/文号”的内容仅与源动控件里的值同步,则源动控件的id="Edit_RunName0"。表单源代码形如图5。
图5
⑵ “工作名称/文号”的内容等于文号表达式生成的值+源动控件里的值,则源动控件的id="Edit_RunName"。表单源代码形如图6。
图6
3. 绑定事件。无论源动控件为何种类型,如要修改则先需获得焦点,因此选用绑定blur事件是较为合理的。 4. 文号表达式生成的原始值的读取。工作流的文号表达式生成的原始值(本例中即“发文[2017-74]”),保存在系统的MySQL数据库的工作流实例表的run_name字段中。表名可通过对系统运行时的js变量g_flow_id进行组合而获得;数据则通过系统运行时的js变量g_run_id关联实例表的run_id 字段,采用jQuery的Ajax方法,向服务器发送加载远程数据的异步请求而获得。代码如下: $.ajax({ url:"/general/workflow/plugin/aerosun/getRunName.php", data:{"RUN_ID":g_run_id,"FLOW_ID":g_flow_id}, type:"POST", async:true, success:function(data){ $("#Symbol",window.parent.document).val(data+MyRunName); $("#run_id_block",window.parent.document).html(g_run_id+""+data+MyRunName); } }); 5. 前台程序还负责识别当前步骤是否允许修改“工作名称/文号”并保证图2的箭头1所指之处的控件为只读状态。 6. 前台程序的调用,通过在表单的源代码中用JavaScript代码添写一条引入外部js文件的语句来实现。见图7.
图7
(二)后台程序 采用PHP语言编写插件的后台程序,负责接收Ajax发出的查询请求,并将查询结果返回jQuery处理。如图3或图4所示,由前台的jQuery在图2的箭头1所指之处即时显示。 |