HOME -> ソフトウェア -> CMS , Blog -> MODx -> MODx 応用 1 -> スニペットを作る calender-2

スニペットを作る calender-2

 前ページにてカレンダーの表示スニペットを作成しました。 ですが、これではただ、今月のカレンダーを表示するだけで面白くないですね。 ですので、これを改造してゆきたいと思います。 まず、現在は常に今月のカレンダーを表示するようになっていますが、これを自由に指定できるようにしたいと思います。
 スニペットには
[ [スニペット名? &変数名=`値`] ]
 という形式で値を渡すことができます。 もし呼び込みのページにキャッシュが効いている場合は動的な出力ができなくなるので、
[ !スニペット名? &変数名=`値`! ]
とすることでキャッシュページにおいてもスニペットを動作させることができます。
 上記のように変数名に対して値を渡すのですが、この値はスニペットコード内にてそのまま「$変数名」として取得ができます。 ですから、&vname=`10`として渡された値はスニペット内にてそのまま $vnameとして取得します。

 これらを勘案して年月の指定ができるようにしたいと思います。スニペットコードを以下のように変更します。
include_once("assets/snippets/hm_calender.php");
$calender_arg["setdate"] = $hm_setdate;
return HMsm_calender_Main($calender_arg);
 また、hm_calender.phpの
function HMsm_calender_Main(){
	$calstr = "";
	$wday = array('日','月','火','水','木','金','土');
	$year_str =date('Y');
	$month_str =date('n');
 という部分を以下のように変更します。
function HMsm_calender_Main($args){
	$calstr = "";
	$wday = array('日','月','火','水','木','金','土');
	$year_str =date('Y');
	$month_str =date('n'); 
	if($args["setdata"]){
		$setdate = explode("/",$args["setdata"]);
		if(is_array($setdate)){
			$year_str = intval($setdate[0]);
			$month_str = intval($setdate[1]);
		}
	}
 スニペットに渡す値は2008年の10月を表示したい場合は &hm_setdate=`2008/10` として渡します。
[ [hm_calender? &hm_setdate=`2008/10`] ]
 これにより表示年月の指定オプションを実装することができました。

 上記のコードでは 年/月 の形式で hm_setdate が渡されることが前提とされています。 不正な値が渡された場合は 0/0 となり、希望のカレンダーが取得できない可能性がありますので、 必要に応じてサニタイズ処理を追加するなりしてください。
 カレンダーをただ表示するだけではつまらないので、ブログのように日付部分をリンクとして指定日に記述されたドキュメントに移動できるようにしたいと思います。 この場合は hm_calender.php の日付表示部分に細工を施します。
	$calstr .= "<td>$d</td>";
 上記の $d が日付部分に相当しています。 つまり、先に指定年月を格納した
$year_str , $month_str
の二つと合わせることで表示日の年月日まで確定できるので、あとはドキュメント側の修正日付で抽出します。
日付出力場所を以下のとおりに修正します。
	$calstr .= "<td>".
		HMsm_calender_linkset($year_str,$month_str,$d)."</td>";
 次に呼び出し関数を1つ追加します。
function HMsm_calender_linkset($y,$m,$d){
	global $modx;
	$sttime = mktime(0,0,0,$m,$d,$y);
	$edtime = $sttime + (24*60*60);
	$tpf = $modx->db->config["table_prefix"];
	$sql = "select id from ".$tpf."site_content where
		 published = 1 and editedon >= $sttime and
		 deleted = 0 and
		 editedon < $edtime and contentType = 'text/html'";
	$res = $modx->db->query($sql);
	if($res){
		if(mysql_num_rows($res) > 0){
			$row = mysql_fetch_assoc($res);
			return "<a href=\"[~".$row["id"]."~]\">$d</a>";
		}
	}
	return "$d";
}//END_Function
 条件としては、指定日以内に作成されたドキュメントでコンテンツタイプが text/html になっており、更に公開されているもの、ということで抽出をおこなっています。 また、deleted = 0 とすることで削除状態のものを表示してしまわないようにしておきます。 これにより、カレンダーの日付部分で作成されたドキュメントがある場合にそのドキュメントにリンクする仕様となりました。
 これで一通り、動作するものができたかと思います。 現状では、指定日の1ドキュメントにしかとべませんが、複数のページリストを出力したり、 カレンダー年月を変更できるようにしたり等、まだまだ改造の余地がたくさんあります。  一番の問題点として、現状ではページの読込み毎に全ドキュメントを検索してリンクの有無を書き出しています。 それも一か月分(最大31日分)。 ドキュメントが少ないうちは大したものではありませんが、ドキュメントが増えるにつれ飛躍的に処理の足枷になります。 ですので、キャッシュ構造のような形にしないと大規模サイトには対応できません。
 単純にMODxのキャッシュ機能に頼ってしまうと、キャッシュ作成時のリンクと実際のドキュメント状態とのギャップが発生してしまうので、 この部分のキャッシュは別に作成しなくてはならないでしょう。


2008年 10月 29日ドキュメント作成
2008年 11月 7日ドキュメント更新