ネットサービスとかGoogleとか豆知識とか。

Index > プログラミング > MovableTypeにPHPでカレンダー設置
プログラミング
2006年03月31日 00:01

MovableTypeにPHPでカレンダー設置

  • このエントリーをはてなブックマークに追加
  • ... PV
スポンサード リンク

phpspot開発日誌の「カレンダー出力用の便利モジュール:PHP Calendar」と「MovableTypeのPHP化をhtaccessで行う」を参考にして、このブログにPHPで生成するカレンダーを設置しました。

まず拡張子がhtmlのファイルをPHPファイルと解釈させるために、.htaccessに

AddType application/x-httpd-php .html

を記述するんだそうです。うは、めっちゃ簡単ですね。

次にカレンダーの生成ですが、簡単にカレンダーを出力できるPHP Calendarを使います。サイトからgenerate_calendar関数のソースをコピペして適当にファイルに保存して(ここではgenerate_calendar.phpと保存)サイトにアップします。

さて、各ページでカレンダーを生成するようにテンプレートにPHPプログラムを仕込むのですが、例えば2006年1月のアーカイブページなら2006年1月のカレンダーを、2006年2月1日のブログなら2006年2月のカレンダーを生成するようにします。さらに、表示月の前月と翌月へのリンクもつけられるので、そのリンクもつけられるようにします。

そのためには年月日の情報が必要です。幸い私のブログではブログの各ページのURLが、

http://blog.fkoji.com/yyyy/mmddhhmi.html (年4桁のディレクトリに、月日時分2桁ずつのHTMLファイル)

というフォーマットで作成されるようにしています。また月別アーカイブのページは、

http://blog.fkoji.com/yyyy/mm/index.html (年4桁のディレクトリ/月2桁のディレクトリ)

となっています。なので、__FILE__変数に対して正規表現を適用して年月日を取り出すことができます。

年月日を取り出せたら、「先月」と「翌月」は次のように設定します。

$pre_year = date("Y", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
$pre_month = date("m", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
$next_year = date("Y", mktime(0, 0, 0, $this_month + 1, 1, $this_year));
$next_month = date("m", mktime(0, 0, 0, $this_month + 1, 1, $this_year));

mktime関数では、仮に13月になった場合には翌年の1月に、0月になった場合は前年の12月に自動補正してくれるので便利です。generate_calendar関数では7個目の引数に、先月と翌月のリンクを配列で仕込むことができます。詳しくは下のソースコードを見てください。

さらに、カレンダーの日付にその日のブログへのリンクをつけます。generate_calendar関数では3個目の引数に与えられた配列について、インデックス番号と同じ日付に対してその配列の値をアンカータグのhref属性に埋め込んでくれます。先に説明したように、私のブログは年月日の情報がディレクトリ名とファイル名に含まれているので、該当する年ディレクトリに存在するファイルのファイル名を調べればいいです。2006年3月なら、ディレクトリ「2006」の中にある「03dd****.html」のファイルを探し、ddの部分を配列のインデックスとして、そのファイル名を配列に格納します。ただしddの部分が01や02のように0で始まることがあるので、intval関数で整数化します。

こんな感じでめでたくPHPで生成させたカレンダーを設置することができました。参考に、テンプレートに記述したソースコードを載せておきます。

<?php
define("BLOG_DIR", "ブログへの絶対パス");
require_once(BLOG_DIR . "/generate_calendar.php");

$match = preg_match("/\/blog\/(\d+?)\/(\d\d)/", __FILE__, $ym);
$this_year = ($match > 0) ? $ym[1] : date("Y");
$this_month = ($match > 0) ? $ym[2] : date("m");

if ($match > 0) {
 $pre_year = date("Y", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
 $pre_month = date("m", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
 $next_year = date("Y", mktime(0, 0, 0, $this_month + 1, 1, $this_year));
 $next_month = date("m", mktime(0, 0, 0, $this_month + 1, 1, $this_year));
 $pn = array('<<'=>'/'.$pre_year.'/'.$pre_month.'/', '>>'=>'/'.$next_year.'/'.$next_month.'/');
} else {
 $pre_year = date("Y", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
 $pre_month = date("m", mktime(0, 0, 0, $this_month - 1, 1, $this_year));
 $pn = array('<<'=>'/'.$pre_year.'/'.$pre_month.'/');
}

$d = dir(BLOG_DIR . "/" . $this_year);
$days = array();

while ($file = $d->read()) {
 $match = preg_match("/^$this_month(\d\d)\d\d\d\d\.html$/", $file, $day);
 if ($match > 0) {
  $days[intval($day[1])] = array("/$this_year/$file");
 }
}

$d->close();

echo generate_calendar($this_year, $this_month, $days, 3, NULL, 0, $pn);
?>