PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tp/core/Lib/Core/View.class.php

https://github.com/398360167/workflow
PHP | 227 lines | 113 code | 12 blank | 102 comment | 20 complexity | 09507e91e76849a1bd6c1d89d226ded3 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-2.1
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. /**
  12. * ThinkPHP 视图类
  13. * @category Think
  14. * @package Think
  15. * @subpackage Core
  16. * @author liu21st <liu21st@gmail.com>
  17. */
  18. class View {
  19. /**
  20. * 模板输出变量
  21. * @var tVar
  22. * @access protected
  23. */
  24. protected $tVar = array();
  25. /**
  26. * 模板主题
  27. * @var theme
  28. * @access protected
  29. */
  30. protected $theme = '';
  31. /**
  32. * 模板变量赋值
  33. * @access public
  34. * @param mixed $name
  35. * @param mixed $value
  36. */
  37. public function assign($name,$value=''){
  38. if(is_array($name)) {
  39. $this->tVar = array_merge($this->tVar,$name);
  40. }else {
  41. $this->tVar[$name] = $value;
  42. }
  43. }
  44. /**
  45. * 取得模板变量的值
  46. * @access public
  47. * @param string $name
  48. * @return mixed
  49. */
  50. public function get($name=''){
  51. if('' === $name) {
  52. return $this->tVar;
  53. }
  54. return isset($this->tVar[$name])?$this->tVar[$name]:false;
  55. }
  56. /**
  57. * 加载模板和页面输出 可以返回输出内容
  58. * @access public
  59. * @param string $templateFile 模板文件名
  60. * @param string $charset 模板输出字符集
  61. * @param string $contentType 输出类型
  62. * @param string $content 模板输出内容
  63. * @param string $prefix 模板缓存前缀
  64. * @return mixed
  65. */
  66. public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') {
  67. G('viewStartTime');
  68. // 视图开始标签
  69. tag('view_begin',$templateFile);
  70. // 解析并获取模板内容
  71. $content = $this->fetch($templateFile,$content,$prefix);
  72. // 输出模板内容
  73. $this->render($content,$charset,$contentType);
  74. // 视图结束标签
  75. tag('view_end');
  76. }
  77. /**
  78. * 输出内容文本可以包括Html
  79. * @access private
  80. * @param string $content 输出内容
  81. * @param string $charset 模板输出字符集
  82. * @param string $contentType 输出类型
  83. * @return mixed
  84. */
  85. private function render($content,$charset='',$contentType=''){
  86. if(empty($charset)) $charset = C('DEFAULT_CHARSET');
  87. if(empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE');
  88. // 网页字符编码
  89. header('Content-Type:'.$contentType.'; charset='.$charset);
  90. header('Cache-control: '.C('HTTP_CACHE_CONTROL')); // 页面缓存控制
  91. header('X-Powered-By:ThinkPHP');
  92. // 输出模板文件
  93. echo $content;
  94. }
  95. /**
  96. * 解析和获取模板内容 用于输出
  97. * @access public
  98. * @param string $templateFile 模板文件名
  99. * @param string $content 模板输出内容
  100. * @param string $prefix 模板缓存前缀
  101. * @return string
  102. */
  103. public function fetch($templateFile='',$content='',$prefix='') {
  104. if(empty($content)) {
  105. $templateFile = $this->parseTemplate($templateFile);
  106. // 模板文件不存在直接返回
  107. if(!is_file($templateFile))
  108. throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']');
  109. }
  110. // 页面缓存
  111. ob_start();
  112. ob_implicit_flush(0);
  113. if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
  114. // 模板阵列变量分解成为独立变量
  115. extract($this->tVar, EXTR_OVERWRITE);
  116. // 直接载入PHP模板
  117. empty($content)?include $templateFile:eval('?>'.$content);
  118. }else{
  119. // 视图解析标签
  120. $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);
  121. tag('view_parse',$params);
  122. }
  123. // 获取并清空缓存
  124. $content = ob_get_clean();
  125. // 内容过滤标签
  126. tag('view_filter',$content);
  127. // 输出模板文件
  128. return $content;
  129. }
  130. /**
  131. * 自动定位模板文件
  132. * @access protected
  133. * @param string $template 模板文件规则
  134. * @return string
  135. */
  136. public function parseTemplate($template='') {
  137. $app_name=APP_NAME==basename(dirname($_SERVER['SCRIPT_FILENAME'])) && ''==__APP__?'':APP_NAME.'/';
  138. if(is_file($template)) {
  139. $group = defined('GROUP_NAME')?GROUP_NAME.'/':'';
  140. $theme = C('DEFAULT_THEME');
  141. // 获取当前主题的模版路径
  142. if(1==C('APP_GROUP_MODE')){ // 独立分组模式
  143. define('THEME_PATH', dirname(BASE_LIB_PATH).'/'.$group.basename(TMPL_PATH).'/'.$theme);
  144. define('APP_TMPL_PATH',__ROOT__.'/'.$app_name.C('APP_GROUP_PATH').'/'.$group.basename(TMPL_PATH).'/'.$theme);
  145. }else{
  146. define('THEME_PATH', TMPL_PATH.$group.$theme);
  147. define('APP_TMPL_PATH',__ROOT__.'/'.$app_name.basename(TMPL_PATH).'/'.$group.$theme);
  148. }
  149. return $template;
  150. }
  151. $depr = C('TMPL_FILE_DEPR');
  152. $template = str_replace(':', $depr, $template);
  153. // 获取当前主题名称
  154. $theme = $this->getTemplateTheme();
  155. // 获取当前模版分组
  156. $group = defined('GROUP_NAME')?GROUP_NAME.'/':'';
  157. if(defined('GROUP_NAME') && strpos($template,'@')){ // 跨分组调用模版文件
  158. list($group,$template) = explode('@',$template);
  159. $group .= '/';
  160. }
  161. // 获取当前主题的模版路径
  162. if(1==C('APP_GROUP_MODE')){ // 独立分组模式
  163. define('THEME_PATH', dirname(BASE_LIB_PATH).'/'.$group.basename(TMPL_PATH).'/'.$theme);
  164. define('APP_TMPL_PATH',__ROOT__.'/'.$app_name.C('APP_GROUP_PATH').'/'.$group.basename(TMPL_PATH).'/'.$theme);
  165. }else{
  166. define('THEME_PATH', TMPL_PATH.$group.$theme);
  167. define('APP_TMPL_PATH',__ROOT__.'/'.$app_name.basename(TMPL_PATH).'/'.$group.$theme);
  168. }
  169. // 分析模板文件规则
  170. if('' == $template) {
  171. // 如果模板文件名为空 按照默认规则定位
  172. $template = MODULE_NAME . $depr . ACTION_NAME;
  173. }elseif(false === strpos($template, '/')){
  174. $template = MODULE_NAME . $depr . $template;
  175. }
  176. return THEME_PATH.$template.C('TMPL_TEMPLATE_SUFFIX');
  177. }
  178. /**
  179. * 设置当前输出的模板主题
  180. * @access public
  181. * @param mixed $theme 主题名称
  182. * @return View
  183. */
  184. public function theme($theme){
  185. $this->theme = $theme;
  186. return $this;
  187. }
  188. /**
  189. * 获取当前的模板主题
  190. * @access private
  191. * @return string
  192. */
  193. private function getTemplateTheme() {
  194. if($this->theme) { // 指定模板主题
  195. $theme = $this->theme;
  196. }else{
  197. /* 获取模板主题名称 */
  198. $theme = C('DEFAULT_THEME');
  199. if(C('TMPL_DETECT_THEME')) {// 自动侦测模板主题
  200. $t = C('VAR_TEMPLATE');
  201. if (isset($_GET[$t])){
  202. $theme = $_GET[$t];
  203. }elseif(cookie('think_template')){
  204. $theme = cookie('think_template');
  205. }
  206. if(!in_array($theme,explode(',',C('THEME_LIST')))){
  207. $theme = C('DEFAULT_THEME');
  208. }
  209. cookie('think_template',$theme,864000);
  210. }
  211. }
  212. define('THEME_NAME', $theme); // 当前模板主题名称
  213. return $theme?$theme . '/':'';
  214. }
  215. }