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

View File

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