PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/book/SpeedPHP/Core/spView.php

http://student-test.googlecode.com/
PHP | 297 lines | 248 code | 6 blank | 43 comment | 25 complexity | 79e70c648d6dc6b26fe3307a78466742 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-3.0
  1. <?php
  2. /////////////////////////////////////////////////////////////////
  3. // SpeedPHP??PHP??, Copyright (C) 2008 - 2010 SpeedPHP.com //
  4. /////////////////////////////////////////////////////////////////
  5. /**
  6. * spView ?????
  7. */
  8. class spView {
  9. /**
  10. * ??????
  11. */
  12. public $engine = null;
  13. /**
  14. * ???????
  15. */
  16. public $displayed = FALSE;
  17. /**
  18. * ?????????????????
  19. */
  20. public function __construct()
  21. {
  22. if(FALSE == $GLOBALS['G_SP']['view']['enabled'])return FALSE;
  23. if(FALSE != $GLOBALS['G_SP']['view']['auto_ob_start'])ob_start();
  24. $this->engine = spClass($GLOBALS['G_SP']['view']['engine_name'],null,$GLOBALS['G_SP']['view']['engine_path']);
  25. if( $GLOBALS['G_SP']['view']['config'] && is_array($GLOBALS['G_SP']['view']['config']) ){
  26. $engine_vars = get_class_vars(get_class($this->engine));
  27. foreach( $GLOBALS['G_SP']['view']['config'] as $key => $value ){
  28. if( array_key_exists($key,$engine_vars) )$this->engine->{$key} = $value;
  29. }
  30. }
  31. if( !empty($GLOBALS['G_SP']['sp_app_id']) && isset($this->engine->compile_id) )$this->engine->compile_id = $GLOBALS['G_SP']['sp_app_id'];
  32. if( empty($this->engine->no_compile_dir) ){
  33. @memcache_init();
  34. $path_compile="saemc://templates_c/";
  35. $path_cache="saemc://cached";
  36. $this->engine->compile_dir = $path_compile;
  37. $this->engine->cache_dir = $path_cache;
  38. }
  39. spAddViewFunction('T', array( 'spView', '__template_T'));
  40. spAddViewFunction('spUrl', array( 'spView', '__template_spUrl'));
  41. }
  42. /**
  43. * ????
  44. * @param tplname ??????
  45. */
  46. public function display($tplname)
  47. {
  48. try {
  49. $this->addfuncs();
  50. $this->displayed = TRUE;
  51. if($GLOBALS['G_SP']['view']['debugging'] && SP_DEBUG)$this->engine->debugging = TRUE;
  52. $this->engine->display($tplname);
  53. } catch (Exception $e) {
  54. spError( $GLOBALS['G_SP']['view']['engine_name']. ' Error: '.$e->getMessage() );
  55. }
  56. }
  57. /**
  58. * ??????????
  59. */
  60. public function addfuncs()
  61. {
  62. if( is_array($GLOBALS['G_SP']["view_registered_functions"]) ){
  63. foreach( $GLOBALS['G_SP']["view_registered_functions"] as $alias => $func ){
  64. if( is_array($func) && !is_object($func[0]) )$func = array(spClass($func[0]),$func[1]);
  65. $this->engine->registerPlugin("function", $alias, $func);
  66. unset($GLOBALS['G_SP']["view_registered_functions"][$alias]);
  67. }
  68. }
  69. }
  70. /**
  71. * ??spUrl?????spUrl????????
  72. * @param params ?????
  73. */
  74. public function __template_spUrl($params)
  75. {
  76. $controller = $GLOBALS['G_SP']["default_controller"];
  77. $action = $GLOBALS['G_SP']["default_action"];
  78. $args = array();
  79. $anchor = null;
  80. foreach($params as $key => $param){
  81. if( $key == $GLOBALS['G_SP']["url_controller"] ){
  82. $controller = $param;
  83. }elseif( $key == $GLOBALS['G_SP']["url_action"] ){
  84. $action = $param;
  85. }elseif( $key == 'anchor' ){
  86. $anchor = $param;
  87. }else{
  88. $args[$key] = $param;
  89. }
  90. }
  91. return spUrl($controller, $action, $args, $anchor);
  92. }
  93. /**
  94. * ??T?????T????????
  95. * @param params ?????
  96. */
  97. public function __template_T($params)
  98. {
  99. return T($params['w']);
  100. }
  101. }
  102. /**
  103. * spHtml
  104. * ??HTML???
  105. */
  106. class spHtml
  107. {
  108. private $spurls = null;
  109. /**
  110. * ????????
  111. *
  112. * @param spurl spUrl???
  113. * @param alias_url ??HTML???????????alias_url????????????????????????HTML???
  114. * @param update_mode ???????2??????????
  115. * 0??????
  116. * 1??????
  117. */
  118. public function make($spurl, $alias_url = null, $update_mode = 2)
  119. {
  120. if(1 == spAccess('r','sp_html_making')){$this->spurls[] = array($spurl, $alias_url); return;}
  121. @list($controller, $action, $args, $anchor) = $spurl;
  122. if( $url_item = spHtml::getUrl($controller, $action, $args, $anchor, TRUE) ){
  123. @list($baseuri, $realfile) = $url_item;$update_mode = 1;
  124. }else{
  125. $file_root_name = ( '' == $GLOBALS['G_SP']['html']['file_root_name'] ) ?
  126. '' : $GLOBALS['G_SP']['html']['file_root_name'].'/';
  127. if( null == $alias_url ){
  128. $filedir = $file_root_name .date('Y/n/d').'/';
  129. $filename = substr(time(),3,10).substr(mt_rand(100000, substr(time(),3,10)),4).".html";
  130. }else{
  131. $filedir = $file_root_name.dirname($alias_url) . '/';
  132. $filename = basename($alias_url);
  133. }
  134. $baseuri = rtrim(dirname($GLOBALS['G_SP']['url']["url_path_base"]), '/\\')."/".$filedir.$filename;
  135. $realfile = APP_PATH."/".$filedir.$filename;
  136. }
  137. if( 0 == $update_mode or 2 == $update_mode )spHtml::setUrl($spurl, $baseuri, $realfile);
  138. if( 1 == $update_mode or 2 == $update_mode ){
  139. $remoteurl = 'http://'.$_SERVER["SERVER_NAME"].':'.$_SERVER['SERVER_PORT'].
  140. '/'.ltrim(spUrl($controller, $action, $args, $anchor, TRUE), '/\\');
  141. $cachedata = file_get_contents($remoteurl);
  142. if( FALSE === $cachedata ){
  143. $cachedata = $this->curl_get_file_contents($remoteurl);
  144. if( FALSE === $cachedata )spError("????????????????<br />1. spUrl?????????<a href='{$remoteurl}' target='_blank'>??????</a>?<br />2. ??php.ini?allow_url_fopen?On?<br />3. ??????????APACHE/PHP?????<br />4. ????CURL????");
  145. }
  146. __mkdirs(dirname($realfile));
  147. file_put_contents($realfile, $cachedata);
  148. }
  149. }
  150. /**
  151. * ?file_get_contents?????????CURL???????????
  152. * @param url ????
  153. */
  154. function curl_get_file_contents($url)
  155. {
  156. if(!function_exists('curl_init'))return FALSE;
  157. $c = curl_init();
  158. curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  159. curl_setopt($c, CURLOPT_URL, $url);
  160. $contents = curl_exec($c);
  161. curl_close($c);
  162. if (FALSE === $contents)return FALSE;
  163. return $contents;
  164. }
  165. /**
  166. * ????????
  167. * @param spurls ??????????make()?????
  168. */
  169. public function makeAll($spurls)
  170. {
  171. foreach( $spurls as $single ){
  172. list($spurl, $alias_url) = $single;
  173. $this->make($spurl, $alias_url, 0);
  174. }
  175. foreach( $spurls as $single ){
  176. list($spurl, $alias_url) = $single;
  177. $this->make($spurl, $alias_url, 1);
  178. }
  179. }
  180. public function start(){spAccess('w','sp_html_making',1);$this->spurls = null;}
  181. public function commit(){spAccess('c','sp_html_making');$this->makeAll($this->spurls);}
  182. /**
  183. * ??url?????????????????????
  184. * @param controller ???????????'default_controller'
  185. * @param action ??????????'default_action'
  186. * @param args ??????????
  187. * @param anchor ????
  188. * @param force_no_check ????????????
  189. */
  190. public function getUrl($controller = null, $action = null, $args = null, $anchor = null, $force_no_check = FALSE)
  191. {
  192. if( $url_list = spAccess('r', 'sp_url_list') ){
  193. $url_list = explode("\n",$url_list);
  194. $args_en = !empty($args) ? json_encode($args) : "";
  195. $url_input = "{$controller}|{$action}|{$args_en}|$anchor|";
  196. foreach( $url_list as $url ){
  197. if( substr($url,0,strlen($url_input)) == $url_input ){
  198. $url_item = explode("|",substr($url,strlen($url_input)));
  199. if( TRUE == $GLOBALS['G_SP']['html']['safe_check_file_exists'] && TRUE != $force_no_check ){
  200. if( !is_readable($url_item[1]) )return FALSE;
  201. }
  202. return $url_item;
  203. }
  204. }
  205. }
  206. return FALSE;
  207. }
  208. /**
  209. * ??url???????make???????spUrl????????????
  210. *
  211. * @param spurl spUrl???
  212. * @param baseuri URL???????HTML??????
  213. *
  214. */
  215. public function setUrl($spurl, $baseuri, $realfile)
  216. {
  217. @list($controller, $action, $args, $anchor) = $spurl;
  218. $this->clear($controller, $action, $args, $anchor, FALSE);
  219. $args = !empty($args) ? json_encode($args) : '';
  220. $url_input = "{$controller}|{$action}|{$args}|{$anchor}|{$baseuri}|{$realfile}";
  221. if( $url_list = spAccess('r', 'sp_url_list') ){
  222. spAccess('w', 'sp_url_list', $url_list."\n".$url_input);
  223. }else{
  224. spAccess('w', 'sp_url_list', $url_input);
  225. }
  226. }
  227. /**
  228. * ??????
  229. *
  230. * @param controller ????HTML????????
  231. * @param action ????HTML????????????????????????HTML??
  232. * ?????action?????action???HTML??
  233. *
  234. * @param args ???????????????????????HTML??
  235. * ?????args???????????args????HTML??
  236. *
  237. * @param anchor ??????????????????????HTML??
  238. * ?????anchor????????????anchor???HTML??
  239. *
  240. * @param delete_file ?????????FALSE?????????????????????????
  241. */
  242. public function clear($controller, $action = null, $args = FALSE, $anchor = '', $delete_file = TRUE)
  243. {
  244. if( $url_list = spAccess('r', 'sp_url_list') ){
  245. $url_list = explode("\n",$url_list);$re_url_list = array();
  246. if( null == $action ){
  247. $prep = "{$controller}|";
  248. }elseif( FALSE === $args ){
  249. $prep = "{$controller}|{$action}|";
  250. }else{
  251. $args = !empty($args) ? json_encode($args) : '';
  252. $prep = "{$controller}|{$action}|{$args}|{$anchor}|";
  253. }
  254. foreach( $url_list as $url ){
  255. if( substr($url,0,strlen($prep)) == $prep ){
  256. $url_tmp = explode("|",$url);$realfile = $url_tmp[5];
  257. if( TRUE == $delete_file )@unlink($realfile);
  258. }else{
  259. $re_url_list[] = $url;
  260. }
  261. }
  262. spAccess('w', 'sp_url_list', join("\n", $re_url_list));
  263. }
  264. }
  265. /**
  266. * ????????
  267. *
  268. * @param delete_file ?????????FALSH?????????????????????????
  269. */
  270. public function clearAll($delete_file = FALSE)
  271. {
  272. if( TRUE == $delete_file ){
  273. if( $url_list = spAccess('r', 'sp_url_list') ){
  274. $url_list = explode("\n",$url_list);
  275. foreach( $url_list as $url ){
  276. $url_tmp = explode("|",$url);$realfile = $url_tmp[5];
  277. @unlink($realfile);
  278. }
  279. }
  280. }
  281. spAccess('c', 'sp_url_list');
  282. }
  283. }