前回までで、ブログの最も便利な点といえる「記事を書けばページ(HTML)を自動生成してくれる機能(CMS機能)」を実装できました。今回はその機能を関数の形でまとめてみましょう。
その前にまず、フォームデータの読み込み、タグの除去、文字コードの変換、クオーテーションマークの変換を行うスクリプトを考えてみましょう。
// POSTデータを全て受け取りエスケープして変数に入れる foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array);
たとえば<input type="text" name="namae">というフォームからデータが送信されると、$namaeという変数に値が代入されます。なお今回のプログラムでは、htmlspecialcharsはコメントアウトします。
参考: フォームのデータを受け取りエスケープして変数に入れる:PHPプログラムを作る人のメモ帳
前回のスクリプトから、かなり修正がされていますので注意してください。
<html> <body> <form action="makefile.php" method="POST"> ページタイトル:<input type="text" name="pagetitle" /><br /> 本文<br /> <textarea name="honbun" rows="5" cols="50"></textarea><br /> <input type="submit" value="送信" /> </form> </body> </html>
<html> 〜 <body> <?php $template = "template.php"; // テンプレートファイル名 if ($_POST{"honbun"}) { // ※1 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"; // ※2 メッセージ表示 if (createNewPage( $filename, $template, $pagetitle, $honbun)) { echo $filename. "を生成し、書き込みを行いました。"; } else { echo "ファイルの生成に失敗しました。"; } } else { echo "フォームから記事の内容を送信してください。"; } // ※3 ページ生成関数 createNewPage() function createNewPage( $filename, $template, $pagetitle, $honbun) { // ※4 テンプレートファイルの読み込み if ( ($contents = file_get_contents( $template)) == FALSE) { return false; } // タイトルと記事本文を挿入 $contents = str_replace( "<%PAGETITLE>", $pagetitle, $contents); $contents = str_replace( "<%PAGECONTENTS>", $honbun, $contents); // ※5 ファイル生成&書き込み if ( ($handle = fopen( $filename, 'w')) == FALSE) { return false; } fwrite( $handle, $contents); fclose( $handle ); return true; } ?> </body> </html>
// ※1 POSTデータを全て受け取りエスケープして変数に入れる
上の方で紹介した通り。htmlspecialcharsはコメントアウトしています。ちなみに文字コードの変換をこの処理に含めないのは、将来的に英数字をフォーム送信することを考えてのこと。
// ※2 メッセージ表示
関数createNewPage()を呼び出して、戻り値によって処理を分けています。
true・・・処理成功、false・・・処理失敗です。
// ※3 // ページ生成関数 createNewPage()
これが今回の目玉であるユーザー定義関数です。
関数を定義する構文は、Javascriptとほとんど同じで次のようになります。
function 関数名(変数) { // 処理 ・・・ return 戻り値; // 省略可 }
ただしPHPでは、関数の内部の変数と外部の変数とは別物扱いされるので、$filename, $template, $pagetitle, $honbunがかぶったりすることはありません。
// ※4 テンプレートファイルの読み込み
file_get_contents()はファイルを読み込めなかった際にFALSEを返すことを利用して、エラー処理を組み込んでいます。
テンプレートファイルを読み込めなかった際には、createNewPage()は処理を中断して、falseを返します。
// ※5 ファイル生成&書き込み
※4と同じくエラー処理を組み込んでいます。