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($this->viewType == 'mhtml' or $this->viewType == 'xhtml') { if(!file_exists($mainViewFile)) { if($this->viewType == 'xhtml') $this->app->viewType = 'html'; $this->devicePrefix = ''; $mainViewFile = $modulePath . 'view' . DS . $this->devicePrefix . $methodName . '.' . $viewType . '.php'; } } $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)) $this->app->triggerError("the view file $viewFile not found", __FILE__, __LINE__, $exit = true); $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') { if(!$css) { $this->devicePrefix = ''; $css = $this->getCSS($moduleName, $methodName); } if(!$js) { $this->devicePrefix = ''; $js = $this->getJS($moduleName, $methodName); } } 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); } /** * 获取一个方法的输出内容,这样我们可以在一个方法里获取其他模块方法的内容。 * 如果模块名为空,则调用该模块、该方法;如果设置了模块名,调用指定模块指定方法。 * * Get the output of one module's one method as a string, thus in one module's method, can fetch other module's content. * If the module name is empty, then use the current module and method. If set, use the user defined module and method. * * @param string $moduleName module name. * @param string $methodName method name. * @param array $params params. * @access public * @return string the parsed html. */ public function fetch($moduleName = '', $methodName = '', $params = array(), $appName = '') { if($moduleName == '') $moduleName = $this->moduleName; if($methodName == '') $methodName = $this->methodName; if($appName == '') $appName = $this->appName; if($moduleName == $this->moduleName and $methodName == $this->methodName) { $this->parse($moduleName, $methodName); return $this->output; } $currentPWD = getcwd(); /** * 设置引用的文件和路径。 * Set the pathes and files to included. **/ $modulePath = $this->app->getModulePath($appName, $moduleName); $moduleControlFile = $modulePath . 'control.php'; $actionExtPath = $this->app->getModuleExtPath($appName, $moduleName, 'control'); $file2Included = $moduleControlFile; if(!empty($actionExtPath)) { $commonActionExtFile = $actionExtPath['common'] . strtolower($methodName) . '.php'; $file2Included = file_exists($commonActionExtFile) ? $commonActionExtFile : $moduleControlFile; if(!empty($actionExtPath['site'])) { $siteActionExtFile = $actionExtPath['site'] . strtolower($methodName) . '.php'; $file2Included = file_exists($siteActionExtFile) ? $siteActionExtFile : $file2Included; } } /** * 加载控制器文件。 * Load the control file. */ if(!is_file($file2Included)) $this->app->triggerError("The control file $file2Included not found", __FILE__, __LINE__, $exit = true); chdir(dirname($file2Included)); if($moduleName != $this->moduleName) helper::import($file2Included); /** * 设置调用的类名。 * Set the name of the class to be called. */ $className = class_exists("my$moduleName") ? "my$moduleName" : $moduleName; if(!class_exists($className)) $this->app->triggerError(" The class $className not found", __FILE__, __LINE__, $exit = true); /** * 解析参数,创建模块control对象。 * Parse the params, create the $module control object. */ if(!is_array($params)) parse_str($params, $params); $module = new $className($moduleName, $methodName, $appName); /** * 调用对应方法,使用ob方法获取输出内容。 * Call the method and use ob function to get the output. */ ob_start(); call_user_func_array(array($module, $methodName), $params); $output = ob_get_contents(); ob_end_clean(); /** * 返回内容。 * Return the content. */ unset($module); chdir($currentPWD); return $output; } }