予定表(単一ソース) - PHPで日付・時刻の計算
目次
- PHPで日付・時刻の計算
- 日付・時刻に関する関数
- 年齢計算
- 今月のカレンダー
- 年月を指定できるカレンダー
- 予定表
- 予定表(単一ソース)
予定表をひとつのソースにまとめる
前回の予定表はソースが4つありました。これをひとつにまとめてみましょう。ソースがひとつの場合と複数の場合でどちらが良いのかは一概には言えないので、自分の好みで使い分けてください。
プログラムの作成
以下のソースを入力してください。
<?php
$mode = $_REQUEST['mode'];
if (!$mode) {
// フレーム処理
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表</title>
</head>
<frameset cols="200,*">
<frame name="cal" src="yotei2.php?mode=cal">
<frame name="main" src="yotei2.php?mode=main">
</frameset>
</html>
<?php
exit();
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>予定表</title>
</head>
<body>
<?php
switch ($_REQUEST['mode']) {
case 'cal':
// カレンダー処理
$now = time();
$year = date("Y", $now);
$month = date("n", $now);
$day = date("j", $now);
if ($_POST['year']) {
if ($year != $_POST['year'] || $month != $_POST['month']) {
$year = $_POST['year'];
$month = $_POST['month'];
$day = 0;
$now = mktime(0, 0, 0, $month, 1, $year);
}
}
$dnum = date("t", $now);
print "<form method='post' action='yotei2.php'>\n";
print "<select name='year' onChange='submit()'>\n";
for ($i = $year - 5; $i <= $year + 5; $i++) {
print "<option";
if ($i == $year) print " selected";
print ">$i</option>\n";
}
print "</select>年\n";
print "<select name='month' onChange='submit()'>\n";
for ($i = 1; $i <= 12; $i++) {
print "<option";
if ($i == $month) print " selected";
print ">$i</option>\n";
}
print "</select>月\n";
print "<input type='hidden' name='mode' value='cal'>\n";
print "</form>\n";
$wstr = array('日', '月', '火', '水', '木', '金', '土');
for ($i = 1; $i <= $dnum; $i++) {
$t = mktime(0, 0, 0, $month, $i, $year);
$w = date("w", $t);
$ymd = date("Ymd", $t);
print "<a href='yotei2.php?mode=main&ymd=$ymd' target='main'>";
if ($i == $day) print "<strong>";
if ($w == 0) print "<font color='red'>";
print date("Y年m月d日", $t);
print "(" . $wstr[$w] . ")";
if ($w == 0) print "</font>";
if ($i == $day) print "</strong>";
print "</a>";
print "<br>\n";
}
break;
case 'main':
// 予定画面処理
$ymd = $_GET['ymd'];
if (!$ymd) $ymd = date("Ymd");
$year = substr($ymd, 0, 4);
$month = substr($ymd, 4, 2);
$day = substr($ymd, 6, 2);
$fname = "logs/$ymd.txt";
if (file_exists($fname)) $contents = file_get_contents($fname);
print "<h3>{$year}年{$month}月{$day}日の予定</h3>\n";
print "<form method='post' action='yotei2.php'>\n";
print "<textarea name='contents' cols='60' rows='20'>$contents</textarea>\n";
print "<br><br>\n";
print "<input type='submit' value='登録'>\n";
print "<input type='hidden' name='ymd' value='$ymd'>\n";
print "<input type='hidden' name='mode' value='submit'>\n";
print "</form>\n";
break;
case 'submit':
// 予定登録処理
print "<p>";
$contents = $_POST['contents'];
$contents = str_replace("\r\n", "\n", $contents);
$contents = str_replace("\r", "\n", $contents);
$fp = fopen("logs/{$_POST['ymd']}.txt", "w");
if ($fp) {
fwrite($fp, $contents);
fclose($fp);
print "予定を登録しました";
} else {
print "予定登録に失敗しました";
}
print "</p>\n";
break;
}
?>
</body>
</html>
入力が終わったら「yotei2.php」という名前でサーバにアップしてブラウザで実行してみてください。
ソースの解説
今回、新たな GET/POST 変数として mode を用意しました。この変数に設定されている値によって以下の処理を行ないます。
- 何も設定されていない → フレーム表示処理
- 値 'cal' が設定されている → 左フレームのカレンダー処理
- 値 'main' が設定されている → 右フレームの予定画面処理
- 値 'submit' が設定されている → 右フレームの予定登録処理
その他の処理は前回とほぼ同じです。