ホームページ  >  記事  >  バックエンド開発  >  DolrPHP テンプレート エンジン DolrViews 共有

DolrPHP テンプレート エンジン DolrViews 共有

WBOY
WBOYオリジナル
2016-06-13 13:20:381115ブラウズ

【分享】DolrPHPモジュール板引擎DolrViews分享
核心文件:DolrViews.class.php:

  1. /**
  2. * DolrPHP テンプレート エンジン
  3. * @author Joychao
  4. * @version 1.0 beta
  5. * @license http: //www.Joychao.cc
  6. */
  7. define('DOLRVIEWS') または define('DOLRVIEWS',true);
  8. define ('DIR_SEP') またはdefine('DIR_SEP',DIRECTORY_SEPARATOR);
  9. class DolrViews
  10. {
  11. /**
  12. * シングルトン オブジェクト
  13. *
  14. * @static var
  15. * @var オブジェクト DolrViews
  16. */
  17. protected static $_instance;
  18. /**
  19. * テンプレート変数
  20. *
  21. * @var array
  22. */
  23. protected $_tpl_vars=array();
  24. /**
  25. * テンプレートパラメータ情報
  26. *
  27. * @var array
  28. */
  29. protected $_options=array(
  30. 'template_dir'=>'テンプレート',
  31. 'compile_dir'=>' templates_c',
  32. 'cache_dir'=>'cache',
  33. 'caching'=>false,
  34. 'cache_lifetime'=>3600,
  35. 'plugins_dir'=>'plugins',
  36. 'tpl_suffix'=>'html',
  37. 'php_handing'=>false,
  38. ) ;
  39. /**
  40. * 含まれるプラグイン
  41. * @var array
  42. */
  43. protected $includePlugins=array();
  44. /**
  45. * メインテンプレートを含まないテンプレート
  46. * @var string
  47. */
  48. protected $mainTplFileName;
  49. /**
  50. * シングルトンモード呼び出しメソッド
  51. *
  52. * @static
  53. * @return object DolrViews
  54. */
  55. public static function getInstance($options=array) ()) {
  56. if (!self :: $_instance instanceof self)
  57. self :: $_instance = new self($options);
  58. return self :: $_instance;
  59. }
  60. /**
  61. * コンストラクター、すべての構成を初期化します
  62. *
  63. * @param array $config=array(); 構成配列
  64. * @example:
  65. * $_options=array(
  66. * 'template_dir'=>'テンプレート',
  67. * 'compile_dir'=>'templates_c',
  68. * 'cache_dir'=>'cache',
  69. * 'caching'=>false,
  70. * 'cache_lifetime'=>3600,
  71. * ' plugins_dir '=>'プラグイン',
  72. * 'php_handing'=>false,
  73. * );
  74. * $tpl=new DolrViews($_options); 🎜>
  75. */
  76. パブリック関数 __construct($options=array())
  77. {
  78. if (!empty($options))
  79. {
  80. $this->setOptions($options);
  81. }
  82. }
  83. /**
  84. * 変数をテンプレートに割り当てます
  85. *
  86. * @param string $varName 変数名
  87. * @parammixed $varValue 変数値
  88. */
  89. public function assign($varName,$varValue)
  90. {
  91. $this->tpl_vars[$varName]=&$varValue;
  92. }
  93. /**
  94. * ページへの出力を表示
  95. *
  96. * @param string $tplFileName テンプレート ファイル名
  97. */
  98. public function display($tplFileName,$cacheId=null)
  99. {
  100. $cacheId=is_null($cacheId)?$_SERVER['REQUEST_URI']:$cacheId;
  101. $this->mainTplFileName=$tplFileName;
  102. $tplFilePath=$this->_getTplPath($tplFileName);
  103. extract($this->_tpl_vars) ;
  104. //内置变量
  105. extract($this->gt;_getSystemVars($tplFileName));//系统变量
  106. //存在するかどうか
  107. if($this->_options['caching']){
  108. if($this->isCached($tplFileName,$cacheId)){
  109. include $this-> ;_getCacheFile($tplFileName,$cacheId);
  110. }else{///否か保存文書
  111. include $this->_writeCache($tplFileName,$this->_parseTpl($tplFileName) ,$cacheId),$cacheId);// 写入缓存
  112. }
  113. }else{//非缓存モード
  114. include $this->_parseTpl($ tplFileName,$cacheId);//解析写入编译文件并包含
  115. }
  116. }
  117. /**
  118. * 構成テンプレート オプション
  119. *
  120. * @param array $options 構成配列
  121. */
  122. public function setOptions($options)
  123. {
  124. foreach ($options as $optionName => $optionValue) {
  125. $this->set($optionName,$optionValue);
  126. }
  127. }
  128. /**
  129. * オプションの設定
  130. *
  131. * @param string $optionName オプション名
  132. * @parammixed $optionValue オプション値
  133. */
  134. パブリック関数 __set($optionName,$optionValue)
  135. {
  136. $this->set($optionName,$optionValue) ;
  137. }
  138. /**
  139. * 構成を個別に設定します
  140. *
  141. * @param string $optionName オプション名
  142. * @parammixed $optionValue オプション値
  143. */
  144. public function set($optionName,$optionValue)
  145. {
  146. switch (strto lower($optionName)) {
  147. case 'template_dir':
  148. $optionValue=$this->trimPath($optionValue).DIR_SEP;
  149. if(! file_exists($optionValue))
  150. $this->_throwException('指定されたテンプレート ディレクトリ "'.$optionValue.'" が見つかりませんでした);
  151. $this->_options [ 'template_dir']=$optionValue;
  152. break;
  153. case 'compile_dir':
  154. $optionValue=$this->_trimPath($optionValue).DIR_SEP;
  155. if(!file_exists($optionValue))
  156. $this->_throwException('指定されたコンパイル ディレクトリ "'.$optionValue.'"' が見つかりませんでした);
  157. $this->_options['compile_dir']=$optionValue;
  158. break;
  159. case 'cache_dir':
  160. $optionValue=$this-> ;_trimPath ($optionValue).DIR_SEP;
  161. if(!file_exists($optionValue))
  162. $this->_throwException('指定されたキャッシュ ディレクトリ "'.$optionValue.'"見つかりませんでした ');
  163. $this->_options['cache_dir']=$optionValue;
  164. break;
  165. case 'plugins_dir':
  166. $ optionValue=$this->trimPath($optionValue).DIR_SEP;
  167. if(!file_exists($optionValue))
  168. $this->_throwException('指定されたキャッシュディレクトリが見つかりませんでした "'.$optionValue.'"');
  169. $this->_options['plugins_dir']=$optionValue;
  170. break;
  171. case 'キャッシュ' :
  172. $this->_options['caching']=(boolean)$optionValue;
  173. break;
  174. case 'cache_lifetime':
  175. $this->_options['cache_lifetime']=(float)$optionValue;
  176. break;
  177. case 'php_handing':
  178. $this- >_options[ 'php_handing']=(boolean)$optionValue;
  179. break;
  180. case 'tpl_suffix':
  181. $this->_options['tpl_suffix' ]=trim( $optionValue);
  182. break;
  183. default:
  184. $this -> _throwException("不明なテンプレート構成オプション "$optionName"");
  185. }
  186. }
  187. /**
  188. * テンプレート キャッシュをクリアします
  189. *
  190. * @param string $tplFileName='' テンプレート ファイル名。渡されない場合、すべてのキャッシュが削除されます
  191. * @return ブール値の成功または失敗
  192. */
  193. public function clearCache($ tplFileName=' ',$cacheId=null)
  194. {
  195. $cacheId=is_null($cacheId)?$_SERVER['REQUEST_URI']:$cacheId;
  196. if (!empty ($tplFileName)){
  197. $cacheFile=$this->getCacheFile($tplFileName,$cacheId);
  198. if(file_exists($cacheFile)){
  199. chmod($cacheFile, 0777);
  200. @unlink($cacheFile);
  201. }
  202. }else{//すべてのキャッシュ ファイルを削除します
  203. foreach (glob($this->_options['cache_dir'].'*') as $cacheFile) {
  204. chmod($cacheFile, 0777);
  205. @unlink( $cacheFile) ;
  206. }
  207. }
  208. }
  209. /**
  210. * 指定されたテンプレート ファイルがキャッシュされているかどうかを確認します
  211. *
  212. * @param string $tplFileName テンプレート ファイル名
  213. * @return boolean
  214. */
  215. パブリック関数 isCached( $tplFileName,$cacheId=null)
  216. {
  217. $tplFilePath=$this->_getTplPath($tplFileName);
  218. $cacheId=is_null ($cacheId )?$_SERVER['REQUEST_URI']:$cacheId;
  219. $cacheFile=$this->_getCacheFile($tplFileName,$cacheId);
  220. if(file_exists($ cacheFile) / /
  221. と filemtime($cacheFile)+$this->_options['cache_lifetime']>time()//期限切れではありません
  222. と filemtime($cacheFile) >filemtime ($tplFilePath) //テンプレートは変更されていません
  223. ){//存在しており、期限切れになっていません
  224. return true;
  225. }else{
  226. return false;
  227. }
  228. }
  229. /**
  230. * 組み込み変数の取得
  231. * @return array
  232. */
  233. 保護された関数_getSystemVars($tplFileName){
  234. //組み込み変数
  235. $_sysVars=array();
  236. $_sysVars['dolr_now']=time();
  237. $_sysVars['dolr_get ']=$_GET;
  238. $_sysVars['dolr_post']=$_POST;
  239. $_sysVars['dolr_request']=$_REQUEST;
  240. $_sysVars[' dolr_cookie']=isset($_COOKIE)?$_COOKIE:null;
  241. $_sysVars['dolr_session']=isset($_SESSION)?$_SESSION:null;
  242. $_sysVars[' dolr_template']=basename($tplFileName);
  243. $const=get_dependent_constants(true);
  244. $_sysVars['dolr_const']=$const ['user'];
  245. $_sysVars['dolr_url']="http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
  246. if (!empty($_SERVER['QUERY_STRING' ])){
  247. $_sysVars['dolr_url'].='?'.$_SERVER['QUERY_STRING'];
  248. }
  249. return $_sysVars;
  250. }
  251. /**
  252. * テンプレート ファイルのパスを取得します
  253. *
  254. * @param string $tplFileName template file
  255. * @return string ファイル名
  256. */
  257. 保護された関数 _getTplPath($tplFileName)
  258. {
  259. return $this->_options['template_dir'].$this->_trimPath($tplFileName);
  260. }
  261. /**
  262. * キャッシュされたファイルを取得します
  263. * @param string $tplFileName template file
  264. * @return string ファイル名
  265. */
  266. 保護された関数 _getCacheFile($tplFileName, $cacheId)
  267. {
  268. return $this->_options['cache_dir'].$tplFileName.'.cache.'.md5($cacheId).'.php';
  269. }
  270. /**
  271. * コンパイル済みファイル名を取得します
  272. *
  273. * @param string $tplFileName template file
  274. * @return string ファイル名
  275. */
  276. 保護された関数 _getCompileFile( $tplFileName, $cacheId)
  277. {
  278. return $this->_options['compile_dir'] .$tplFileName.'.compile.php';
  279. }
  280. /**
  281. * 解析されたテンプレート
  282. *
  283. * @param string $tplFileName テンプレート ファイル
  284. * @return string 解析されたコンテンツ
  285. */
  286. 保護された関数 _parseTpl($tplFileName ,$cacheId)
  287. {
  288. $tplFilePath=$this->gt;_getTplPath($tplFileName);
  289. if (!file_exists($tplFilePath) または !is_readable($ tplFilePath)) {
  290. $this->_throwException(' 指定されたモール板文件を打てません'.$tplFileName.'"');
  291. }
  292. $content =file_get_contents($tplFilePath);
  293. //检测包含、检测所有的 include 'xxx.html'
  294. preg_match_all('/[nrt]*[nrt]*/s', $content, $matches);
  295. if(!empty($matches[1])){
  296. foreach ($matches[1] as $key=>$fileName) {
  297. $includeFilePath=$this-> _getTplPath($fileName);
  298. if (!file_exists($includeFilePath) または !is_readable($includeFilePath)) {
  299. $this->_throwException(' 指定されたモジュールファイルを打てません" '.$includeFilePath.'"');
  300. }
  301. $includeCompilePath=$this->_getCompileFile($fileName,$cacheId);// 编译文件名
  302. $this->_parseTpl($fileName,$cacheId);
  303. $content=str_replace($matches[0][$key], '', $content);
  304. }
  305. }
  306. //规则
  307. $pattern=array(
  308. '/ ?>[nr]* /s',//删除 PHP 代打断间多余空格及换行
  309. '/(]+)s*>)/es',// 直接出变量内容
  310. '//s',//包含模板
  311. '/(.+?)/ies',//if /if
  312. '//ies',//elseif
  313. '//is',//else
  314. '/(.+?)(.+?)/ies',//loop $array $v
  315. '/(.+?)/ies',//loop $array $v
  316. '/(.+?)(.+?)/ies',//loop $array $k $v loopelse
  317. '/(.+?)/ies',//loop $array $k $v
  318. '//',//<サイクル 'a','b'>
  319. );
  320. // PHP 格式
  321. $php=array(
  322. ' ',
  323. "$this->_parseVar('\1')",
  324. ' _options['template_dir']."\1';?>",
  325. "$this->_stripvtags('','\2');",
  326. "$this->_stripvtags('','');",
  327. '',
  328. "$this->_stripvtags('','\3\4');",
  329. "$this->_stripvtags('','\ 3n');",
  330. "$this->_stripvtags(' \3) { ?>','\4\ 5');",
  331. "$this->_stripvtags(' \3) { ?>','\4');",
  332. "",
  333. );
  334. $content=preg_replace($pattern, $php, $content);
  335. //プラグインを含める
  336. $pluginsString='';
  337. if($tplFileName==$this->mainTplFileName){// メイン テンプレートの場合は、インクルード ファイル
  338. foreach ($this->includePlugins as $plugin) {
  339. $pluginsString.="include $this->options['plugins_dir'].'{$plugin }';n ";
  340. }
  341. }
  342. $header=<<
  343. /* *
  344. * {$tplFileName}
  345. * DolrViews テンプレート コンパイル ファイル
  346. * @package {$this->mainTplFileName}
  347. */
  348. define('DOLRVIEWS') または exit('アクセス拒否');
  349. $pluginsString
  350. ?>n
  351. DOLRVIEWS;
  352. $content=$header.$content;
  353. $compileFilePath=$this->_writeCompile($tplFileName,$content,$cacheId);//コンパイルされたファイルを書き込みます
  354. return $compileFilePath;
  355. }
  356. /**
  357. * キャッシュテンプレートファイル
  358. *
  359. * @param string $tplFileName テンプレートファイル
  360. * @param string $cacheId キャッシュ ID
  361. */
  362. 保護関数 _writeCache ($tplFileName, $cacheId)
  363. {
  364. $tplFilePath=$this->_getTplPath($tplFileName);
  365. $cacheFilePath=$this->_getCacheFile( $tplFileName,$cacheId);//ファイル名を保存
  366. $compileFilePath=$this->_getCompileFile($tplFileName,$cacheId);
  367. ini_set('error_reporting','off' );// エラー プロンプトをキャッシュしません
  368. extract($this->_tpl_vars);//テンプレート変数
  369. extract($this->_getSystemVars($tplFileName));/ /システム変数
  370. ob_start();
  371. if(file_exists($compileFilePath) and filemtime($compileFilePath)>filemtime($tplFilePath))//テンプレートは変更されていません
  372. {
  373. include $compileFilePath;
  374. }else{
  375. include $this->parseTpl($tplFileName,$cacheId);//解析して書き込みますコンパイルされたファイル
  376. }
  377. $html=ob_get_contents();
  378. ob_clean();
  379. file_put_contents($cacheFilePath, $html);
  380. return $cacheFilePath;
  381. }
  382. /**
  383. * コンパイル済みファイルの書き込み
  384. *
  385. * @param string $tplFileName テンプレート ファイル
  386. * @param string $cacheId キャッシュ ID
  387. * @param string $content ウェブページ
  388. */
  389. 保護された関数 _writeCompile($tplFileName,$content) ,$cacheId)
  390. {
  391. $compileFilePath=$this->gt;_getCompileFile($tplFileName,$cacheId);//ファイル名を保存
  392. if(!file_exists( dirname($compileFilePath))){
  393. $this->makeDir(dirname($compileFilePath));
  394. }
  395. file_put_contents($compileFilePath,$content);
  396. return $compileFilePath;
  397. }
  398. /**
  399. * オペレーティング システムに適した形式にパスを修正します
  400. *
  401. * @param string $path path name
  402. * @return string
  403. */
  404. 保護された関数 _trimPath( $path)
  405. {
  406. return rtrim(str_replace(array('/', '\', '//', '\\'),DIR_SEP, $path),DIR_SEP);
  407. }
  408. /**
  409. * 指定されたパスに基づいて存在しないフォルダーを作成します
  410. *
  411. * @param string $path パス/フォルダー名
  412. * @return文字列
  413. */
  414. 保護関数 _makeDir( $path)
  415. {
  416. $dirs =explode(DIR_SEP, $this ->_trimPath($path));
  417. $tmp = '';
  418. foreach ($dirs as $dir)
  419. {
  420. $tmp .= $dir . DIR_SEP;
  421. if (!file_exists($tmp) && !@mkdir($tmp, 0777))
  422. return $tmp;
  423. }
  424. return true;
  425. }
  426. /**
  427. * 変数処理
  428. *
  429. * @param string $string target string
  430. * @return string
  431. */
  432. 保護された関数 _parseVar($string ){
  433. $pattern=array(
  434. '/^
  435. '/>$/',
  436. '/( $w+|[^>s]+)/e',//$title|striptags|html2text
  437. '/($[w]+.[w]+ )/e',
  438. );
  439. $replacement=array(
  440. "
  441. ' ?>',
  442. "$ this->_parseModifier('\1');",
  443. "$this->_parsePoint('\1');",
  444. );
  445. returntripslashes(preg_replace($pattern, $replacement, $string));
  446. }
  447. /**
  448. * 变量调节器的处理
  449. *
  450. * @param string $string 模板中匹配到的变量
  451. * @return string 处理后的字符串
  452. */
  453. protected function _parseModifier($string)
  454. {
  455. $arr=explode('|', trim($string,';'));
  456. $tmp=array_shift($arr);
  457. foreach($arr as $value)
  458. {
  459. $tmpArr=explode(':',$value);//html2text
  460. $funcName=array_shift($tmpArr);//html2text
  461. $args=count($tmpArr)>0?','.join(',',$tmpArr):'';//参数用,号链接 arg1,arg2,arg3
  462. if(!function_exists($funcName)){//如果不是PHP内置函数则包含插件
  463. if(!file_exists($this->_options['plugins_dir'].'modifier_'.$funcName.'.php')){
  464. $this->_throwException('插件"'.$funcName.'"不存在');
  465. }
  466. $pluginFileName='modifier_'.$funcName.'.php';
  467. if(!in_array($pluginFileName, $this->includePlugins)){
  468. $this->includePlugins[]=$pluginFileName;//添加include插件
  469. }
  470. $tmp="dolr_modifier_{$funcName}($tmp{$args})";
  471. }else{
  472. $tmp="{$funcName}($tmp{$args})";
  473. }
  474. }
  475. return stripslashes($tmp.';');
  476. }
  477. /**
  478. * 数组操作的点支持
  479. *
  480. * @param string $string 目标字符串
  481. * @return string
  482. */
  483. protected function _parsePoint($string)
  484. {
  485. $arr=explode('.',$string);//$a.b.c.f
  486. $varName=array_shift($arr);//$a
  487. return $varName.'[\''.join('\'][\'',$arr).'\']';//$a['b']['c']['f']
  488. }
  489. /**
  490. * 去掉自定义标签
  491. *
  492. * @param string $expr 源文
  493. * @param string $statement 替换目标
  494. * @return string
  495. */
  496. protected function _stripvtags($expr, $statement)
  497. {
  498. $expr = str_replace("\\\"", "\"", preg_replace("/\<\?php echo \\\$.+? \?\>/s", "\\1", $expr));
  499. $statement = str_replace("\\\"", "\"", $statement);
  500. return $expr . $statement;
  501. }
  502. /**
  503. * 抛出一个错误信息
  504. *
  505. * @param string $message
  506. * @return void
  507. */
  508. protected function _throwException($message)
  509. {
  510. trigger_error('DolrViews错误:'.$message);
  511. exit;
  512. }
  513. }
  514. /* vim: set expandtab: */

使用范例:
PHP:
  1. include 'DolrViews.class.php';
  2. $tpl=DolrViews::getInstance();//单例
  3. $_options=array(
  4. 'template_dir'=>'templates',//模板目录
  5. 'compile_dir'=>'templates_c',//编译目录
  6. 'cache_dir'=>'cache',//缓存目录
  7. 'caching'=>false,//是否缓存
  8. 'cache_lifetime'=>3600,//缓存有效期
  9. 'plugins_dir'=>'plugins',//插件目录
  10. 'tpl_suffix'=>'html',//模板后缀
  11. );
  12. $tpl->setOptions($_options);//保存如上设置
  13. $title="标题测试啊";
  14. $val=3;
  15. $array=array(
  16. array('username'=>'Joychao','password'=>'nowpass'),
  17. array('username'=>'DolrPHP','password'=>'password'),
  18. );
  19. $var='这里是带标签的HTML';
  20. //分配变量
  21. $tpl->assign('val',$val);
  22. $tpl->assign('title',$title);
  23. $tpl->assign('array',$array);
  24. //显示
  25. $tpl->display('index.html');
模板index.html:
  1. <$title|strip_tags:'hahah'|html2text:"nnn">
  2. --包含文件----------------------------
  3. ------if else------------------------
  4. do anything
  5. do another
  6. Do not
  7. ---------------------------------
  8. ------loop------------------------
  9. 循环内容<$dolr_index>

  10. 交互式显示:
  11. 循环中的变量:<$v.username>
  12. ループ内のインデックス $dolr_index:ccc

  13. コンテンツなし
  14. ---------------- --- -------------
  15. --含まれるファイル--------------- --- -------
  16. ------------ --- ---------------

目次の例:
ドルビュー数/
|--cache //キャッシュディレクトリ
|--plugins //プラグインディレクトリ
|--templates //テンプレート ディレクトリ
|--templates_c //コンパイルファイルディレクトリ
|--DolrViews.classs.php //エンジンメインファイル
|--index.php //テストファイル


現在、プラグインは 1 つのテストのみを作成しています。プラグインの仕様は modifier_function name.php です。コンテンツ関数名: dolr_modifier_function 名 ($最初のパラメータは [, その他のパラメータ] である必要があります)。例:
  1. 関数 dolr_modifier_html2text($string)
  2. {
  3. returnstrip_tags($string);
  4. }

今日これを書きました。皆さんもぜひ投稿してください。 こちらも大歓迎です @安正超!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。