PHPでカレンダーを作成
カレンダーを作成するPHPのクラスは色々と公開されていますが、今回僕がほしかったのは
・ 週表示、月表示用の日付の配列のみを取得できるクラス
・ 祝日判定に対応しているもの
ようは、シンプルに日付関連のデータだけいい感じに取得できて、あとはこっちで自由にやりたいっていう訳ですw
例によって既にあると思いますが、暇だったので個人的に使いやすいものを作ってみました。
これを使ってカレンダーを作る場合は、
1 | <?php |
2 | require('./calendar/calendar.php'); |
3 | $Calendar = new Calendar(array( |
4 | //日付フォーマットdate関数に順ずる形のみ受付 |
5 | 'format' => 'Y-m-d', |
6 | //0から6までの曜日名 |
7 | 'weeks' => array('日', '月', '火', '水', '木', '金', '土', '日'), |
8 | //週の開始曜日No |
9 | 'start_week' => 0, |
10 | //基準日、formatにのっとった形式 |
11 | 'now' => null, |
12 | //モード week:一週間、calendar:一ヶ月を週区切り、month:一ヶ月 |
13 | 'mode' => 'calendar', |
14 | )); |
15 | ?> |
16 | <table border="1"> |
17 | <tr> |
18 | <?php |
19 | foreach ($Calendar->weeks() as $key => $var) { |
20 | ?> |
21 | <th><?php echo $var ?></th> |
22 | <?php |
23 | } |
24 | ?> |
25 | </tr> |
26 | <?php |
27 | foreach ($Calendar->days() as $days) { |
28 | ?> |
29 | <tr> |
30 | <?php |
31 | foreach ($days as $day) { |
32 | ?> |
33 | <td><xmp><?php echo print_r($day) ?></xmp></td> |
34 | <?php |
35 | } |
36 | ?> |
37 | </tr> |
38 | <?php |
39 | } |
40 | ?> |
41 | </table> |
という感じです。
これでカレンダーが作成できます。33行目で$dayをまるごとダンプしていますが、$dayは配列で、内容は下記の値が代入されています。
mday :日にち
wday :週番号(0が日曜日で6が土曜日)
mon :月
year :年
yday :その年の通算の日数
weekday :英語の曜日名
month :英語の月名
date :$settings['format']に準じた書式の日付
weekname :$settings['weekname']に準じた曜日名
status :今の日にちと比較して過去なら past、当日ならtoday、未来なら future が代入される
in_month :現在選択中の月に属している場合は true、そうでない場合は false
selected :現在選択中の日の場合は true、それ以外はfalse
holiday :休日名
time :タイムスタンプ
また、3行目、インスタンス生成時に配列を渡していますが基本的に全て省略可能です。
よくある感じで、↓みたいなカレンダーを作る場合は
1 | <?php |
2 | require('./calendar/calendar.php'); |
3 | $date = isset($_GET['date']) ? $_GET['date'] : null; |
4 | $mode = isset($_GET['mode']) ? $_GET['mode'] : 'calendar'; |
5 | $Calendar = new Calendar(array( |
6 | //週の開始曜日No |
7 | 'start_week' => 0, |
8 | //基準日、formatにのっとった形式 |
9 | 'now' => $date, |
10 | //モード week:一週間、calendar:一ヶ月を週区切り、month:一ヶ月 |
11 | 'mode' => $mode, |
12 | )); |
13 | ?> |
14 | <table border="1"> |
15 | <tr> |
16 | <th colspan="7"> |
17 | <a href="./test.php?date=<?php echo $Calendar->prev('date') ?>&mode=<?php echo $mode ?>"><前</a> |
18 | <a href="./test.php?mode=<?php echo $mode ?>">|今日|</a> |
19 | <a href="./test.php?date=<?php echo $Calendar->next('date') ?>&mode=<?php echo $mode ?>">次></a> |
20 | </th> |
21 | </tr> |
22 | <tr> |
23 | <?php |
24 | foreach ($Calendar->weeks() as $key => $var) { |
25 | ?> |
26 | <th><?php echo $var ?></th> |
27 | <?php |
28 | } |
29 | ?> |
30 | </tr> |
31 | <?php |
32 | foreach ($Calendar->days() as $days) { |
33 | ?> |
34 | <tr> |
35 | <?php |
36 | foreach ($days as $day) { |
37 | ?> |
38 | <td style="width:70px;vertical-align:top;"><?php echo date('n/j', $day['time']) ?><br /><?php echo $day['holiday'] ?></xmp></td> |
39 | <?php |
40 | } |
41 | ?> |
42 | </tr> |
43 | <?php |
44 | } |
45 | ?> |
46 | <tr> |
47 | <th colspan="7"> |
48 | <a href="./test.php?date=<?php echo $date ?>&mode=week">週表示</a>| |
49 | <a href="./test.php?date=<?php echo $date ?>&mode=calendar">月表示</a> |
50 | </th> |
51 | </tr> |
52 | </table> |
こんな感じですね。
あとは、cssでちょこちょこやれば
ちょっとしたスケジューラーみたいな感じにもできます。
ちなみに、祝日判定に関しては
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm
を参考にさせていただきました。
是非お試しくださいませ。