この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 最新リビジョン 両方とも次のリビジョン | ||
php_template [2019/01/02 18:32] 管理者 |
php_template [2019/01/03 01:34] 管理者 [カスタマイズ] |
||
---|---|---|---|
ライン 2: | ライン 2: | ||
外部テンプレートファイルを読み込み、テンプレート中の専用タグと同名の連想配列の内容を出力するだけの簡易的なテンプレートエンジンです。 | 外部テンプレートファイルを読み込み、テンプレート中の専用タグと同名の連想配列の内容を出力するだけの簡易的なテンプレートエンジンです。 | ||
- | includeを使ってないのでPHP構文を使った複雑な処理はできませんが、逆にテンプレートを編集してもPHP構文エラーは発生しません。 | + | includeを使ってないのでPHP構文を使った複雑な処理はできませんが、逆にテンプレート編集ではPHP構文エラーが発生しません。 |
+ | |||
+ | 大きな欠点は、表示する配列データの数だけ繰り替えし文字置換しているので配列(要素)が多くなると処理時間が大きくなる事です。特にテンプレートのファイルサイズも大きい場合には影響が大きくなります。 | ||
- | 大きな欠点は2つ、1つ目は表示する配列データの数だけ繰り替えし文字置換しているので配列(要素)が多くなると低速化し、特にテンプレートのファイルサイズも大きい場合は影響が大きくなります。2つ目は変換処理を1要素ずつ順番に行っているのでデータ中に自分より後に変換する専用タグが含まれていると変換出力してしまいます。 | ||
---- | ---- | ||
- | ===== 関数本体 ===== | + | ===== 自作関数 ===== |
+ | |||
+ | 入力された連想配列からキーとデータを分離し、データ部から専用タグの文字 %%{%%と%%}%% をエスケープして、テンプレートのキーと同名の専用タグを置換しています。 | ||
<code php> | <code php> | ||
// ---------- 簡易テンプレートエンジン関数 ---------- | // ---------- 簡易テンプレートエンジン関数 ---------- | ||
function template_engin($html,$dataArray){ | function template_engin($html,$dataArray){ | ||
+ | // 入力データを順番に置換({と}は再帰的に処理しないようエスケープ) | ||
foreach ($dataArray as $key => $value){ | foreach ($dataArray as $key => $value){ | ||
+ | $value = str_replace( '{', '{', $value); | ||
+ | $value = str_replace( '}', '}', $value); | ||
$html = str_replace( '{{'.$key.'}}', $value, $html); | $html = str_replace( '{{'.$key.'}}', $value, $html); | ||
} | } | ||
- | //残った専用タグを除去 | + | |
+ | // テンプレート上に残った専用タグを除去 | ||
$html=preg_replace('/{{.*}}/','',$html); | $html=preg_replace('/{{.*}}/','',$html); | ||
- | //変換されたデータを返す | + | |
+ | // 変換されたデータを返す | ||
return $html; | return $html; | ||
} | } | ||
</code> | </code> | ||
- | ===== サンプルプログラム ===== | + | ==== プログラム例 ==== |
下記2つのファイルをPHPの動作するディレクトリに保存して、ブラウザでtemplate.phpを表示するとテンプレートの専用タグの一に出力データが表示されます。 | 下記2つのファイルをPHPの動作するディレクトリに保存して、ブラウザでtemplate.phpを表示するとテンプレートの専用タグの一に出力データが表示されます。 | ||
ライン 29: | ライン 38: | ||
function template_engin($html,$dataArray){ | function template_engin($html,$dataArray){ | ||
foreach ($dataArray as $key => $value){ | foreach ($dataArray as $key => $value){ | ||
+ | $value = str_replace( '{', '{', $value); | ||
+ | $value = str_replace( '}', '}', $value); | ||
$html = str_replace( '{{'.$key.'}}', $value, $html); | $html = str_replace( '{{'.$key.'}}', $value, $html); | ||
} | } | ||
- | //残った専用タグを除去 | ||
$html=preg_replace('/{{.*}}/','',$html); | $html=preg_replace('/{{.*}}/','',$html); | ||
- | //変換されたデータを返す | ||
return $html; | return $html; | ||
} | } | ||
- | // ---------- HTML ---------- | + | // ---------- メイン ---------- |
- | function noscript($str){ | + | |
- | return htmlspecialchars($str,ENT_QUOTES,'UTF-8'); | + | |
- | } | + | |
- | + | ||
- | // ---------- メイン ---------- | + | |
// テンプレートファイルの読み込み | // テンプレートファイルの読み込み | ||
ライン 53: | ライン 57: | ||
$dataArray['title']='デモタイトル'; | $dataArray['title']='デモタイトル'; | ||
$dataArray['data'] =date("Y/m/d H:i:s"); | $dataArray['data'] =date("Y/m/d H:i:s"); | ||
- | $dataArray['text'] =htmlspecialchars('Hello World!' ,ENT_QUOTES,'UTF-8'); | + | $dataArray['text'] =htmlspecialchars('Hello World!',ENT_QUOTES,'UTF-8'); |
$dataArray['html']='<a href="http://www.google.co.jp/">Google</a>'; | $dataArray['html']='<a href="http://www.google.co.jp/">Google</a>'; | ||
ライン 75: | ライン 79: | ||
<p>通常文書:{{text}}</p> | <p>通常文書:{{text}}</p> | ||
<p>HTML許可:{{html}}</p> | <p>HTML許可:{{html}}</p> | ||
- | <p>HTML不許可:{{html}}</p> | ||
<p>未使用キーは除去→:{{hogehoge}}</p> | <p>未使用キーは除去→:{{hogehoge}}</p> | ||
</body> | </body> | ||
ライン 87: | ライン 90: | ||
===== カスタマイズ ===== | ===== カスタマイズ ===== | ||
- | 単純にデータを展開するだけだと芸が無いので、最低限の挿入データごと「HTML許可選択」・専用タグの「多重展開の防止」・「使用しなかった専用タグの除去」を行っています。 | + | 単純にデータを展開するだけだと芸が無いので「HTML許可選択」を追加行っています。専用タグのキー名の頭に@をつけるとHTML許可して、@が無ければHTMLを不許可にしています。 |
- | + | ||
- | イメージ | + | |
- | ^テンプレート^+^データ(php)^ | + | |
- | |<code html><h1>{{title}}</h1> | + | |
- | <p>{{text}}</p></code>|+|<code php>$output{'title'}='デモ'; | + | |
- | $output{'text'}='Hello world!'</code>| | + | |
- | + | ||
- | ^ ↓結果 ^ | + | |
- | |<code html><h1>デモ</h1> | + | |
- | <p>Hello world!</p></code>| | + | |
- | + | ||
- | ----- | ||
===== デモプログラムコード ===== | ===== デモプログラムコード ===== | ||
下記のtemplate.phpとtemplate.htmlは同じフォルダに保存してください。(template.htmlはファイルパスを書き換えれば任意のディレクトリに移動できます) | 下記のtemplate.phpとtemplate.htmlは同じフォルダに保存してください。(template.htmlはファイルパスを書き換えれば任意のディレクトリに移動できます) |