今回の目標はテンプレートファイルの拡張性を高くすることなのですが、より具体的に言えば、独自タグを気軽に増やすことができるようにしよう!てなことを目標にやっていきます。
ポイントは「関数への配列渡し」。
ページ作成を関数化しようでは、新規ページ作成部分を、ページ作成関数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データを全て受け取りエスケープして変数に入れる」処理の部分はこれを使ってたんですね〜。
この部分さえ分かればあとは前回と同じで、独自タグを探してそれを置換していきます。