This commit is contained in:
ThinkPHP
2013-04-19 11:50:37 +08:00
2 changed files with 103 additions and 91 deletions

View File

@@ -10,25 +10,27 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace Think; namespace Think;
use Think\View;
class Controller { class Controller {
// 视图类实例 // 视图类实例
protected $view = null; protected $view = null;
/** /**
* 架构函数 初始化视图类 并采用内置模板引擎 * 架构函数 初始化视图类 并采用内置模板引擎
* @access public * @access public
*/ */
public function __construct(){ public function __construct(){
// 模板引擎参数 // 模板引擎参数
$config = [ $config = [
'tpl_path' => MODULE_PATH.'View/', 'tpl_path' => MODULE_PATH . 'View/',
'cache_path' => RUNTIME_PATH.'Cache/', 'cache_path' => RUNTIME_PATH . 'Cache/',
]; ];
$this->view = new View(); $this->view = new View();
$this->view->engine('think',$config); $this->view->engine('think', $config);
//控制器初始化 //控制器初始化
if(method_exists($this,'_initialize')) if(method_exists($this, '_initialize'))
$this->_initialize(); $this->_initialize();
} }
@@ -36,38 +38,38 @@ class Controller {
* 加载模板和页面输出 可以返回输出内容 * 加载模板和页面输出 可以返回输出内容
* @access public * @access public
* @param string $template 模板文件名 * @param string $template 模板文件名
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @param string $cacheId 模板缓存标识 * @param string $cache_id 模板缓存标识
* @return mixed * @return mixed
*/ */
public function display($template='',$vars=[],$cacheId=''){ public function display($template = '', $vars = [], $cache_id = ''){
$this->view->display($template,$vars,$cacheId); $this->view->display($template, $vars, $cache_id);
} }
/** /**
* 渲染内容输出 * 渲染内容输出
* @access public * @access public
* @param string $content 内容 * @param string $content 内容
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @return mixed * @return mixed
*/ */
public function show($content,$vars=[]){ public function show($content, $vars = []){
$this->view->http('http_render_content',true)->display($content,$vars); $this->view->http('http_render_content', true)->display($content, $vars);
} }
/** /**
* 模板变量赋值 * 模板变量赋值
* @access protected * @access protected
* @param mixed $name 要显示的模板变量 * @param mixed $name 要显示的模板变量
* @param mixed $value 变量的值 * @param mixed $value 变量的值
* @return void * @return void
*/ */
public function assign($name,$value=''){ public function assign($name, $value = ''){
$this->view->assign($name,$value); $this->view->assign($name, $value);
} }
public function __set($name,$value){ public function __set($name, $value){
return $this->assign($name,$value); return $this->assign($name, $value);
} }
/** /**
@@ -77,29 +79,39 @@ class Controller {
* @param String $type AJAX返回数据格式 * @param String $type AJAX返回数据格式
* @return void * @return void
*/ */
protected function ajaxReturn($data,$type='') { protected function ajaxReturn($data, $type='') {
if(empty($type)) $type = C('default_ajax_return'); if(empty($type)) $type = C('default_ajax_return');
switch (strtoupper($type)){ switch (strtoupper($type)){
case 'JSON' : case 'JSON':
// 返回JSON数据格式到客户端 包含状态信息 // 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8'); header('Content-Type:application/json; charset=utf-8');
exit(json_encode($data)); exit(json_encode($data));
case 'XML' : case 'XML':
// 返回xml格式数据 // 返回xml格式数据
header('Content-Type:text/xml; charset=utf-8'); header('Content-Type:text/xml; charset=utf-8');
exit(xml_encode($data)); exit(xml_encode($data));
case 'JSONP': case 'JSONP':
// 返回JSON数据格式到客户端 包含状态信息 // 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8'); header('Content-Type:application/javascript; charset=utf-8');
$handler = isset($_GET[C('var_jsonp_handler')]) ? $_GET[C('var_jsonp_handler')] : C('default_jsonp_handler'); $handler = isset($_GET[C('var_jsonp_handler')]) ? $_GET[C('var_jsonp_handler')] : C('default_jsonp_handler');
exit($handler.'('.json_encode($data).');'); exit($handler . '(' . json_encode($data) . ');');
case 'EVAL' : case 'SCRIPT':
// 返回可执行的js脚本 // 返回可执行的js脚本
header('Content-Type:text/html; charset=utf-8'); header('Content-Type:application/javascript; charset=utf-8');
exit($data); exit($data);
default : case 'HTML':
// 返回html片段
header('Content-Type:text/html; charset=utf-8');
echo $data;
exit;
case 'TEXT':
// 返回一段纯文本
header('Content-Type:text/plain; charset=utf-8');
echo $data;
exit;
default:
// 用于扩展其他返回格式数据 // 用于扩展其他返回格式数据
Tag::listen('ajax_return',$data); Tag::listen('ajax_return', $data);
} }
} }
@@ -108,11 +120,11 @@ class Controller {
* @access protected * @access protected
* @param string $message 错误信息 * @param string $message 错误信息
* @param string $jumpUrl 页面跳转地址 * @param string $jumpUrl 页面跳转地址
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @return void * @return void
*/ */
protected function error($message,$jumpUrl='',$ajax=false) { protected function error($message, $jumpUrl = '', $ajax = false) {
$this->dispatchJump($message,0,$jumpUrl,$ajax); $this->dispatchJump($message, 0, $jumpUrl, $ajax);
} }
/** /**
@@ -120,52 +132,52 @@ class Controller {
* @access protected * @access protected
* @param string $message 提示信息 * @param string $message 提示信息
* @param string $jumpUrl 页面跳转地址 * @param string $jumpUrl 页面跳转地址
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @return void * @return void
*/ */
protected function success($message,$jumpUrl='',$ajax=false) { protected function success($message, $jumpUrl = '', $ajax = false) {
$this->dispatchJump($message,1,$jumpUrl,$ajax); $this->dispatchJump($message, 1, $jumpUrl, $ajax);
} }
/** /**
* 默认跳转操作 支持错误导向和正确跳转 * 默认跳转操作 支持错误导向和正确跳转
* 调用模板显示 默认为public目录下面的success页面 * 调用模板显示 默认为public目录下面的success页面
* 提示页面为可配置 支持模板标签 * 提示页面为可配置 支持模板标签
* @param string $message 提示信息
* @param Boolean $status 状态
* @param string $jumpUrl 页面跳转地址
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @access private * @access private
* @param string $message 提示信息
* @param Boolean $status 状态
* @param string $jumpUrl 页面跳转地址
* @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
* @return void * @return void
*/ */
private function dispatchJump($message,$status=1,$jumpUrl='',$ajax=false) { private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false) {
if(true === $ajax || IS_AJAX) {// AJAX提交 if(true === $ajax || IS_AJAX) {// AJAX提交
$data = is_array($ajax)?$ajax:[]; $data = is_array($ajax) ? $ajax : [];
$data['info'] = $message; $data['info'] = $message;
$data['status'] = $status; $data['status'] = $status;
$data['url'] = $jumpUrl; $data['url'] = $jumpUrl;
$this->ajaxReturn($data); $this->ajaxReturn($data);
} }
if(is_int($ajax)) $this->view->assign('waitSecond',$ajax); if(is_int($ajax)) $this->view->assign('waitSecond', $ajax);
if(!empty($jumpUrl)) $this->view->assign('jumpUrl',$jumpUrl); if(!empty($jumpUrl)) $this->view->assign('jumpUrl', $jumpUrl);
// 提示标题 // 提示标题
$this->view->assign('msgTitle',$status? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_')); $this->view->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
$this->view->assign('status',$status); // 状态 $this->view->assign('status', $status); // 状态
//保证输出不受静态缓存影响 //保证输出不受静态缓存影响
C('HTML_CACHE_ON',false); C('HTML_CACHE_ON',false);
if($status) { //发送成功信息 if($status) { //发送成功信息
$this->view->assign('message',$message);// 提示信息 $this->view->assign('message', $message);// 提示信息
// 成功操作后默认停留1秒 // 成功操作后默认停留1秒
$this->view->assign('waitSecond','1'); $this->view->assign('waitSecond', '1');
// 默认操作成功自动返回操作前页面 // 默认操作成功自动返回操作前页面
if(!$jumpUrl) $this->view->assign("jumpUrl",$_SERVER["HTTP_REFERER"]); if(!$jumpUrl) $this->view->assign("jumpUrl", $_SERVER["HTTP_REFERER"]);
$this->display(C('success_tmpl')); $this->display(C('success_tmpl'));
}else{ }else{
$this->view->assign('error',$message);// 提示信息 $this->view->assign('error', $message);// 提示信息
//发生错误时候默认停留3秒 //发生错误时候默认停留3秒
$this->view->assign('waitSecond','3'); $this->view->assign('waitSecond', '3');
// 默认发生错误的话自动返回上页 // 默认发生错误的话自动返回上页
if(!$jumpUrl) $this->view->assign('jumpUrl',"javascript:history.back(-1);"); if(!$jumpUrl) $this->view->assign('jumpUrl', 'javascript:history.back(-1);');
$this->display(C('error_tmpl')); $this->display(C('error_tmpl'));
// 中止执行 避免出错后继续执行 // 中止执行 避免出错后继续执行
exit ; exit ;

View File

@@ -33,12 +33,12 @@ class View {
/** /**
* 模板变量赋值 * 模板变量赋值
* @access public * @access public
* @param mixed $name * @param mixed $name 变量名
* @param mixed $value * @param mixed $value 变量值
*/ */
public function assign($name,$value=''){ public function assign($name, $value = ''){
if(is_array($name)) { if(is_array($name)) {
$this->data = array_merge($this->data,$name); $this->data = array_merge($this->data, $name);
return $this; return $this;
}else { }else {
$this->data[$name] = $value; $this->data[$name] = $value;
@@ -51,12 +51,12 @@ class View {
* @param mixed $name * @param mixed $name
* @param mixed $value * @param mixed $value
*/ */
public function __set($name,$value=''){ public function __set($name, $value = ''){
$this->config[$name] = $value; $this->config[$name] = $value;
} }
public function __construct(array $config=[]){ public function __construct(array $config = []){
$this->config = array_merge($this->config,$config); $this->config = array_merge($this->config, $config);
} }
/** /**
@@ -66,8 +66,8 @@ class View {
* @param array $config 引擎参数 * @param array $config 引擎参数
* @return View * @return View
*/ */
public function engine($engine,$config=[]){ public function engine($engine, array $config = []){
$class = '\\Think\\View\\Driver\\'.ucwords($engine); $class = '\\Think\\View\\Driver\\' . ucwords($engine);
$this->engine = new $class($config); $this->engine = new $class($config);
return $this; return $this;
} }
@@ -75,7 +75,7 @@ class View {
/** /**
* 设置当前输出的模板主题 * 设置当前输出的模板主题
* @access public * @access public
* @param mixed $theme 主题名称 * @param mixed $theme 主题名称
* @return View * @return View
*/ */
public function theme($theme){ public function theme($theme){
@@ -94,17 +94,17 @@ class View {
/** /**
* 加载模板和页面输出 可以返回输出内容 * 加载模板和页面输出 可以返回输出内容
* @access public * @access public
* @param string $template 模板文件名 * @param string $template 模板文件名
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @param string $cacheId 模板缓存标识 * @param string $cache_id 模板缓存标识
* @return mixed * @return mixed
*/ */
public function display($template='',$vars=[],$cacheId='') { public function display($template = '', $vars = [], $cache_id = '') {
Tag::listen('view_begin',$template); Tag::listen('view_begin', $template);
// 解析并获取模板内容 // 解析并获取模板内容
$content = $this->fetch($template,$vars,$cacheId); $content = $this->fetch($template, $vars, $cache_id);
// 输出内容过滤 // 输出内容过滤
Tag::listen('view_filter',$content); Tag::listen('view_filter', $content);
// 输出模板内容 // 输出模板内容
if($this->config['http_output_content']) { if($this->config['http_output_content']) {
$this->render($content); $this->render($content);
@@ -117,26 +117,26 @@ class View {
* 解析和获取模板内容 用于输出 * 解析和获取模板内容 用于输出
* @access protected * @access protected
* @param string $template 模板文件名或者内容 * @param string $template 模板文件名或者内容
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @param string $cacheId 模板缓存标识 * @param string $cache_id 模板缓存标识
* @return string * @return string
*/ */
protected function fetch($template,$vars=[],$cacheId='') { protected function fetch($template, $vars = [], $cache_id='') {
if(!$this->config['http_render_content']) { if(!$this->config['http_render_content']) {
$template = $this->parseTemplate($template); $template = $this->parseTemplate($template);
// 模板不存在 抛出异常 // 模板不存在 抛出异常
if(!is_file($template)) if(!is_file($template))
E('template file not exists:'.$template); E('template file not exists:' . $template);
} }
$vars = $vars ? $vars : $this->data; $vars = $vars ? $vars : $this->data;
// 页面缓存 // 页面缓存
ob_start(); ob_start();
ob_implicit_flush(0); ob_implicit_flush(0);
if($this->engine) { // 指定模板引擎 if($this->engine) { // 指定模板引擎
$this->engine->fetch($template,$vars,$cacheId); $this->engine->fetch($template, $vars, $cache_id);
}else{ // 原生PHP解析 }else{ // 原生PHP解析
extract($vars, EXTR_OVERWRITE); extract($vars, EXTR_OVERWRITE);
is_file($template)?include $template:eval('?>'.$template); is_file($template) ? include $template : eval('?>' . $template);
} }
// 获取并清空缓存 // 获取并清空缓存
return ob_get_clean(); return ob_get_clean();
@@ -152,17 +152,17 @@ class View {
if(is_file($template)) { if(is_file($template)) {
return $template; return $template;
} }
$template = str_replace(':','/',$template); $template = str_replace(':', '/', $template);
// 获取当前主题名称 // 获取当前主题名称
$theme = $this->getTemplateTheme(); $theme = $this->getTemplateTheme();
// 分析模板文件规则 // 分析模板文件规则
if('' == $template) { if('' == $template) {
// 如果模板文件名为空 按照默认规则定位 // 如果模板文件名为空 按照默认规则定位
$template = CONTROLLER_NAME.'/'.ACTION_NAME; $template = CONTROLLER_NAME . '/' . ACTION_NAME;
}elseif(false === strpos($template,'/')){ }elseif(false === strpos($template, '/')){
$template = CONTROLLER_NAME.'/'.$template; $template = CONTROLLER_NAME . '/' . $template;
} }
return ($this->config['view_path'] ? $this->config['view_path'] : MODULE_PATH.'View/').$theme.$template.$this->config['view_suffix']; return ($this->config['view_path'] ? $this->config['view_path'] : MODULE_PATH . 'View/').$theme.$template.$this->config['view_suffix'];
} }
/** /**
@@ -182,14 +182,14 @@ class View {
}elseif(Cookie::get('think_theme')){ }elseif(Cookie::get('think_theme')){
$theme = Cookie::get('think_theme'); $theme = Cookie::get('think_theme');
} }
if(!is_dir(MODULE_PATH.'View/'.$theme)) { if(!is_dir(MODULE_PATH . 'View/' . $theme)) {
$theme = $this->config['default_theme']; $theme = $this->config['default_theme'];
} }
Cookie::set('think_theme',$theme,864000); Cookie::set('think_theme', $theme, 864000);
}else{ }else{
$theme = $this->config['default_theme']; $theme = $this->config['default_theme'];
} }
return $theme.'/'; return $theme . '/';
} }
return ''; return '';
} }
@@ -200,9 +200,9 @@ class View {
* @param mixed $config * @param mixed $config
* @param mixed $value * @param mixed $value
*/ */
public function http($config=[],$value=''){ public function http($config = [], $value = ''){
if(is_array($config)) { if(is_array($config)) {
$this->config = array_merge($this->config,$config); $this->config = array_merge($this->config, $config);
}else{ }else{
$this->config[$config] = $value; $this->config[$config] = $value;
} }
@@ -219,8 +219,8 @@ class View {
*/ */
private function render($content){ private function render($content){
// 网页字符编码 // 网页字符编码
header('Content-Type:'.$this->config['http_content_type'].'; charset='.$this->config['http_charset']); header('Content-Type:' . $this->config['http_content_type'] . '; charset=' . $this->config['http_charset']);
header('Cache-control: '.$this->config['http_cache_control']); // 页面缓存控制 header('Cache-control:' . $this->config['http_cache_control']); // 页面缓存控制
header('X-Powered-By:ThinkPHP'); header('X-Powered-By:ThinkPHP');
// 输出模板文件 // 输出模板文件
echo $content; echo $content;