diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 5d4853d80..ac46ca5c2 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -1151,9 +1151,13 @@ class Context { * @brief Add the js file * @deprecated **/ - function addJsFile($file, $optimized = false, $targetie = '',$index=0, $type='head', $isRuleset = false) { + function addJsFile($file, $optimized = false, $targetie = '',$index=0, $type='head', $isRuleset = false, $autoPath = null) { if($isRuleset) { + if (strpos($file, '#') !== false){ + $file = str_replace('#', '', $file); + if (!is_readable($file)) $file = $autoPath; + } $validator = new Validator($file); $validator->setCacheDir('files/cache'); $file = $validator->getJsPath(); diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index d31c7eb1d..fbd20535e 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -370,7 +370,7 @@ if(!empty($ruleset)) { $rulesetModule = $forward->module ? $forward->module : $this->module; - $rulesetFile = $oModuleModel->getValidatorFilePath($rulesetModule, $ruleset); + $rulesetFile = $oModuleModel->getValidatorFilePath($rulesetModule, $ruleset, $this->mid); if(!empty($rulesetFile)) { $Validator = new Validator($rulesetFile); diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 914fdfa1d..281801d85 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -215,18 +215,30 @@ class TemplateHandler { preg_match('/ruleset="([^"]*?)"/is', $matches[1], $m); if($m[0]) { - $matches[1] = preg_replace('/'.$m[0].'/i', '', $matches[1]); - $matches[2] = ''.$matches[2]; + $matches[1] = preg_replace('/'.addcslashes($m[0], '?$').'/i', '', $matches[1]); if (strpos($m[1],'@') !== false){ $path = str_replace('@', '', $m[1]); $path = './files/ruleset/'.$path.'.xml'; + }else if(strpos($m[1],'#') !== false){ + $fileName = str_replace('#', '', $m[1]); + $fileName = str_replace('', '', $fileName); + $path = '#./files/ruleset/'.$fileName.'.xml'; + + preg_match('@(?:^|\.?/)(modules/[\w-]+)@', $this->path, $mm); + $module_path = $mm[1]; + list($rulsetFile) = explode('.', $fileName); + $autoPath = $module_path.'/ruleset/'.$rulsetFile.'.xml'; + $m[1] = $rulsetFile; }else if(preg_match('@(?:^|\.?/)(modules/[\w-]+)@', $this->path, $mm)) { $module_path = $mm[1]; $path = $module_path.'/ruleset/'.$m[1].'.xml'; } + + $matches[2] = ''.$matches[2]; //assign to addJsFile method for js dynamic recache - $matches[1] = ''.$matches[1]; + $matches[1] = ''.$matches[1]; } } diff --git a/classes/validator/Validator.class.php b/classes/validator/Validator.class.php index aa07afa2e..ac474efcb 100644 --- a/classes/validator/Validator.class.php +++ b/classes/validator/Validator.class.php @@ -421,6 +421,8 @@ class Validator if(preg_match('@(^|/)files/ruleset/\w+\.xml$@i', $this->_xml_path)) $ruleset = '@'.$ruleset; + list($ruleset) = explode('.', $ruleset); + // current language $lang_type = class_exists('Context')?Context::getLangType():'en'; diff --git a/classes/xml/XmlGenerator.class.php b/classes/xml/XmlGenerator.class.php new file mode 100644 index 000000000..5956c2bea --- /dev/null +++ b/classes/xml/XmlGenerator.class.php @@ -0,0 +1,43 @@ +\n"; + + foreach($xml as $nodeName => $nodeItem){ + $buff .= $this->_makexml($nodeItem); + } + return $buff; + } + + function _makexml($node){ + $body = ''; + foreach($node as $key => $value){ + switch($key){ + case 'node_name' : break; + case 'attrs' : { + $attrs = ''; + if (isset($value)){ + foreach($value as $attrName=>$attrValue){ + $attrs .= sprintf(' %s="%s"', $attrName, htmlspecialchars($attrValue)); + } + } + }break; + case 'body' : $body = $value; break; + default : { + if (is_array($value)){ + foreach($value as $idx => $arrNode){ + $body .= $this->_makexml($arrNode); + } + }else if(is_object($value)){ + $body = $this->_makexml($value); + } + } + } + } + return sprintf('<%s%s>%s'."\n", $node->node_name, $attrs, $body, $node->node_name); + } +} + +?> diff --git a/config/config.inc.php b/config/config.inc.php index ac23051a1..f2db9ab27 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -167,6 +167,7 @@ require(_XE_PATH_.'classes/extravar/Extravar.class.php'); require(_XE_PATH_.'classes/handler/Handler.class.php'); require(_XE_PATH_.'classes/xml/XmlParser.class.php'); + require(_XE_PATH_.'classes/xml/XmlGenerator.class.php'); require(_XE_PATH_.'classes/xml/XmlJsFilter.class.php'); require(_XE_PATH_.'classes/xml/XmlLangParser.class.php'); require(_XE_PATH_.'classes/cache/CacheHandler.class.php'); diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 26fa02115..e9709b2ef 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1509,12 +1509,21 @@ * @brief Return ruleset cache file path * @param module, act **/ - function getValidatorFilePath($module, $ruleset) { + function getValidatorFilePath($module, $ruleset, $mid=null) { // load dynamic ruleset xml file if (strpos($ruleset, '@') !== false){ $rulsetFile = str_replace('@', '', $ruleset); $xml_file = sprintf('./files/ruleset/%s.xml', $rulsetFile); return FileHandler::getRealPath($xml_file); + }else if (strpos($ruleset, '#') !== false){ + $rulsetFile = str_replace('#', '', $ruleset).'.'.$mid; + $xml_file = sprintf('./files/ruleset/%s.xml', $rulsetFile); + if (is_readable($xml_file)) + return FileHandler::getRealPath($xml_file); + else{ + $ruleset = str_replace('#', '', $ruleset); + } + } // Get a path of the requested module. Return if not exists. $class_path = ModuleHandler::getModulePath($module);