てるてるブログ

てるてるぼうずの日常やらお勉強やら

PEAR CALENDARで祝日付きカレンダーの作成

Posted on | 9月 27, 2012 | No Comments

php

カレンダーというかスケジュール表みたいなのを作ることになったのでメモ。

PEARのライブラリに「Calendar」というそのものズバリのがあったのでそちらを使用。
カレンダーの作成自体はかなり簡単に作成出来ました。

カレンダーの作成は「Calendar」を使用し、祝日判定には別に「Date_Holidays_Japan」というライブラリを使用しました。

当ブログで使用しているサーバのロリポップだとCalendarが入っていないらしくPEARのパッケージからインストールする必要がありました。
そちらに関しては下記のサイトさんを参考にさせてもらいました

仕事で利用してるさくらインターネットでも似たような感じ。

どちらもインクルードパスの通し方で引っかかったもののどうにか動くようになりました。
環境によってはPEARが完全に使えないなんてこともありそうなのでそうした場合どうするかとは思うものの…その時はその時で考えよう!


まずはよくある表形式のカレンダー。
「Calendar_Month_Weekdays」クラスを使用します。

require_once("Calendar/Month/Weekdays.php");
require_once ("Date/Holidays.php");

define ('CALENDAR_FIRST_DAY_OF_WEEK',0);

if(!$_GET[year]){
	$year = date("Y");
	}else {
	$year = $_GET[year];
	}
	
if(!$_GET[month]){
	$month = date("m") + 0;
	}else{
	$month = $_GET[month];
	}

$calMonth = new Calendar_Month_Weekdays($year, $month,0);
$calMonth->build(); 

$prev = $calMonth->prevMonth('object');
$p_year = $prev->thisYear();
$p_month = $prev->thisMonth();

$next = $calMonth->nextMonth('object');
$n_year = $next->thisYear();
$n_month = $next->thisMonth(); 

//祝日判定
// インストール先のパスを指定
$ja = "data/Date_Holidays_Japan/lang/Japan/ja_JP.xml"; //ja_JP.xmlのインストール先
$dh = &Date_Holidays::factory("Japan", $year, "ja_JP");
$dh->addTranslationFile($ja, "ja_JP");
$holidays = array();
//祝日の月日をキーに祝日名を配列に格納
foreach ($dh->getHolidays() as $value) {
	$holidays[$value->getDate()->format("%m%d")] = $value->getTitle();
}

echo '<h1>カレンダー</h1>
<div id="cal_hyouji">
<div id="pre_next">
<a href="cal_week.php">週間</a><br />
<a href="?year='.$p_year.'&month='.$p_month.'"><<前月</a<>>  
<a href="cal_month.php">今月</a>  
<a href="?year='.$n_year.'&month='.$n_month.'">次月>></a><br />
'.$year.'年'.$month.'月
</div>
<table>
<thead>
<tr>
<th class="sun">日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th class="sat">土</th>
</tr>
</thead>
<tbody>';

while ($day = $calMonth->fetch()) {
	if ($day->isFirst()) {
	echo '<tr>';
	}
	if ($day->isEmpty()) { 
	echo "<td class=\"empty_d\"> </td>";
	}else { 
	$date = sprintf("%02d",$day->thisMonth()).sprintf("%02d",$day->thisDay());
	if (array_key_exists($date, $holidays)) {
		echo "<td class=\"holiday\">";//祝日のとき
	}else if(date("m") == $day->thisMonth() && date("d") == $day->thisDay()) { // 今日の色分けとリンク
		echo "<td class=\"today\">";
	} else if ($day->isFirst()) {
		echo "<td class=\"sun\">";//週の最初(日曜)のとき
	} else if ($day->isLast()) {
		echo "<td class=\"sat\">";//週の最後(土曜)のとき
	} else {
		echo "<td>";
	}
	echo "<span class=\"day\">".$day->thisDay()."</span>";

	//祝日に該当する月日の場合、祝日名を出力
	if (array_key_exists($date, $holidays)) {
		echo "<div class=\"holiday_td\">".$holidays[$date]."</div>";
	}
	echo "</td>";
	} 
	if ($day->isLast()) { 
		echo "</tr>\n";
	} 
}
	
echo '</tbody></table>
</div>';

次に週間カレンダー。
こちらは「Calendar_Week」を使用。

require_once("Calendar/Week.php");
require_once ("Date/Holidays.php");

define ('CALENDAR_FIRST_DAY_OF_WEEK',0);

if( isset($_GET['week'])){
	$week = $_GET['week'];
}else{
	$y = date("Y", time());
	$m = date("m", time());
	$d = date("d", time());
	$w = date("w", time());
	$week = date("Y/m/d",mktime(0,0,0,$m, $d - $w, $y));
}	
list($y, $m, $d) = explode('/', $week);

//週送り用
$prev_week = date("Y/m/d", mktime(0, 0, 0, $m, ($d-7), $y));
$next_week = date("Y/m/d", mktime(0, 0, 0, $m, ($d+7), $y));

$calWeek = new Calendar_Week($y, $m, $d ,0);

$calWeek->build();

// インストール先のパスを指定
$ja = "data/Date_Holidays_Japan/lang/Japan/ja_JP.xml"; //ja_JP.xmlのインストール先で
$dh = &Date_Holidays::factory("Japan", $y, "ja_JP");
$dh->addTranslationFile($ja, "ja_JP");
$holidays = array();
//祝日の月日をキーに祝日名を配列に格納
foreach ($dh->getHolidays() as $value) {
	$holidays[$value->getDate()->format("%m%d")] = $value->getTitle();
}

echo '<h1>カレンダー</h1>
<div id="cal_hyouji">
<div id="pre_next">
<a href="?week='.$prev_week.'"><<前週</a>  
<a href="index_yoko.php">今週</a>  
<a href="?week='.$next_week.'">翌週>></a>
</div>	
<table>
<thead>
<tr>
<th class="sun">日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th class="sat">土</th>
</tr>
</thead>
<tbody>
<tr>';
	
while ($day = $calWeek->fetch()) {
	$date = sprintf("%02d",$day->thisMonth()).sprintf("%02d",$day->thisDay());
	if (array_key_exists($date, $holidays)) {
		echo "<td class=\"holiday\" valign=\"top\" scope=\"row\">";//祝日のとき
	}else if(date("m") == $day->thisMonth() && date("d") == $day->thisDay()) {
		echo "<td class=\"today\" valign=\"top\">";
	}else{
		echo "<td valign=\"top\" scope=\"row\">";
	}
	echo "<div class=\"day_week\">".$day->thisMonth()."/".$day ->thisDay()."<br />";
		//祝日に該当する月日の場合、祝日名を出力
		if (array_key_exists($date, $holidays)) {
			echo $holidays[$date];
		}
		echo "</div>\n";
	echo '</td>';
}
echo '</tr>
</tbody></table>
</div>';

あちこちからのつぎはぎでとりあえず動けばいいやのスクリプトです。

※週間カレンダーの2013年の1/2の祝日表記がちょっとおかしいみたいです。
年をまたいでいるので2012年の1/2の判定を持ってきてる…のかな?
実用の際はピンポイントで修正するなりしないといけないかも…

« »
トラックバックURL:

Comments

Leave a Reply





*

About

てるぼうず

てるてるぼうずな日常やらお勉強やら

旧ブログ倉庫 »
旧ブログの記事をお探しの方はこちらから

Admin