今回の目標はテンプレートファイルの拡張性を高くすることなのですが、より具体的に言えば、独自タグを気軽に増やすことができるようにしよう!てなことを目標にやっていきます。
ポイントは「関数への配列渡し」。
ページ作成を関数化しようでは、新規ページ作成部分を、ページ作成関数createNewPageとして関数化しました。
その際、テンプレートにある独自タグの部分をこんな感じ↓でそれぞれ変数に置き換えるという処理をやっていたのですが、これはあまりにもローテクすぎ。
$contents = str_replace( "<%PAGETITLE>", $pagetitle, $contents); $contents = str_replace( "<%PAGECONTENTS>", $honbun, $contents);
何より独自タグを増やす際にはいちいちcreateNewPage関数を書き換えねばならないので、拡張性が無さすぎます。
そこで次のような仕組みを考えましょう。
例のごとく説明がヘタでよく分からん!という人が多いと思いますので、サンプルスクリプトをご覧ください。
<html>
<head>
<title>ブログ作成</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>
<?php
$template = "template.php"; // テンプレートファイル名
if ($_POST{"honbun"}) {
// POSTデータを全て受け取りエスケープして変数に入れる
foreach($_POST as $k => $v) {
if(get_magic_quotes_gpc()) { $v=stripslashes($v); }
// $v=htmlspecialchars($v);
$array[$k]=$v;
}
extract($array);
// 文字コードをEUCに変換
$honbun = mb_convert_encoding($honbun, "EUC-JP","AUTO");
$pagetitle = mb_convert_encoding( htmlspecialchars($pagetitle), "EUC-JP","AUTO");
// 改行を<br>タグに変換
$honbun = nl2br($honbun);
// 乱数を生成してファイル名に
$filename = rand( 1000000, 9999999) . ".html";
// ※1 置換対象となる独自タグを設定
$originaltag{"PAGETITLE"} = $pagetitle;
$originaltag{"PAGECONTENTS"} = $honbun;
// メッセージ表示
if (createNewPage( $filename, $template, $originaltag)) {
echo $filename. "を生成し、書き込みを行いました。";
} else {
echo "ファイルの生成に失敗しました。";
}
} else {
echo "フォームから記事の内容を送信してください。";
}
// ページ生成関数 createNewPage()
function createNewPage( $filename, $template, $originaltag) {
// テンプレートファイルの読み込み
if ( ($contents = file_get_contents( $template)) == FALSE) { return false; }
// ※2 独自タグを置換
foreach ($originaltag as $key => $var) {
$contents = str_replace( "<%".$key.">", $var, $contents);
}
// ※5 ファイル生成&書き込み
if ( ($handle = fopen( $filename, 'w')) == FALSE) { return false; }
fwrite( $handle, $contents);
fclose( $handle );
return true;
}
?>
</body>
</html>
// ※1 置換対象となる独自タグを設定
連想配列を使って、$originaltag{"置換対象タグ名"} = 置換内容として変数$originaltagに独自タグをばんばん詰め込んでいきます。
// ※2 独自タグを置換
これが今回の肝です。
foreach ($array as $k => $v)で、配列変数$arrayのキーと値が順番に$kと$vにそれぞれ代入されます。
実は「POSTデータを全て受け取りエスケープして変数に入れる」処理の部分はこれを使ってたんですね〜。
この部分さえ分かればあとは前回と同じで、独自タグを探してそれを置換していきます。