mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-05-08 03:22:29 +09:00
#18576578 XMLJsFilter를 JAF에 맞도록 변환
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@7079 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
parent
7352faa914
commit
e4f0306a42
2 changed files with 496 additions and 532 deletions
|
|
@ -1,16 +1,248 @@
|
|||
/**
|
||||
* @file common/js/xml_js_filter.js
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief xml filter에서 사용될 js
|
||||
*
|
||||
* zbxe 에서 form의 동작시 필수입력 여부등을 선처리하고 xml_handler.js의 exec_xml()을 통해서
|
||||
* 특정 모듈과의 ajax 통신을 통해 process를 진행시킴
|
||||
* @author taggon (taggon@gmail.com)
|
||||
* @brief xml filter (validator) plugin
|
||||
*
|
||||
* A rule is a method validate one field.
|
||||
* A filter is made up of one or more rules.
|
||||
**/
|
||||
(function($){
|
||||
|
||||
var alertMsg = new Array();
|
||||
var target_type_list = new Array();
|
||||
var notnull_list = new Array();
|
||||
var extra_vars = new Array();
|
||||
var messages = [];
|
||||
var rules = [];
|
||||
var filters = [];
|
||||
var callbacks = [];
|
||||
|
||||
var Validator = xe.createApp('Validator', {
|
||||
init : function() {
|
||||
// {{{ add filters
|
||||
// email
|
||||
var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*$/;
|
||||
this.cast('ADD_RULE', ['email', regEmail]);
|
||||
this.cast('ADD_RULE', ['email_address', regEmail]);
|
||||
|
||||
// userid
|
||||
var regUserid = /^[a-z]+[\w-]*[a-z0-9]+$/i;
|
||||
this.cast('ADD_RULE', ['userid', regUserid]);
|
||||
this.cast('ADD_RULE', ['user_id', regUserid]);
|
||||
|
||||
// url
|
||||
var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
|
||||
this.cast('ADD_RULE', ['url', regUrl]);
|
||||
this.cast('ADD_RULE', ['homepage', regUrl]);
|
||||
|
||||
// korean
|
||||
var regKor = /^[가-힣]*$/;
|
||||
this.cast('ADD_RULE', ['koeran', regKor]);
|
||||
|
||||
// korean_number
|
||||
var regKorNum = /^[가-힣0-9]*$/;
|
||||
this.cast('ADD_RULE', ['korean_number', regKorNum]);
|
||||
|
||||
// alpha
|
||||
var regAlpha = /^[a-z]*$/i;
|
||||
this.cast('ADD_RULE', ['alpha', regAlpha]);
|
||||
|
||||
// alpha_number
|
||||
var regAlphaNum = /^[a-z][a-z0-9_]*$/i;
|
||||
this.cast('ADD_RULE', ['alpha_number', regAlphaNum]);
|
||||
|
||||
// numver
|
||||
var regNum = /^[0-9]*$/i;
|
||||
this.cast('ADD_RULE', ['number', regNum]);
|
||||
// }}} add filters
|
||||
},
|
||||
// run validator
|
||||
run : function(oForm) {
|
||||
var filter = '';
|
||||
|
||||
if (oForm._filter) filter = oForm._filter.value;
|
||||
|
||||
return this.cast('VALIDATE', [oForm, filter]);
|
||||
},
|
||||
API_ONREADY : function() {
|
||||
var self = this;
|
||||
|
||||
// hook form submit event
|
||||
$('form')
|
||||
.each(function(){
|
||||
if (this.onsubmit) {
|
||||
this['xe:onsubmit'] = this.onsubmit;
|
||||
this.onsubmit = null;
|
||||
}
|
||||
})
|
||||
.submit(function(){
|
||||
var legacyFn = this['xe:onsubmit'];
|
||||
var hasLegacyFn = $.isFunction(legacyFn);
|
||||
var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this);
|
||||
|
||||
return false;
|
||||
});
|
||||
},
|
||||
API_VALIDATE : function(sender, params) {
|
||||
var self = this, result = true, form = params[0], filter=null, callback=null;
|
||||
|
||||
if (form.elements['_filter']) filter = form.elements['_filter'].value;
|
||||
if (!filter) return true;
|
||||
if ($.isFunction(callbacks[filter])) callback = callbacks[filter];
|
||||
filter = filters[filter.toLowerCase()] || null;
|
||||
|
||||
$.each(filter, function(name) {
|
||||
var _el = form.elements[name];
|
||||
|
||||
if (!_el) return true;
|
||||
|
||||
var el = $(_el), val = get_value(el);
|
||||
var minlen = parseInt(this.minlen) || 0;
|
||||
var maxlen = parseInt(this.maxlen) || 0;
|
||||
var rule = (this.rule || '').split(',');
|
||||
|
||||
if (this.required && !val) (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false));
|
||||
if ((minlen && maxlen) && (val.length < minlen || val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false));
|
||||
|
||||
if (this.equalto) {
|
||||
var eq_val = get_value(form.elements[this.equalto]);
|
||||
if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false));
|
||||
}
|
||||
|
||||
$.each(rule, function() {
|
||||
var ret = self.cast('APPLY_RULE', [this, val]);
|
||||
if (!ret) return (result = false);
|
||||
});
|
||||
|
||||
if (!result) return false;
|
||||
});
|
||||
|
||||
if (!result) return false;
|
||||
if ($.isFunction(callback)) return callback(form);
|
||||
|
||||
return true;
|
||||
},
|
||||
API_ADD_RULE : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
rules[name] = params[1];
|
||||
},
|
||||
API_DEL_RULE : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
delete rules[name];
|
||||
},
|
||||
API_GET_RULE : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
|
||||
if (rules[name]) {
|
||||
return rules[name];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
API_ADD_FILTER : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
var filter = params[1];
|
||||
|
||||
filters[name] = filter;
|
||||
},
|
||||
API_DEL_FILTER : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
delete filters[name];
|
||||
},
|
||||
API_GET_FILTER : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
|
||||
if (filters[name]) {
|
||||
return filters[name];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
API_APPLY_RULE : function(sender, params) {
|
||||
var name = params[0].toLowerCase();
|
||||
var value = params[1];
|
||||
|
||||
if (typeof(rules[name]) == 'undefined') return true; // no filter
|
||||
if ($.isFunction(rules[name])) return rules[name](value);
|
||||
if (rules[name] instanceof RegExp) return rules[name].test(value);
|
||||
|
||||
return true;
|
||||
},
|
||||
API_ALERT : function(sender, params) {
|
||||
var form = params[0];
|
||||
var field_name = params[1];
|
||||
var msg_code = params[2];
|
||||
var minlen = params[3];
|
||||
var maxlen = params[4];
|
||||
|
||||
var field_msg = this.cast('GET_MESSAGE', [field_name]);
|
||||
var msg = this.cast('GET_MESSAGE', [msg_code]);
|
||||
|
||||
if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg));
|
||||
if (typeof(minlen)!='undefined' && typeof(maxlen)!='undefined') msg += '('+minlen+'~'+maxlen+')';
|
||||
|
||||
this.cast('SHOW_ALERT', [msg]);
|
||||
|
||||
// set focus
|
||||
$(form.elements[field_name]).focus();
|
||||
},
|
||||
API_SHOW_ALERT : function(sender, params) {
|
||||
alert(params[0]);
|
||||
},
|
||||
API_ADD_MESSAGE : function(sender, params) {
|
||||
var msg_code = params[0];
|
||||
var msg_str = params[1];
|
||||
|
||||
messages[msg_code] = msg_str;
|
||||
},
|
||||
API_GET_MESSAGE : function(sender, params) {
|
||||
var msg_code = params[0];
|
||||
|
||||
return messages[msg_code] || msg_code;
|
||||
},
|
||||
API_ADD_CALLBACK : function(sender, params) {
|
||||
var name = params[0];
|
||||
var func = params[1];
|
||||
|
||||
callbacks[name] = func;
|
||||
},
|
||||
API_REMOVE_CALLBACK : function(sender, params) {
|
||||
var name = params[0];
|
||||
|
||||
delete callbacks[name];
|
||||
}
|
||||
});
|
||||
|
||||
var oValidator = new Validator;
|
||||
|
||||
// register validator
|
||||
xe.registerApp(oValidator);
|
||||
|
||||
// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다.
|
||||
var EditorStub = xe.createPlugin('editor_stub', {
|
||||
API_BEFORE_VALIDATE : function(sender, params) {
|
||||
var form = params[0];
|
||||
var seq = form.getAttribute('editor_sequence');
|
||||
|
||||
if (seq) {
|
||||
form.content.value = editorGetContentTextarea_xe(seq) || '';
|
||||
}
|
||||
}
|
||||
});
|
||||
oValidator.registerPlugin(new EditorStub);
|
||||
|
||||
// functions
|
||||
function get_value(elem) {
|
||||
if (elem.is(':radio')){
|
||||
return elem.filter(':checked').val();
|
||||
} else if (elem.is(':checkbox')) {
|
||||
var vals = [];
|
||||
elem.filter(':checked').each(function(){
|
||||
vals.push(this.value);
|
||||
});
|
||||
return vals.join('|@|');
|
||||
} else {
|
||||
return elem.val();
|
||||
}
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
|
||||
/**
|
||||
* @function filterAlertMessage
|
||||
|
|
@ -34,297 +266,11 @@ function filterAlertMessage(ret_obj) {
|
|||
}
|
||||
|
||||
/**
|
||||
* @class XmlJsFilter
|
||||
* @authro zero (zero@nzeo.com)
|
||||
* @brief form elements, module/act, callback_user_func을 이용하여 서버에 ajax로 form 데이터를 넘기고 결과를 받아오는 js class
|
||||
**/
|
||||
function XmlJsFilter(form_object, module, act, callback_user_func) {
|
||||
this.field = new Array();
|
||||
this.parameter = new Array();
|
||||
this.response = new Array();
|
||||
|
||||
this.fo_obj = form_object;
|
||||
this.module = module;
|
||||
this.act = act;
|
||||
this.user_func = callback_user_func;
|
||||
this.setFocus = XmlJsFilterSetFocus;
|
||||
this.addFieldItem = XmlJsFilterAddFieldItem;
|
||||
this.addParameterItem = XmlJsFilterAddParameterItem;
|
||||
this.addResponseItem = XmlJsFilterAddResponseItem;
|
||||
this.getValue = XmlJsFilterGetValue;
|
||||
this.executeFilter = XmlJsFilterExecuteFilter;
|
||||
this.checkFieldItem = XmlJsFilterCheckFieldItem;
|
||||
this.getParameterParam = XmlJsFilterGetParameterParam;
|
||||
this.alertMsg = XmlJsFilterAlertMsg;
|
||||
this.proc = XmlJsFilterProc;
|
||||
}
|
||||
|
||||
function XmlJsFilterSetFocus(target_name) {
|
||||
var obj = this.fo_obj[target_name];
|
||||
if(typeof(obj)=='undefined' || !obj) return;
|
||||
|
||||
var length = obj.length;
|
||||
try {
|
||||
if(typeof(length)!='undefined') {
|
||||
obj[0].focus();
|
||||
} else {
|
||||
obj.focus();
|
||||
}
|
||||
} catch(e) {
|
||||
}
|
||||
}
|
||||
|
||||
function XmlJsFilterAddFieldItem(target, required, minlength, maxlength, equalto, filter) {
|
||||
var obj = new Array(target, required, minlength, maxlength, equalto, filter);
|
||||
this.field[this.field.length] = obj;
|
||||
}
|
||||
|
||||
function XmlJsFilterAddParameterItem(param, target) {
|
||||
var obj = new Array(param, target);
|
||||
this.parameter[this.parameter.length] = obj;
|
||||
}
|
||||
|
||||
function XmlJsFilterAddResponseItem(name) {
|
||||
this.response[this.response.length] = name;
|
||||
}
|
||||
|
||||
function XmlJsFilterGetValue(target_name) {
|
||||
var obj = this.fo_obj[target_name];
|
||||
if(typeof(obj)=='undefined' || !obj) return '';
|
||||
var value = '';
|
||||
var length = obj.length;
|
||||
var type = obj.type;
|
||||
if((typeof(type)=='undefined'||!type) && typeof(length)!='undefined' && typeof(obj[0])!='undefined' && length>0) type = obj[0].type;
|
||||
else length = 0;
|
||||
|
||||
switch(type) {
|
||||
case 'checkbox' :
|
||||
if(length>0) {
|
||||
var value_list = new Array();
|
||||
for(var i=0;i<length;i++) {
|
||||
if(obj[i].checked) value_list[value_list.length] = obj[i].value;
|
||||
}
|
||||
value = value_list.join('|@|');
|
||||
} else {
|
||||
if(obj.checked) value = obj.value;
|
||||
else value = '';
|
||||
}
|
||||
break;
|
||||
case 'radio' :
|
||||
if(length>0) {
|
||||
for(var i=0;i<length;i++) {
|
||||
if(obj[i].checked) value = obj[i].value;
|
||||
}
|
||||
} else {
|
||||
if(obj.checked) value = obj.value;
|
||||
else value = '';
|
||||
}
|
||||
break;
|
||||
case 'select' :
|
||||
case 'select-one' :
|
||||
if(obj.selectedIndex>=0) value = obj.options[obj.selectedIndex].value;
|
||||
break;
|
||||
default :
|
||||
if(length>0 && target_type_list[target_name]) {
|
||||
switch(target_type_list[target_name]) {
|
||||
case 'kr_zip' :
|
||||
var val1 = obj[0].value;
|
||||
var val2 = obj[1].value;
|
||||
if(val1&&val2) {
|
||||
value = val1+'|@|'+val2;
|
||||
}
|
||||
break;
|
||||
case 'tel' :
|
||||
var val1 = obj[0].value;
|
||||
var val2 = obj[1].value;
|
||||
var val3 = obj[2].value;
|
||||
if(val1&&val2&&val3) {
|
||||
value = val1+'|@|'+val2+'|@|'+val3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
value = obj.value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(typeof(value)=='undefined'||!value) return '';
|
||||
return value.trim();
|
||||
}
|
||||
|
||||
function XmlJsFilterExecuteFilter(filter, value) {
|
||||
switch(filter) {
|
||||
case "email" :
|
||||
case "email_address" :
|
||||
var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "userid" :
|
||||
case "user_id" :
|
||||
var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "homepage" :
|
||||
var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "korean" :
|
||||
var regx = /^[가-힣]*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "korean_number" :
|
||||
var regx = /^[가-힣0-9]*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "alpha" :
|
||||
var regx = /^[a-zA-Z]*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "alpha_number" :
|
||||
var regx = /^[a-zA-Z][a-zA-Z0-9\_]*$/;
|
||||
return regx.test(value);
|
||||
break;
|
||||
case "number" :
|
||||
return !isNaN(value);
|
||||
break;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function XmlJsFilterAlertMsg(target, msg_code, minlength, maxlength) {
|
||||
var target_msg = "";
|
||||
|
||||
if(alertMsg[target]!='undefined') target_msg = alertMsg[target];
|
||||
else target_msg = target;
|
||||
|
||||
var msg = "";
|
||||
if(typeof(alertMsg[msg_code])!='undefined') {
|
||||
if(alertMsg[msg_code].indexOf('%s')>=0) msg = alertMsg[msg_code].replace('%s',target_msg);
|
||||
else msg = target_msg+alertMsg[msg_code];
|
||||
} else {
|
||||
msg = msg_code;
|
||||
}
|
||||
|
||||
if(typeof(minlength)!='undefined' && typeof(maxlength)!='undefined') msg += "("+minlength+"~"+maxlength+")";
|
||||
|
||||
alert(msg);
|
||||
this.setFocus(target);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function XmlJsFilterCheckFieldItem() {
|
||||
for(var i=0; i<extra_vars.length;i++) {
|
||||
var name = extra_vars[i];
|
||||
this.addFieldItem(name, false, 0, 0, "", "");
|
||||
}
|
||||
|
||||
for(var i=0; i<this.field.length;i++) {
|
||||
var item = this.field[i];
|
||||
var target = item[0];
|
||||
var required = item[1];
|
||||
var minlength = item[2];
|
||||
var maxlength = item[3];
|
||||
var equalto = item[4];
|
||||
var filter = item[5].split(",");
|
||||
|
||||
if(typeof(this.fo_obj[target])=='undefined') continue;
|
||||
|
||||
for(var j=0; j<notnull_list.length; j++) {
|
||||
if(notnull_list[j]==target) required = true;
|
||||
}
|
||||
|
||||
var value = this.getValue(target);
|
||||
if(!required && !value) continue;
|
||||
if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');
|
||||
|
||||
if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);
|
||||
|
||||
if(equalto) {
|
||||
var equalto_value = this.getValue(equalto);
|
||||
if(equalto_value != value) return this.alertMsg(target, 'equalto');
|
||||
}
|
||||
|
||||
if(filter.length && filter[0]) {
|
||||
for(var j=0;j<filter.length;j++) {
|
||||
var filter_item = filter[j];
|
||||
if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function XmlJsFilterGetParameterParam() {
|
||||
if(!this.fo_obj) return new Array();
|
||||
|
||||
var prev_name = '';
|
||||
if(this.parameter.length<1) {
|
||||
for(var i=0;i<this.fo_obj.length;i++) {
|
||||
var name = this.fo_obj[i].name;
|
||||
if(typeof(name)=='undefined'||!name||name==prev_name) continue;
|
||||
this.addParameterItem(name, name);
|
||||
prev_name = name;
|
||||
}
|
||||
}
|
||||
|
||||
var params = new Array();
|
||||
for(var i=0; i<this.parameter.length;i++) {
|
||||
var item = this.parameter[i];
|
||||
var param = item[0];
|
||||
var target = item[1];
|
||||
var value = this.getValue(target);
|
||||
params[param] = value;
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
function XmlJsFilterProc(confirm_msg) {
|
||||
var result = this.checkFieldItem();
|
||||
if(!result) return false;
|
||||
|
||||
if(typeof(confirm_msg)=='undefined') confirm_msg = '';
|
||||
|
||||
var params = this.getParameterParam();
|
||||
var response = this.response;
|
||||
if(confirm_msg && !confirm(confirm_msg)) return false;
|
||||
if(!this.act) {
|
||||
this.user_func(this.fo_obj, params);
|
||||
return true;
|
||||
}
|
||||
exec_xml(this.module, this.act, params, this.user_func, response, params, this.fo_obj);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// form proc
|
||||
function procFilter(fo_obj, filter_func) {
|
||||
// form문 안에 위지윅 에디터가 세팅되어 있을 경우 에디터의 값과 지정된 content field를 sync
|
||||
var editor_sequence = fo_obj.getAttribute('editor_sequence');
|
||||
|
||||
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined') {
|
||||
if(jQuery.isFunction(editorRelKeys[editor_sequence]['pasteHTML'])){
|
||||
var content = editorGetContent(editor_sequence);
|
||||
editorRelKeys[editor_sequence]['content'].value = content;
|
||||
}else{
|
||||
var content = editorGetContent(editor_sequence);
|
||||
var dummy = xCreateElement("div");
|
||||
xInnerHtml(dummy, content);
|
||||
|
||||
// IE에서 컨텐츠 전체를 P태그로 감싸는 경우가 있어서 이 의미없는 P태그를 제거
|
||||
if(dummy.firstChild && dummy.firstChild.nodeName == 'P' && dummy.firstChild == dummy.lastChild) {
|
||||
var content = xInnerHtml(dummy.firstChild);
|
||||
xInnerHtml(dummy,content);
|
||||
}
|
||||
}
|
||||
var regxPath = new RegExp('(src|href)=("|\'){1}'+request_uri.replace(/\//g,'\\/')+'([^"\']+)("|\'){1}','g');
|
||||
content = content.replace(regxPath, '$1="./$3"');
|
||||
editorRelKeys[editor_sequence]['content'].value = content;
|
||||
}
|
||||
|
||||
filter_func(fo_obj);
|
||||
return false;
|
||||
}
|
||||
* @brief Function to process filters
|
||||
* @deprecated
|
||||
*/
|
||||
function procFilter(fo_obj, filter_func)
|
||||
{
|
||||
filter_func(fo_obj);
|
||||
return false;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue