diff --git a/framework/helper.class.php b/framework/helper.class.php index 71f04a8bd5..5ea699ec79 100644 --- a/framework/helper.class.php +++ b/framework/helper.class.php @@ -142,55 +142,114 @@ class helper { global $app; - /* Set the main model file and extension path and files. */ + /* Set the main model file and extension and hook pathes and files. */ $mainModelFile = $app->getModulePath($moduleName) . 'model.php'; $modelExtPath = $app->getModuleExtPath($moduleName, 'model'); + $modelHookPath = $modelExtPath . 'hook/'; $extFiles = helper::ls($modelExtPath, '.php'); + $hookFiles = helper::ls($modelHookPath, '.php'); - /* If no extension file, return the main file directly. */ - if(empty($extFiles)) return $mainModelFile; + /* If no extension files and no hook files, return the main file directly. */ + if(empty($extFiles) and empty($hookFiles)) return $mainModelFile; /* Else, judge whether needed update or not .*/ - $mergedModelFile = $app->getTmpRoot() . 'model' . $app->getPathFix() . $moduleName . '.php'; $needUpdate = false; + $mergedModelFile = $app->getTmpRoot() . 'model' . $app->getPathFix() . $moduleName . '.php'; $lastTime = file_exists($mergedModelFile) ? filemtime($mergedModelFile) : 0; - foreach($extFiles as $extFile) + + while(!$needUpdate) { - if(filemtime($extFile) > $lastTime) - { - $needUpdate = true; - break; - } - } - if(filemtime($mainModelFile) > $lastTime) $needUpdate = true; + foreach($extFiles as $extFile) if(filemtime($extFile) > $lastTime) break 2; + foreach($hookFiles as $hookFile) if(filemtime($hookFile) > $lastTime) break 2; - /* If need'nt update, return the cache file. */ - if(!$needUpdate) return $mergedModelFile; + if(is_dir($modelExtPath ) and filemtime($modelExtPath) > $lastTime) break; + if(is_dir($modelHookPath) and filemtime($modelHookPath) > $lastTime) break; - /* Update the cache file. */ - if($needUpdate) - { - $modelClass = $moduleName . 'Model'; - $extModelClass = 'ext' . $modelClass; - $modelLines = trim(file_get_contents($mainModelFile)); - $modelLines = rtrim($modelLines, '?>'); // To make sure the last end tag is removed. - $modelLines .= "class $extModelClass extends $modelClass {\n"; - - /* Cycle all the extension files. */ - foreach($extFiles as $extFile) - { - $extLines = trim(file_get_contents($extFile)); - if(strpos($extLines, '') !== false) $extLines = rtrim($extLines, '?>'); - $modelLines .= $extLines . "\n"; - } - - /* Create the merged model file. */ - $modelLines .= "}"; - file_put_contents($mergedModelFile, $modelLines); + if(filemtime($mainModelFile) > $lastTime) break; return $mergedModelFile; } + + /* Update the cache file. */ + $modelClass = $moduleName . 'Model'; + $extModelClass = 'ext' . $modelClass; + $extTmpModelClass = 'tmpExt' . $modelClass; + $modelLines = "getFileName(); + $startLine = $methodRelfection->getStartLine() . ' '; + $endLine = $methodRelfection->getEndLine() . ' '; + + /* Merge hook codes. */ + $oldCodes = $definedFile == $mergedModelFile ? $mergedModelCodes : $mainModelCodes; + $oldCodes = join("", array_slice($oldCodes, $startLine - 1, $endLine - $startLine + 1)); + $openBrace = strpos($oldCodes, '{'); + $newCodes = substr($oldCodes, 0, $openBrace + 1) . "\n" . join("\n", $hookCodes[$method]) . substr($oldCodes, $openBrace + 1); + + /* Replace it. */ + if($definedFile == $mergedModelFile) + { + $modelLines = str_replace($oldCodes, $newCodes, $modelLines); + } + else + { + $modelLines = str_replace($replaceMark, $newCodes . "\n$replaceMark", $modelLines); + } + } + + /* Save it. */ + $modelLines = str_replace($extTmpModelClass, $extModelClass, $modelLines); + file_put_contents($mergedModelFile, $modelLines); + + return $mergedModelFile; + } + + /** + * Remove tags of PHP + * + * @param string $fileName + * @static + * @access public + * @return string + */ + static public function removeTagsOfPHP($fileName) + { + $code = trim(file_get_contents($fileName)); + if(strpos($code, '') !== false) $code = rtrim($code, '?>'); + return trim($code); } /**