PHPで祝日/イベント対応のカレンダーを作成。
PHPではPEARなどのライブラリを利用すると簡単にカレンダーを作成できますが、CakePHPなどフレームワークをベースに開発している場合、あまり他のライブラリを利用したくないこともあります。
また祝日情報を含むイベント情報を簡単に組み込めるカレンダーとして、シンプルなカレンダーを作成してみました。
サンプルはこちら
機能としては指定月のカレンダーを生成し、イベント情報を配列として渡すことで、該当日にイベント内容を表示することができます。
祝日情報の取得の関数「getHolidays()」については、「Googleカレンダーから祝日情報を取得。」をご覧ください。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | <?php //カレンダーと祝日情報の生成用に年月日の変数を作成 $year = date('Y'); $month = date('n'); $day = 1; //祝日情報の配列(「label」はクラス名として利用します) $holidays = getHolidays($year); $holidays['label'] = 'holiday'; //テストイベント情報の配列 $tests = array('label' => 'test', date('Ymd') => '本日です(イベントのテスト)'); //祝日情報とテストイベント情報を連想配列にまとめます $events = array($holidays, $tests); //カレンダーの出力 echo getCalendar($year, $month, $day, $events); //指定月のカレンダーを生成 function getCalendar($year, $month, $day, $events) { 	//ヘッダー部分の曜日表示 	$days = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); 	//本日を取得(20120512) 	$today = date('Ymd'); 	//1行ごとの順番(1〜7)と、月全体の順番(1〜31(最大)) 	$num_row = 1; 	$num_day = 1; 	//月の始まる曜日から、前月の空白分を取得 	$num_blank = date('w', mktime(0, 0, 0, $month, 1, $year)); 	//月の合計日 	$total = $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31); 	//カレンダーのヘッダー部分 	$calendar = '<table class="calendar">'; 	$calendar .= '<thead><tr>'; 	while ($num_row <= count($days)) { 		$calendar .= '<th>'.$days[$num_row-1].'</th>'; 		$num_row++; 	} 	$calendar .= '</tr></thead>'; 	//カレンダーの本体部分 	$calendar .= '<tbody><tr>'; 	$num_row = 1; 	//前月の空白分のセルを生成 	while ($num_blank > 0) { 		$label = ''; 		$label = ($num_row == 1) ? $label.' sun' : $label; 		$calendar .= '<td class="'.$label.'"></td>'; 		$num_blank--; 		$num_row++; 	} 	//1日〜31日(最大)までのセルを生成 	while ($num_day <= $total) { 		//「$label」は要素のクラス名として、「$content」は祝日などのイベント内容 		$label = ''; 		$content = ''; 		//イベントの配列を走査するためのキーとして、「20120512」の形式で文字列を生成 		$key = $year.sprintf('%02d', $month).sprintf('%02d', $num_day); 		//左端なら日曜日、右端なら土曜日のためのラベル(クラス)を付加 		$label = ($num_row == 1) ? $label.' sun' : $label; 		$label = ($num_row == 7) ? $label.' sat' : $label; 		//本日の場合もクラスを付加 		$label = ($key == $today) ? $label.' today' : $label; 		//イベントの配列があれば、配列を走査 		if (isset($events)) { 			//連想配列になっているイベントの配列($event)の中の、各イベント配列ごとに処理 			for ($i = 0; $i < count($events); $i++) { 				$label_event = (isset($events[$i]['label'])) ? $events[$i]['label'] : ''; 				//イベントの配列に一致するキー(20120512など)があれば、要素を付加 				if (array_key_exists($key, $events[$i])) { 					$label .= ' '.$label_event; 					$content .= '<div class="'.$label_event.'">'.$events[$i][$key].'</div>'; 				} 			} 		} 		$calendar .= '<td class="'.$label.'">'; 		$calendar .= '<div class="day">'.$num_day.'</div>'; 		$calendar .= $content; 		$calendar .= '</td>'; 		$num_day++; 		$num_row++; 		//1行の終わり(7日目)ごとに、新しい行を開始 		if ($num_row > 7) { 			$calendar .= '</tr><tr>'; 			$num_row = 1; 		} 	} 	//月の最終日以降の空白分のセルを生成 	while ($num_row > 1 && $num_row <= 7) { 		$label = ''; 		$label = ($num_row == 7) ? $label.' sat' : $label; 		$calendar .= '<td class="'.$label.'"></td>'; 		$num_row++; 	} 	//カレンダーの終了 	$calendar .= '</tr></tbody></table>'; 	//文字列として生成したカレンダーを返す 	return $calendar; } ?> | 
CakePHPで利用する場合には、コンポーネントとして登録しておくと使い勝手が良いかもしれません。