From 8c8f3dc2983670aae98b357dca244a64234def48 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 23 Aug 2011 08:57:24 +0000 Subject: [PATCH] Fixed a bug for client-side validation git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8841 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 2 +- classes/validator/Validator.class.php | 27 +++++++++++----------- common/js/xml_js_filter.js | 24 +++++++++---------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 083ea496a..e6f80f7a9 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -220,7 +220,7 @@ $matches[1] = preg_replace('/'.$m[0].'/i', '', $matches[1]); $matches[2] = ''.$matches[2]; - if(preg_match('@(?:^|/)(modules/[\w-]+)@', $this->path, $mm)) { + if(preg_match('@(?:^|\.?/)(modules/[\w-]+)@', $this->path, $mm)) { $module_path = $mm[1]; $validator = new Validator("{$module_path}/ruleset/{$m[1]}.xml"); $validator->setCacheDir('files/cache'); diff --git a/classes/validator/Validator.class.php b/classes/validator/Validator.class.php index 5b1ca25b2..6189ad1b7 100644 --- a/classes/validator/Validator.class.php +++ b/classes/validator/Validator.class.php @@ -34,6 +34,7 @@ class Validator )); $this->_has_mb_func = is_callable('mb_strlen'); + $this->setCacheDir('./files/cache'); } /** @@ -99,6 +100,8 @@ class Validator $this->_xml_ruleset = $xml->ruleset; $this->_filters = $filters; $this->_xml_path = $xml_path; + + return true; } /** @@ -116,7 +119,7 @@ class Validator * @param[in] (optional) array $fields Target fields. The keys of the array represents field's name, its values represents field's value. * @return bool True if it is valid, FALSE otherwise. */ - function validate($fields_=null){ + function validate($fields_=array()){ if(is_array($fields_)) { $fields = $fields_; } else { @@ -124,7 +127,7 @@ class Validator $fields = (array)Context::getRequestVars(); } - if(!is_array($fields)) return true; + if(!is_array($fields) || !count($fields)) return true; $filter_default = array( 'required' => 'false', @@ -343,6 +346,8 @@ class Validator fclose($fp); } } + + return $filepath; } /** @@ -350,6 +355,7 @@ class Validator * @private */ function _compile2js() { + $ruleset = basename($this->_xml_path,'.xml'); $content = array(); // custom rulesets @@ -357,14 +363,14 @@ class Validator if(strpos('email,userid,url,alpha,alpha_number,number,', $name.',') !== false) continue; switch($rule['type']) { case 'regex': - $content[] = "v.addRule('{$name}', {$rule['test']});"; + $content[] = "v.cast('ADD_RULE', ['{$name}', {$rule['test']}]);"; break; case 'enum': $enums = '"'.implode('","', $rule['test']).'"'; - $content[] = "v.addRule('{$name}', function($$){ return ($.inArray($$,[{$enums}]) > -1); });"; + $content[] = "v.cast('ADD_RULE', ['{$name}', function($$){ return ($.inArray($$,[{$enums}]) > -1); }]);"; break; case 'expr': - $content[] = "v.addRule('{$name}', function($$){ return ({$rule['test']}); });"; + $content[] = "v.cast('ADD_RULE', ['{$name}', function($$){ return ({$rule['test']}); }]);"; break; } } @@ -392,19 +398,14 @@ class Validator } if(count($field)) { $field = '{'.implode(',', $field).'}'; - $content[] = "v.addFilter('{$name}', {$field});"; + $content[] = "'{$name}':{$field}"; } } if(count($content)) { - array_unshift($content, - '(function($){', - 'var v = xe.getApp("validator")[0];', - 'if(!v) return false;' - ); - $content[] = '})(jQuery);'; // array_push + $content = implode(',', $content); - return implode("\n", $content); + return "(function($,v){\nv=xe.getApp('validator')[0];if(!v)return;\nv.cast('ADD_FILTER',['{$ruleset}', {{$content}}]);})(jQuery);"; } else { return ''; } diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 6641a5328..eaced688b 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -10,7 +10,7 @@ var messages = []; var rules = []; -var filters = []; +var filters = {}; var callbacks = []; var extras = {}; @@ -85,12 +85,13 @@ var Validator = xe.createApp('Validator', { }); }, API_VALIDATE : function(sender, params) { - var result = true, form = params[0], filter=null, callback=null; + var result = true, form = params[0], elems = form.elements, filter=null, ruleset=null, callback=null; var name, el, val, mod, len, lenb, max, min, maxb, minb, rules, e_el, e_val, i, c, r, result, if_, fn; - if (form.elements['_filter']) filter = form.elements['_filter'].value; - if (!filter) return true; - if ($.isFunction(callbacks[filter])) callback = callbacks[filter]; + if(elems['ruleset']) filter = form.elements['ruleset'].value; + else if(elems['_filter']) filter = form.elements['_filter'].value; + if(!filter) return true; + if($.isFunction(callbacks[filter])) callback = callbacks[filter]; filter = $.extend({}, filters[filter.toLowerCase()] || {}, extras); for(name in filter) { @@ -103,11 +104,12 @@ var Validator = xe.createApp('Validator', { if(!el) continue; - if(filter['if']) { - for(i in filter['if']) { - if_ = filter['if'][i]; + if(f['if']) { + if(!$.isArray(f['if'])) f['if'] = [f['if']]; + for(i in f['if']) { + if_ = f['if'][i]; fn = new Function('el', 'return !!(' + (if_.test.replace(/$(\w+)/g, 'el["$1"]')) +')'); - if(fn(form.elements)) filter[if_.attr] = if_.value; + if(fn(form.elements)) f[if_.attr] = if_.value; } } @@ -147,7 +149,7 @@ var Validator = xe.createApp('Validator', { } } - if ($.isFunction(callback)) return callback(form); + if($.isFunction(callback)) return callback(form); return true; }, @@ -172,8 +174,6 @@ var Validator = xe.createApp('Validator', { var name = params[0].toLowerCase(); var filter = params[1]; - if(filter['if'] && !$.isArray(filter['if'])) filter['if'] = [filter['if']]; - filters[name] = filter; }, API_DEL_FILTER : function(sender, params) {