Pearカレンダを作成しよう!

Pearカレンダの基本を理解する

クラスを作成した人(どうもアメリカ人のようです?)の意図がつかめず、 クラスの構造もよく分からないので、結局どう使ったらよいか分からない状況に 陥りますが頑張りましょう。
Pearのなかにある、Calendar_Month_Weekdays()クラスに挑戦します。
これを使用するとカレンダが一気にできてしまいます。
Pearカレンダの作成については紹介するWEBサイトや書籍があるのですが、初心者には難解です。
ここではなるべく平易に書くことに努めました。
こんなことは分かっていると思う部分は読みと飛ばしてください。
カレンダPHPファイルは、左サイドナビ「見栄えのするPearカレンダ」の中の
PearカレンダPHPファイル
から見てください。
コメントばっかりのファイルです。
このPEARカレンダはザンプのなかに最初からインスト-ル済み
C:\xampp\php\pear\Calendar\Month
の中にありますので無意識に使用することができます。
ただ、レンタルサ-バにはPearはインスト-ルされていないことが多いようです。
左側のサイドナビの「レンタルサ-バにPEARをインスト-ル」を見てください。
結局は、各メソッドがどう動くのかを手さぐりでいろいろやってみたというのが実態です。

インスタンスの作成

まずは、new Calendar_Month_Weekdaysインスタンスを作成します。
もっとも単純な例は
$Calendar = new Calendar_Month(2015, 4, 1); // 2015年4月 月曜日スタ-ト
です。最後の引数1は月曜日スタ-トを示します。
これで、2015年4月の月曜日スタ-トのカレンダのインスタンスができあがりました。
サンプルファイルでは、少し複雑です。
PHP関数strtotimeを理解する必要があります。
これは、英文形式の日付を Unix タイムスタンプに変換してくれます。
strtotime(date("Y-m-01") . $def.' month')
$def = 1 とすると
今日現在の月の1ケ月後の月の Unix タイムスタンプを返してくれます。
そこで、
date('Y', strtotime(date("Y-m-01") . $def.' month')
とすると、'Y'は年(4桁)で来月の年を返してということになります。又
date('n', strtotime(date("Y-m-01") . $def.' month')
とすると、'n'は月(1~12)で来月の月を返してということになります。
まとめると
$Calendar = new Calendar_Month_Weekdays
(date('Y', strtotime(date("Y-m-01") . $def.' month')),
date('n', strtotime(date("Y-m-01") . $def.' month')), 0);
で、0or1or2ヶ月後の年月指定で、最後の 0 で日曜日スタ-トのインスタンスが完成します。

Calendarの初期化

カレンダインスタンスを初期化します。
$selection = array($Today);
で今日現在の年月日をセットします。
isSelectedメソッドで差別化するために、特定の日をここでインスタンスします。
$Calendar->build($selection); でCalendarの初期化メソッドを完了します。

カレンダ出力

fetchメソッド
while ($Day = $Calendar->fetch()) {
で、カレンダの日を出力していきます。
fetch()メソッドは、日付の昇順で1回に1つの子供を返します。
最後の要素に達した後は、false を返してコレクションをリセットします。
すなわち、もうそれ以上子供が見つからない場合には FALSE を返します。
そして自動的に内部の子供の集合がリセットされます。
よって好きな回数だけこれらをループさせて使用することができます。

土,日曜日の表示色を変える

isFirst()メソッドを使用して週の最初すなわち日曜日を赤字に、
isLast() メソッドを使用して週の最後すなわち土曜日を青字に、
します。

今日の日は太字に

$Today = new Calendar_Day(date('Y'),date('n'),date('j'))
で今日の日をCalendar_Day()クラスを使ってインスタンスを作成します。
ちなみに、Calendar_Month_Weekdays()クラスはカレンダ作成のためのインスタンスです。
又、Calendar_Day()クラスは個別の日を定義するために必要なインスタンスです。
この二つにより、Calendar_Month_Weekdays()クラスの中で、isSelected()メソッド が使用できるようになります。

  if ($Day->isSelected()) {
     echo "<th align=right style='color:$color'>$day</th>";
   }

で選ばれた今日の日が太字表示になります。

$Dayはどこから来た?

$Dayは連想配列で名前はなんでもかまいません。
For文のiとかjと同じです。
まず、$Dayを配列のトップにして作業開始・・・配列の最後までいって、 なくなったら終わりです。

来月表示

来月表示のため、PHP関数
strtotime(date("Y-m-01") . ' 1 month') [今年月1日の一月後を指定]
を使用しています。
来月指定する時は、
<a href'?def=1'>来月</a>
を使用して、defに1を入れて、これを、$_GETで受取って忘れないように、$_SESSION に記憶させています。

session_startがかからない

xamppだとokなのですが、レンタルサ-バだとエラになる時があるようです。
どうも、session_start は何がなんでもトップにこないとだめなようです。
通常だと
<!doctype html>宣言が最初にきますが、これよりも前に、session_startを書く必要があるようです。
素直に、
<!doctype html>宣言の前に session_start を書きましょう。

祝日は表示できないの

実はPEARの中に、Date_Holidays_Japan(現在α版)と言うクラスがあり、これを利用すると祝日表示 ができるのですが、使用していません。
もちろんxamppにもデフォルトではインスト-ルされていません。
これについては、解説記事がWEB上にもあるのでそれを見ていただくことにしました。
PEARのα版やβ版は使ってみて非常に苦労したことがあり、特にα版は使用しないと決めました。
PEAR初心者(私も)は基本的にstable版を使うべきと思っています。
もっともCalendarはまだβ版なんですけど・・・でもxamppにもデフォルトではインスト-ルされているし、 stable版と言ってもよいと思います。

祝日はいつ決まる

祝日としての春分の日・秋分の日は、前年の2月1日に、春分の日・秋分の日の日付が書かれた暦要項 が官報に掲載されることによって、正式決定となります。
例えば、2015年2月1日の官報には、2016年の春分の日・秋分の日が書かれた暦要項が掲載されています。
これを配列 $holidays で設定しています。

祝日を判定する

   if (array_key_exists($ymd, $holidays)) {
    $color = 'red';
    }    

で判定します。
$time = $Day->thisDay('timestamp');
で、表示したい日のunixタイムスタンプ形式の値を取得し、
$ymd = date('Ymd',$time);
とすることで、表示したい日の日付が例えば 2015年3月25日ならば、
$ymd = 20150325 となります。
array_key_exists($ymd, $holidays)
は、指定したキ-$ymd が配列 $holidaysに設定されている場合、 array_key_exists() は TRUE を返します。
$ymd = 20150325 ならば、$holidays[20150325]は設定されていませんので、FALSE を返します。
ここで選ばれた祝日は赤色表示になります。


Pear カレンダ動作確認 に進む

63PearVillage に戻る