PHPで簡易ブログを作ろう!

関数に配列を渡すの章

PHP講座簡易ブログ構築スクリプト>関数に配列を渡す
今回の目標:テンプレートファイルの拡張性を高くする

今回の目標はテンプレートファイルの拡張性を高くすることなのですが、より具体的に言えば、独自タグを気軽に増やすことができるようにしよう!てなことを目標にやっていきます。

ポイントは「関数への配列渡し」

ページ作成を関数化しようでは、新規ページ作成部分を、ページ作成関数createNewPageとして関数化しました。

その際、テンプレートにある独自タグの部分をこんな感じ↓でそれぞれ変数に置き換えるという処理をやっていたのですが、これはあまりにもローテクすぎ。

ちょっとローテク・・・
	$contents = str_replace( "<%PAGETITLE>", $pagetitle, $contents);
	$contents = str_replace( "<%PAGECONTENTS>", $honbun, $contents);

何より独自タグを増やす際にはいちいちcreateNewPage関数を書き換えねばならないので、拡張性が無さすぎます。

そこで次のような仕組みを考えましょう。

  1. 独自タグと、置換する内容を配列にまとめる
  2. その配列をcreateNewPage関数に引数として渡す
  3. createNewPage関数は、受け取った配列を読み取り、独自タグを置換する

例のごとく説明がヘタでよく分からん!という人が多いと思いますので、サンプルスクリプトをご覧ください。

サンプルスクリプト

makefile.php
<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データを全て受け取りエスケープして変数に入れる」処理の部分はこれを使ってたんですね〜。

この部分さえ分かればあとは前回と同じで、独自タグを探してそれを置換していきます。

PHP講座簡易ブログ構築スクリプト>関数に配列を渡す