moduleName; if(empty($appName)) $appName = $this->appName; global $loadedModels; if(isset($loadedModels[$appName][$moduleName])) { $this->$moduleName = $loadedModels[$appName][$moduleName]; $this->dao = $this->$moduleName->dao; return $this->$moduleName; } $modelFile = $this->app->setModelFile($moduleName, $appName); /** * 如果没有model文件,尝试加载config配置信息。 * If no model file, try load config. */ if(!helper::import($modelFile)) { $this->app->loadModuleConfig($moduleName, $appName); $this->app->loadLang($moduleName, $appName); $this->dao = new dao(); return false; } /** * 如果没有扩展文件,model类名是$moduleName + 'model',如果有扩展,还需要增加ext前缀。 * If no extension file, model class name is $moduleName + 'model', else with 'ext' as the prefix. */ $modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model'; if(!class_exists($modelClass)) { $modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model'; if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true); } /** * 初始化model对象,在control对象中可以通过$this->$moduleName来引用。同时将dao对象赋为control对象的成员变量,方便引用。 * Init the model object thus you can try $this->$moduleName to access it. Also assign the $dao object as a member of control object. */ $loadedModels[$appName][$moduleName] = new $modelClass($appName); $this->$moduleName = $loadedModels[$appName][$moduleName]; $this->dao = $this->$moduleName->dao; return $this->$moduleName; } /** * 设置视图文件:主视图文件,扩展视图文件, 站点扩展视图文件,以及钩子脚本。 * Set view files: the main file, extension view file, site extension view file and hook files. * * @param string $moduleName module name * @param string $methodName method name * @access public * @return string the view file */ public function setViewFile($moduleName, $methodName) { $moduleName = strtolower(trim($moduleName)); $methodName = strtolower(trim($methodName)); $modulePath = $this->app->getModulePath($this->appName, $moduleName); $viewExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'view'); $viewType = ($this->viewType == 'mhtml' or $this->viewType == 'xhtml') ? 'html' : $this->viewType; $mainViewFile = $modulePath . 'view' . DS . $this->devicePrefix . $methodName . '.' . $viewType . '.php'; /* If the main view file doesn't exist, set the device prefix to empty and reset the main view file. */ if(!file_exists($mainViewFile) and $this->app->clientDevice != 'mobile') { $originalPrefix = $this->devicePrefix; $this->devicePrefix = ''; $mainViewFile = $modulePath . 'view' . DS . $this->devicePrefix . $methodName . '.' . $viewType . '.php'; $this->devicePrefix = $originalPrefix; } $viewFile = $mainViewFile; if(!empty($viewExtPath)) { $commonExtViewFile = $viewExtPath['common'] . $this->devicePrefix . $methodName . ".{$viewType}.php"; $siteExtViewFile = empty($viewExtPath['site']) ? '' : $viewExtPath['site'] . $this->devicePrefix . $methodName . ".{$viewType}.php"; $viewFile = file_exists($commonExtViewFile) ? $commonExtViewFile : $mainViewFile; $viewFile = (!empty($siteExtViewFile) and file_exists($siteExtViewFile)) ? $siteExtViewFile : $viewFile; if(!is_file($viewFile)) { die(js::error($this->lang->notPage) . js::locate('back')); } $commonExtHookFiles = glob($viewExtPath['common'] . $this->devicePrefix . $methodName . ".*.{$viewType}.hook.php"); $siteExtHookFiles = empty($viewExtPath['site']) ? '' : glob($viewExtPath['site'] . $this->devicePrefix . $methodName . ".*.{$viewType}.hook.php"); $extHookFiles = array_merge((array) $commonExtHookFiles, (array) $siteExtHookFiles); } if(!empty($extHookFiles)) return array('viewFile' => $viewFile, 'hookFiles' => $extHookFiles); return $viewFile; } /** * 默认渲染方法,适用于viewType = html的时候。 * Default parse method when viewType != json, like html. * * @param string $moduleName module name * @param string $methodName method name * @access public * @return void */ public function parseDefault($moduleName, $methodName) { /** * 设置视图文件。(PHP7有一个bug,不能直接$viewFile = $this->setViewFile())。 * Set viewFile. (Can't assign $viewFile = $this->setViewFile() directly because one php7's bug.) */ $results = $this->setViewFile($moduleName, $methodName); $viewFile = $results; if(is_array($results)) extract($results); /** * 获得当前页面的CSS和JS。 * Get css and js codes for current method. */ $css = $this->getCSS($moduleName, $methodName); $js = $this->getJS($moduleName, $methodName); /* If the js or css file doesn't exist, set the device prefix to empty and reset the js or css file. */ if($this->viewType == 'xhtml') { $originalPrefix = $this->devicePrefix; $this->devicePrefix = ''; $css .= $this->getCSS($moduleName, $methodName); $js .= $this->getJS($moduleName, $methodName); $this->devicePrefix = $originalPrefix; } if($css) $this->view->pageCSS = $css; if($js) $this->view->pageJS = $js; /** * 切换到视图文件所在的目录,以保证视图文件里面的include语句能够正常运行。 * Change the dir to the view file to keep the relative pathes work. */ $currentPWD = getcwd(); chdir(dirname($viewFile)); /** * 使用extract安定ob方法渲染$viewFile里面的代码。 * Use extract and ob functions to eval the codes in $viewFile. */ extract((array)$this->view); ob_start(); include $viewFile; if(isset($hookFiles)) foreach($hookFiles as $hookFile) if(file_exists($hookFile)) include $hookFile; $this->output .= ob_get_contents(); ob_end_clean(); /** * 渲染完毕后,再切换回之前的路径。 * At the end, chang the dir to the previous. */ chdir($currentPWD); } /** * Execute hooks of a method. * * @param string $methodName * @param int $objectID * @access public * @return void */ public function executeHooks($methodName, $objectID) { if(!isset($this->config->bizVersion)) return false; $flowFile = $this->app->getModuleRoot() . 'workflow/model.php'; $actionFile = $this->app->getModuleRoot() . 'workflowaction/model.php'; $hookFile = $this->app->getModuleRoot() . 'workflowhook/model.php'; if(is_file($flowFile) && is_file($actionFile) && is_file($hookFile)) { $flow = $this->loadModel('workflow')->getByModule($this->moduleName); $action = $this->loadModel('workflowaction')->getByModuleAndAction($this->moduleName, $this->methodName); if($flow && $action) $this->loadModel('workflowhook')->execute($flow, $action, $objectID); } } }