227 lines
9.3 KiB
PHP
Executable File
227 lines
9.3 KiB
PHP
Executable File
<?php
|
||
/**
|
||
* Control类从baseControl类继承而来,每个模块的control对象从control类集成。
|
||
* 您可以对baseControl类进行扩展,扩展的逻辑可以定义在这个文件中。
|
||
*
|
||
* This control class extends from the baseControl class and extened by every module's control.
|
||
* You can extend the baseControl class by change this file.
|
||
*
|
||
* @package framework
|
||
*
|
||
* The author disclaims copyright to this source code. In place of
|
||
* a legal notice, here is a blessing:
|
||
*
|
||
* May you do good and not evil.
|
||
* May you find forgiveness for yourself and forgive others.
|
||
* May you share freely, never taking more than you give.
|
||
*/
|
||
include FRAME_ROOT . '/base/control.class.php';
|
||
class control extends baseControl
|
||
{
|
||
/**
|
||
* 设置视图文件:主视图文件,扩展视图文件, 站点扩展视图文件,以及钩子脚本。
|
||
* 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($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;
|
||
}
|
||
}
|