Ext读取xml文件生成动态表格和表单

2009年10月22日 | 分类: JavaScript | 标签: ,

最近开发项目,需要动态读取xml文件,生成Ext界面,xml文件通过前台页面的按钮事件传进来,可以参照此文章:【javascript 弹出子窗口】
获取弹出窗口url后的参数方法:
// 获取url后的参数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getQueryStringValue(name) {
	var url = window.location.search;
	if (url.indexOf('?') < 0) {
		return null
	}
	var index = url.indexOf(name + "=");
	if (index < 0) {
		return null
	}
	var args = url.indexOf('&', index);
	var value;
	if (args > 0) {
		value = url.substring(index + name.length + 1, args);
	} else {
		value = url.substring(index + name.length + 1, url.length);
	}
	return value;
}
// 获取xml的服务器路径
function getXmlUrl(xmlFile) {
	return '../bjsasc_dictionary/' + getQueryStringValue('xmlFile');
}


用到的一些辅助方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 去掉Dom节点中的空白字符
function cleanWhitespaces(elem) {
	var elem = elem || document;
	var childElem = elem.childNodes;
	var childElemArray = new Array;
	for (var i = 0; i < childElem.length; i++) {
		if (childElem[i].nodeType == 1) {
			childElemArray.push(childElem[i]);
		}
	}
	return childElemArray;
}
// 取得父窗口表单中键值对
function getParentFormValues() {
	var formObj = window.opener.document.forms["frmMain"].elements;
	var formValues = "";
	for (var i = 0; i < formObj.elements.length; i++) {
		if (formObj.elements[i].value != null
				&& formObj.elements[i].value != ""
				&& formObj.elements[i].value.length != 0) {
			formValues += '_' + formObj.elements[i].name.toUpperCase() + '{'
					+ formObj.elements[i].value.toUpperCase() + '}'
					+ formObj.elements[i].name.toUpperCase() + '_ ';
		}
	}
	formValues += opener.getBindValue(formObj.elements);
	return formValues;
}
// 取得过滤条件表单的键值对
function getCondictionValues() {
	var condictionString = "";
	var formObj = form.getForm().getEl().dom;
	for (var i = 0; i < formObj.elements.length; i++) {
		if (formObj.elements[i].value != null
				&& formObj.elements[i].value != ""
				&& formObj.elements[i].value.length != 0) {
			condictionString += '_' + formObj.elements[i].name + '{'
					+ formObj.elements[i].value + '}'
					+ formObj.elements[i].name + '_ ';
		}
	}
	// alert("condictionString"+condictionString);
	return condictionString;
}
 
// 判读Ext表单是否有输入
function isFormInputed(ExtForm) {
	var flag = false;
	var formObj = ExtForm.getEl().dom;
	for (var i = 0; i < formObj.elements.length; i++) {
		if (formObj.elements[i].value != null
				&& formObj.elements[i].value != ""
				&& formObj.elements[i].value.length != 0) {
			flag = true;
			break;
		}
	}
	return flag;
}
 
// 将计算得到的结果四舍五入
/* * ForDight(Dight,How):数值格式化函数,Dight要 * 格式化的 数字,How要保留的小数位数。 */
function ForDight(Dight, How) {
	var Dight = Math.round(Dight * Math.pow(10, How)) / Math.pow(10, How);
	return Dight;
}

xml文件格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< ?xml version="1.0" encoding="gb2312"?>
<dictionary>
	<title>领用出库-物资选择</title>
	<sql>
	select V_stores_list.* 
	from V_stores_list where WHID='+$getform(WHID)+' AND PROJECTNO='+$getform(PROJECTNO)+' AND CANUSEQTY>0 AND ??? and isblock=0
	</sql>
	<fromtable>V_stores_list</fromtable>
	<targettable>BO_IC_EXPORT_S</targettable>
	<line>20</line>
	<!-- 条件区开始-->
	<condition>
		<fieldname>MTRNAME</fieldname>
		<fieldtitle>物资名称</fieldtitle>
		<fieldtype>文本</fieldtype>
		<comparetype>< ![CDATA[like]]></comparetype>
		<uiname>MTRNAME</uiname>
		<uidefault></uidefault>				
		<uicomponent>单行</uicomponent>
		<uiref>< ![CDATA[]]></uiref>		
	</condition>
 
	<field>
	<name>KEEPENDDATE</name>
	<nametype>日期</nametype>     
	<display>有效期截止日期</display>
	<width>1</width>
	<filter>true</filter>
	 <ishidden>true</ishidden>
	<targetname>KEEPENDDATE</targetname>
	</field>
</dictionary>

然后,弹出窗口页面Ext入口代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// 全局变量
var result = {};
var grid;
var form;
var viewport;
var store;
var sm = new Ext.grid.CheckboxSelectionModel();
var autoStore;
var tempItems1 = [];
var tempItems2 = [];
var tempItems3 = [];
var flag = 1;
// 程序入口
Ext.onReady(function() {
	Ext.QuickTips.init();// 初始化
	Ext.form.Field.prototype.msgTarget = 'qtip';// 统一指定错误信息提示方式
	Ext.util.CSS	.swapStyleSheet('theme', '../aws_js/extjs2/css/xtheme-gray.css');// 更换皮肤
	Ext.BLANK_IMAGE_URL = '../aws_js/extjs2/images/default/s.gif';
	Ext.Ajax.request({
		url : getXmlUrl(getQueryStringValue('xmlFile')), // 访问数据字典
		method : 'post',
		success : function(res, opt) {
			var xmlObj = res.responseXML;
			initStoreData(xmlObj); // 访问成功后执行后续工作
		}
	})
});
function initStoreData(xmlObj) {
	getInitData(xmlObj);
	document.title = result.winTitle;
 
	var dataRecorder = Ext.data.Record.create(result.gridRecords);// 指定记录集格式
	// 获取表格数据部分
	store = new Ext.data.Store({
		idProperty : 'ID',
		proxy : new Ext.data.HttpProxy({
			url : '../search.do?method=findAll',
			failure : function() {
				// Ext.Msg.alert("Notice", "网路问题");
			},
			success : function(response) {
				// Ext.Msg.alert("Notice", response.responseText);
			}
		}),
 
		// baseParams : {
		// parentFormValues : getParentFormValues(),// 请求发送的参数:父表单值和xml文件名
		// xmlFile : getQueryStringValue('xmlFile')
		// // cmd:'search'
		// },
		reader : new Ext.data.JsonReader({
			totalProperty : 'totalCount',
			root : 'data'
		}, dataRecorder)
	});
	// 要分页,第一次加载数据必须传start和limit两参数
	// store.load({
	// params : {
	// start : 0,
	// limit : result.limit
	// }
	// });
	initViewport();
}
// 获得界面初始化的一些数据
function getInitData(xmlObj) {
	// result.formItems = {};
	result.columnHeaders = [];
	result.gridRecords = [];
	result.dbFilterRecords = [];
	result.winTitle = xmlObj.getElementsByTagName("title")[0].firstChild.nodeValue; // 窗口title名称
	result.limit = xmlObj.getElementsByTagName("line")[0].firstChild.nodeValue;// 分页数据
	result.fromTable = xmlObj.getElementsByTagName("fromTable")[0].firstChild.nodeValue;// 来自哪个表
	// 获取过滤条件表单的界面数据
	var conections = xmlObj.getElementsByTagName("condition");
	var row = ForDight(conections.length / 3, 0);
	for (var i = 0; i < conections.length; i++) {
		var item = {};
		var condition = cleanWhitespaces(conections[i]);
		item.id = condition[0].firstChild.nodeValue;
		item.fieldLabel = condition[1].firstChild.nodeValue;
		item.name = condition[4].firstChild.nodeValue;
		item.anchor = '95%';
		if (condition[6].firstChild.nodeValue == '单行') {
			item.xtype = 'textfield';
		} else if (condition[6].firstChild.nodeValue == '日期') {
			item.xtype = 'datefield';
			item.format = 'Y-m-d';
		} else if (condition[6].firstChild.nodeValue == '数值') {
			item.xtype = 'numberfield';
			item.minValue = 0;
			item.minText = '请输入有效的数字';
			item.decimalPrecision = 6;
		} else if (condition[6].firstChild.nodeValue == '自动填充') {
			var autoStore = new Ext.data.SimpleStore({
				proxy : new Ext.data.HttpProxy({// 读取远程数据的代理
					url : '../ajax/autoComplete.do?method=autoComplete',
					failure : function() {
						Ext.Msg.alert("Notice", "no records");
					}
				}),
				fields : ['property'],
				baseParams : {
					'sqlString' : condition[4].firstChild.nodeValue + ' | '
							+ result.fromTable
				}
			});
			item.xtype = 'combo';
			item.store = autoStore;
			item.displayField = 'property';
			item.typeAhead = true;
			item.allQuery = 'all';// 查询信息的查询字符串
			item.queryParam = 'keyword';// 查询的名字
			item.mode = 'remote';
			item.minChars = 3;// 默认最少输入4
			item.forceSelection = true;
			item.queryDelay = 0;// 查询延迟时间
			item.triggerAction = 'all';
			item.emptyText = '';
			item.resizable = true;
			item.selectOnFocus = true;
		}
		if (i / row < 1) {
			tempItems1.push(item);
		}
		if (i / row < 2 && i / row >= 1) {
			tempItems2.push(item);
		} else if (i / row >= 2) {
			tempItems3.push(item);
		}
	}
	// alert(Ext.util.JSON.encode(result));
 
	// 获取表格表头的界面数据和rcord记录的数据格式
	var fields = xmlObj.getElementsByTagName("field");
	result.columnHeaders.push(sm);// 插入多选框
	result.columnHeaders.push(new Ext.grid.RowNumberer({
		width : 20
	}));// 插入行号
	for (var i = 0; i < fields.length; i++) {
		var item = {};
		var record = {};
		var array = [];
		var field = cleanWhitespaces(fields[i]);
		var renderDate = function(value) {
			return value ? value.dateFormat('Y-m-d') : '';
		}
		// 生成grid表格中store数据记录
		record.name = field[0].firstChild.nodeValue;
		record.mapping = field[0].firstChild.nodeValue;
		if (field[1].firstChild.nodeValue == '日期') {
			record.type = 'date';
			record.dateFormat = 'Y-m-d';
			item.renderer = Ext.util.Format.dateRenderer('Y-m-d')
		} else if (field[1].firstChild.nodeValue == '数值') {
			record.type = 'auto';
		} else {
			record.type = 'string';
		}
		result.gridRecords.push(record);
 
		// 生成grid表格表头数据记录
		item.dataIndex = field[0].firstChild.nodeValue;
		item.header = field[2].firstChild.nodeValue;
		// item.width=field[3].firstChild.nodeValue;
		item.sortable = true;
		if (field.length == 7
				&& field[5].firstChild.nodeValue.toUpperCase() == 'TRUE') {
			item.hidden = true;
			// item.hideable=false;
		}
		if (field.length == 6) {
			item.hidden = false;
		}
		result.columnHeaders.push(item);
 
		// 生成模糊过滤store的记录
		if (field[4].firstChild.nodeValue.toUpperCase() == 'TRUE') {
			array.push(field[2].firstChild.nodeValue);// fieldName
			array.push(field[0].firstChild.nodeValue);// fieldValue
		}
		result.dbFilterRecords.push(array);
	}
	return result;
};

渲染Ext界面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
function initViewport() {
	if (!form) {
		form = getInsertForm();
	}
 
	if (!grid) {
		grid = getInsertGrid();
	}
 
	if (!viewport) {
		var formPanel = new Ext.Panel({
			title : '查询条件',
			region : 'north',
			split : true,
			frame : true,
			border : true,
			layout : 'fit',
			height : 280,
			collapsible : true,
			items : [form]
 
		});
		viewport = new Ext.Viewport({
			layout : 'border',
			modal : true,// 是否为模式窗口
			border : false,
			items : [formPanel, grid]
		});
	}
}
 
function searchByFilter() {
	var dbfilter = Ext.get("dbFilter").getValue();
	var fieldMame = Ext.get("search-type").getValue();
	if (dbfilter == null || dbfilter == "") {
		alert("请输入一个关键字");
		Ext.get("dbFilter").focus();
	} else if (fieldMame == "==选择过滤字段==") {
		alert("请选择一个过滤字段");
		Ext.get("search-type").focus();
	} else {
		form.getForm().reset();
		if (flag == 1) {
			store.baseParams = {
				dbfilter : dbfilter,
				parentFormValues : getParentFormValues(),
				fieldMame : Ext.get("hiddenValue").dom.value,
				xmlFile : getQueryStringValue('xmlFile'),
				cmd : 'filter'
			};
			store.load({
				params : {
					start : 0,
					limit : result.limit
				}
			});
			form.getForm().reset();
			flag = 0;
		} else {
			store.baseParams = {
				dbfilter : dbfilter,
				parentFormValues : getParentFormValues(),
				fieldMame : Ext.get("hiddenValue").dom.value,
				xmlFile : getQueryStringValue('xmlFile'),
				cmd : 'filter'
			};
			store.reload();
 
		}
		Ext.get("dbFilter").dom.value = "";
	}
}
// 获取过滤条件部分的表单控件
function getInsertForm() {
	form = new Ext.form.FormPanel({
		name : 'frmMain',
		height : 260,
		labelAlign : 'left',
		labelWidth : 110,
		layout : 'fit',
		waitMsgTarget : true,
		items : [{
			xtype : 'fieldset',
			frame : true,
			title : '高级查询',
			autoHeight : true,
			layout : 'column',
			items : [{
				columnWidth : .333,
				layout : 'form',
				items : tempItems1
			}, {
				columnWidth : .333,
				layout : 'form',
				items : tempItems2
			}, {
				columnWidth : .333,
				layout : 'form',
				items : tempItems3
			}]
		}],
		tbar : ['请输入模糊值: ', ' ', {
			xtype : 'textfield',
			width : 200,
			id : 'dbFilter',
			listeners : {
				specialkey : function(field, e) {
					if (e.getKey() == Ext.EventObject.ENTER) {
						searchByFilter();
					}
				}
			}
		}, '-', {
			xtype : 'combo',
			id : 'search-type',
			anchor : '60%',
			hiddenName : 'hiddenValue',
			width : 120,
			triggerAction : 'all',// 单击触发按钮显示全部数据
			store : new Ext.data.SimpleStore({// 定义组合框中显示的数据源
				fields : ['fieldName', 'fieldValue'],
				data : result.dbFilterRecords
			}),// 设置数据源
			displayField : 'fieldName',// 定义要显示的字段
			valueField : 'fieldValue',// 定义值字段
			mode : 'local',// 本地模式
			forceSelection : true,// 要求输入值必须在列表中存在
			typeAhead : true,// 允许自动选择匹配的剩余部分文本
			// value : '==选择过滤字段==',
			value : '==选择过滤字段==',
			handleHeight : 10
				// 下拉列表中拖动手柄的高度
				}, '-', {
					xtype : 'button',
					text : '筛选',
					tooltip : '先选择查询条件,再输入模糊值',
					iconCls : 'find',
					handler : searchByFilter
				}, '->', {
					pressed : true,
					xtype : 'button',
					text : '确认插入',
					enableToggle : true,
					tooltip : '请选中一行或多行记录,再选择确认插入',
					handler : function() {
						if (sm.hasSelection()) {
							var records = sm.getSelections();
							var jsonObj = "{data:[";
							for (var i = 0; i < records.length; i++) {
								jsonObj += Ext.encode(records[i].data);
								if (i != records.length - 1) {
									jsonObj += ",";
								}
							}
							jsonObj += "]}"
							Ext.Ajax.request({
								url : '../search.do?method=insertChoices',
								method : 'post',
								params : {
									xmlFile : getQueryStringValue('xmlFile')
											.toString(),
									jsonObj : jsonObj,
									parentFormValues : getParentFormValues()
								},
								callback : function(options, success, response) {
									if (response.responseText == "success") {
 
										Ext.Msg.alert("提示", "插入成功", function() {
											window.close();
											// opener.location.reload();
                                            opener.saveForm();
										});
									} else {
										Ext.Msg.alert("提示", "插入失败");
									}
								}
							})
 
						} else {
							alert("请选择一行或多行数据");
						}
					},
					scope : this
				}, '-', {
					pressed : true,
					xtype : 'button',
					text : '取消',
					tooltip : '取消选择,直接退出',
					handler : function() {
						Ext.Msg.confirm('Notice', '确认退出?', function(id) {
							if (id == "yes")
								window.close();
						});
					},
					scope : this
				}],
		buttons : [{
			text : '执行查询条件',
			handler : function() {
				var connections = getCondictionValues();
				if (!form.getForm().isValid()) {
					return;
				};
				if (isFormInputed(form.getForm()) == false) {
					alert("请输入查询条件");
					form.getForm().focus();
					return;
				} else {
					Ext.get("dbFilter").dom.value = "";
					if (flag == 1) {
						store.baseParams = {
							xmlFile : getQueryStringValue('xmlFile'),
							condictions : connections,
							parentFormValues : getParentFormValues(),
							cmd : 'search'
						};
						store.load({
							params : {
								start : 0,
								limit : result.limit
							}
						});
						form.getForm().reset();
						flag = 0;
					} else {
						store.baseParams = {
							xmlFile : getQueryStringValue('xmlFile'),
							condictions : connections,
							parentFormValues : getParentFormValues(),
							cmd : 'search'
						};
						store.reload();
					}
 
					form.getForm().reset();
				}
			}
		}, {
			text : '重置',
			handler : function() {
				form.getForm().reset();
			}
		}]
	});
	return form;
}

最终生成页面如下:

物资参考录入界面

物资参考录入界面

本文的评论功能被关闭了.