ネイティブテンプレートエンジン

私はかなり長い間、ネイティブテンプレートを使用していますが、何らかの理由で、多くの人々にとって、ネイティブテンプレートは次のような構造に関連付けられています。



$title = 'My title' ; include( 'templates/index.html' ); * This source code was highlighted with Source Code Highlighter .



  1. $title = 'My title' ; include( 'templates/index.html' ); * This source code was highlighted with Source Code Highlighter .



  2. $title = 'My title' ; include( 'templates/index.html' ); * This source code was highlighted with Source Code Highlighter .



$title = 'My title' ; include( 'templates/index.html' ); * This source code was highlighted with Source Code Highlighter .









  1. < html > < head > < title > <? php echo $ title> </ title > </ head >
  2. <!-...->
*このソースコードは、 ソースコードハイライターで強調表示されました。




つまり、変数が定義され、htmlファイルに含まれていました。 これは根本的に間違ったアプローチだと思います。 なんで?



まず、テンプレートに渡されるすべての変数は、1つの場所(テンプレートクラスのプロパティ)に保存する必要があります。

第二に、テンプレートエンジンは、渡されない変数、およびテンプレートエンジンで定義されていない関数にアクセスするべきではありません。

第三に、仕事に必要な一連の機能を定義する必要があります。



したがって、テンプレートエンジンが必要であるという結論に達しましたが、それはだまされたSmartyタイプのブレーキであってはなりません。

ブロックテンプレートエンジン(XTemplateなど)のイデオロギーは、そのようなブランチがなく、サイクルのみであるため、私には魅力的ではありません。



したがって、私は私のものを書きました。



まず、エラー処理に対処する必要があります。 この目的で例外を使用するため、例外クラスを定義します。







  1. クラス STempExceptionは例外{}を拡張します
*このソースコードは、 ソースコードハイライターで強調表示されました。


ここでは、他に何も必要ありません。 テンプレートエンジン自体に目を向けます(メソッドが行うことはコメントに簡単に記述されています。以下で詳細に説明します)。







  1. クラス STemp
  2. {
  3. / **
  4. *テンプレートが配置されているディレクトリの名前。
  5. *
  6. * @var文字列。
  7. * @access private。
  8. * /
  9. プライベート $パス。
  10. / **
  11. *テンプレートの名前。
  12. *
  13. * @var文字列。
  14. * @access private。
  15. * /
  16. プライベート $テンプレート。
  17. / **
  18. *割り当てられたテンプレート変数が保持される場所。
  19. *
  20. * @var配列。
  21. * @access private。
  22. * /
  23. private $ variables = array();
  24. / **
  25. *テンプレートエンジンのパラメーター。
  26. *
  27. * @var配列。
  28. * @access private
  29. * /
  30. private $ params = array(
  31. 'xss_protection' => true
  32. 'exit_after_display' => true
  33. 'endofline_to_br' => false
  34. );
  35. / **
  36. *テンプレートに含まれるファイル。
  37. *
  38. * @var文字列。
  39. * @access private。
  40. * /
  41. private $ include_file;
  42. / **
  43. *クラスコンストラクター。 テンプレートが配置されているディレクトリの名前を設定します。
  44. *
  45. * @param string $テンプレートが配置されているディレクトリのパス名。デフォルトは「templates /」。
  46. * @access public。
  47. * /
  48. パブリック関数__construct($ path = 'templates /'
  49. {
  50. $ this-> path = $ path;
  51. }
  52. / **
  53. *テンプレートエンジンのパラメーターを設定します。
  54. *
  55. * @param string $パラメーターのパラメーター名。
  56. * @param bool $パラメータの値。
  57. * @return boolパラメータが設定されている場合はTRUE、設定されていない場合はFALSE。
  58. * @access public。
  59. * /
  60. パブリック関数setParam($ param、$ value
  61. {
  62. if (isset($ this-> params [$ param])){
  63. $ this- > params [$ param] = $ value ;
  64. trueを 返し ます
  65. }
  66. falseを 返し ます
  67. }
  68. / **
  69. *
  70. * @param string $ include_fileインクルードファイルへのパス。
  71. * @access public。
  72. * /
  73. パブリック関数setIncludeFile($ include_file)
  74. {
  75. $ this-> include_file = $ this->パス。
  76. if (!file_exists($ this-> path。$ include_file))
  77. throw new STempException( 'Include file' 。$ this- > include_file。 'not exitst' );
  78. }
  79. / **
  80. *値をテンプレート変数に割り当てます。
  81. *
  82. * @param string $ nameテンプレート変数名。
  83. * @param mixed $ value割り当てる値。
  84. * @access public。
  85. * /
  86. パブリック関数assign($ name、$ value
  87. {
  88. $ this-> variables [$ name] = $ value ;
  89. }
  90. / **
  91. *テンプレートの結果を実行して表示します。
  92. *
  93. * @param string $ templateテンプレート名。
  94. * @access public。
  95. * /
  96. パブリック関数表示($テンプレート)
  97. {
  98. $ this-> template = $ this-> path。$ template;
  99. if (!file_exists($ this-> template))
  100. throw new STempException( 'Template file' 。$ template。 'not exitst' );
  101. require_once($ this->テンプレート);
  102. if ($ this- > params [ 'exit_after_display' ])
  103. 出る
  104. }
  105. / **
  106. *テンプレート変数の値を取得します。
  107. *
  108. * @param string $ nameテンプレート変数名。
  109. * @returnは、この名前を持つテンプレート変数の混合値です。 変数が設定されていない場合はFALSE。
  110. * @access private。
  111. * /
  112. プライベート関数__get($ name)
  113. {
  114. if (isset($ this-> variables [$ name])){
  115. $ variable = $ this-> variables [$ name];
  116. if ($ this- > params [ 'xss_protection' ])
  117. $変数= $ this-> xssProtection($変数);
  118. if ($ this- > params [ 'endofline_to_br' ])
  119. $変数= $ this-> endoflineToBr($変数);
  120. $変数を返します。
  121. }
  122. NULLを返します。
  123. }
  124. / **
  125. *ファイルを含める
  126. *
  127. * @access private
  128. * /
  129. プライベート関数includeFile()
  130. {
  131. if (!file_exists($ this-> include_file))
  132. throw new STempException( 'Include file' 。$ this-> include_file。 'not found' );
  133. require_once($ this-> include_file);
  134. }
  135. / **
  136. *語尾の形成のため。
  137. *
  138. * @param int $値番号。
  139. * @param string $ word0単数形の単語。
  140. * @param string $ word1単語の複数形(2、3)。
  141. * @param string $ word2複数形の単語。
  142. * @param string $ separator separator、デフォルト ''。
  143. * @return文字列形式の単語
  144. * @access private。
  145. * /
  146. プライベート関数モーフ($ 、$ワード0、$ワード1、$ワード2、$区切り= ''
  147. {
  148. if (preg_match( '/ 1 \ d $ /' 、$ value ))
  149. return $ value 。$ separator。$ word2;
  150. elseif(preg_match( '/ 1 $ /' 、$ value ))
  151. return $ value 。$ separator。$ word0;
  152. elseif(preg_match( '/(2 | 3 | 4)$ /' 、$ value ))
  153. return $ value 。$ separator。$ word1;
  154. 他に
  155. return $ value 。$ separator。$ word2;
  156. }
  157. / **
  158. * XSSからの保護用。
  159. *
  160. *保護のための@param mixed $変数データ。
  161. * @return混合保護データ。
  162. * @access private。
  163. * /
  164. プライベート関数xssProtection($変数)
  165. {
  166. if (is_array($ variable)){
  167. $ protected = array();
  168. foreach ($ key => $ value としての $変数)
  169. $ protected [$ key] = $ this-> xssProtection($ value );
  170. $ protectedを 返します。
  171. }
  172. return htmlspecialchars($変数);
  173. }
  174. / **
  175. *文字列のすべての改行の前にHTML改行を挿入します。
  176. *
  177. *保護のための@param mixed $変数データ。
  178. *すべての改行の前に<br />を含む文字列が挿入された@return混合データ。
  179. * @access private。
  180. * /
  181. プライベート関数endoflineToBr($変数)
  182. {
  183. if (is_array($ variable)){
  184. $ protected = array();
  185. foreach ($ key => $ value としての $変数)
  186. $ protected [$ key] = $ this-> endoflineToBr($ value );
  187. $ protectedを 返します。
  188. }
  189. return nl2br($変数);
  190. }
  191. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




コンストラクターで、テンプレートディレクトリへのパスを指定できます(デフォルトはtemlates /)。



setParamメソッドを使用して、テンプレートエンジンのパラメーターを設定できます。 それらは3つだけです(これで十分です。必要に応じて、パラメーターを追加できます)。 最初のパラメーター-xss_protection-は、名前が示すとおり、xssの脆弱性から保護するために必要です。 パラメータ値がtrueに設定されている場合、テンプレートで使用するすべての変数は、返される前にhtmlspecialchars関数(配列要素を含む)によって自動的に処理されます。 2番目のパラメーター-exit_after_display-は、必要に応じて、テンプレートの表示後にスクリプトの実行を停止できるようにするために必要です。 3番目のパラメーターendofline_to_brは、nl2br関数で(配列要素を含む)を返す前にすべての変数を処理します。



setIncludeFileメソッドを使用して、プラグインテンプレートを設定できます。 共通テンプレートindex.tpl.phpがよく使用され、条件によっては、変数部分がそれに接続されます。 このプロセスの自動化には、このメソッドも必要です。 インクルードファイルが存在しない場合、例外がスローされます。



assignメソッドは、変数をテンプレートに転送するために使用されます。



displayメソッドはテンプレートを表示します。 テンプレートファイルが存在しない場合、例外がスローされます。 exit_after_displayがtrueに設定されている場合、このメソッドはスクリプトも終了します(ほとんどの場合、テンプレートの表示は最後のアクションです)。



__get magicメソッドは、テンプレートに渡された変数の値を返します。 変数が定義されていない場合、NULLを返します。 パラメーターに応じて、変数は返される前に処理されます。



includeFileメソッドには、setIncludeFileメソッドで指定されたファイルが含まれ、このファイルが見つからない場合は例外がスローされます。



完全に「テンプレート」ではないモーフ方法は、数字に関連する単語の正しい終わりを形成するのに役立ちます。 つまり、1つのコメント、2つのコメント、5つのコメントです。 数値自体、3つの異なるバリアント、およびオプションで単語区切り文字をメソッドに渡す必要があります(デフォルトでは、切り離せないスペース)。



xssProtectionメソッドは、htmlspecialchars関数を使用してデータを処理します。 入力が配列の場合、入力は再帰的に反復され、そのすべての要素が処理されます。



endoflineToBrメソッドは、nl2br関数を使用してデータを処理します。 入力が配列の場合、前の方法と同様に、入力が再帰的に繰り返され、そのすべての要素が処理されます。



実際にはどのように見えますか? 記事とそのコメントを印刷する必要があるとします。 $ article配列の記事のデータ、$ commentsのコメント。



コントローラー:





  1. $ stemp = new STemp();
  2. $ stemp-> assign( "title" 、$ article [ 'title' ]);
  3. $ stemp-> assign( "article" 、$ article);
  4. $ stemp-> assign( "comments" 、$コメント);
  5. {
  6. $ stemp-> setIncludeFile( " article.tpl.php " );
  7. $ stemp-> display( "index.tpl.php" );
  8. } catch (STempException $ e){
  9. die( 'STemp error:' 。$ e-> getMessage());
  10. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




テンプレートindex.tpl.php:





  1. < html >
  2. < >
  3. < タイトル > <? php echo $ this- > title? > </ タイトル >
  4. </ >
  5. < 本体 >
  6. <? php $ this- > includeFile()? >
  7. </ body >
  8. </ html >
*このソースコードは、 ソースコードハイライターで強調表示されました。




テンプレートarticle.tpl.php:





  1. < h1 > <? php echo $ this- >記事['title']? > </ h1 >
  2. <? php $ this- > setParam( 'xss_protection'、false); $ this- > setParam( 'endofline_to_br'、true)? >
  3. < div class = "content" >
  4. <? php echo $ this- > article ['content']? >
  5. </ div >
  6. < p > <? php echo $ this- > morph(count($ this- > comments)、 'comment'、 'comment'、 'comment')? ></ p >
  7. <? php $ this- > setParam( 'xss_protecttion'、true)? >
  8. <? php foreach ($ this- > $ key = > $ valueとしてコメント){? >
  9. < p class = "user" > <? php echo $ value [ 'username' ]? ></ p >
  10. < p class = "comment" > <? php echo $ value [ 'text' ]? > </ p >
  11. <? php }? >
*このソースコードは、 ソースコードハイライターで強調表示されました。




クラスをダウンロードします。



個人のニーズに合わせたクラスの使用は、制限なしで許可されています。 一部または一部を含む記事またはソースコードを転載する場合は、( 私のサイトへの )リンクが必要です。



All Articles