** autocalendar.inc.php [#m76387ad]
|RIGHT:100|LEFT:360|c
|~サマリ|表示中のページに対応した月を表示するカレンダー|
|~リビジョン|080521|
|~対応バージョン|1.4.7|
|~投稿者|[[tomas3]]|
|~投稿日|&new{2008-06-09 (月) 16:33:51};|

***概要 [#cba99e5d]

[[calendar2プラグイン>PukiWiki/プラグイン/1.4#x3bbd0a5]]を日記などで使用していて、カレンダーをmenubarに表示している場合を想定しています。

たとえば、次のようなページがあり、

-日記/2008-05-31
-日記/2008-06-01
-more...

menubarの中で
 #calendar2(日記,off)
とすれば、常にカレンダーが表示できます。
そして、calendar2プラグインの変わりに、本プラグインを使用し、
 #autocalendar(日記)
とすると、日記/2008-05-31のページを表示している場合は、2008年5月のカレンダーを、日記/2008-06-01のページを表示しているときは、2008年6月のカレンダーを表示します。

mixiのカレンダーがこうなっていて、日記を順番に見ていくときに便利だと思ったので作成しました。

***補足 [#nb033000]

-書式ですが、# autocalendar(ベースとなるページ名) で使用してください。引数省略不可です。
-受付範囲を勝手に1900年から2100年にしてあります。
-定数の定義部分のcalendar2をminicalendarにすれば、pukiwiki plus!のプラグインも使えます。
-1.4.7 utf-8 でしかチェックしていません。改造したcalendar2プラグインと一緒に使用中です。
-私の初のPHPコードです。ダメなところがあれば、教えてください。

***コード [#zffa2973]

ファイルが添付できませんので、以下のコードを、pluginフォルダにautocalendar.inc.phpとして保存してください(エンコードに注意願います)

calendar2プラグインをラップするように書いています。グローバル変数&titleを調べて、引数で指定したページの子ページを表示しているとみなせば、年月指定つきでcalendar2プラグインを呼び出します。その他の場合は、そのままcalendar2プラグインを呼び出しています。

 <?php 
 //**********************************
 // autocalendar ver.080521
 // by tomas3
 //
 // for calendar2 plugin of Pukiwiki
 //**********************************
 
 //choose calendar2 or minicalendar(Pukiwiki Plus!).
 define('PLUGIN_AUTOCALENDAR_BASEPLUGIN', 'calendar2'); 
 
 function plugin_autocalendar_convert()
 {
 
 	//プラグイン引数チェック
 	//手抜き。省略されたら、現在のページにするのが普通のはず
     $args = func_get_args();
     if(count($args) != 1)
     	return "<span style=\"color:red\">plugin autocalendar: no target parameter.</span>";
     $target = $args[0];
 
     //同じ親か
     global $title;
     if(mb_substr($title, 0, mb_strlen($target) + 1) != $target . "/") {
     	
 //    	return "debug: 同じ親じゃ無い $target ";
     	
     } else {
     	
     	//子ページかどうか
     	$sub_title = mb_substr($title, mb_strlen($target) + 1);
 
 //    	return "debug: " . $sub_title;
      	
      	if(false) {
      			//ここのifに、条件を厳しくするコードが入れられます。ex.孫 があるページはダメ
     			//現在は、孫ページがあっても、子ページ名が日付フォーマットと一致していれば動作させる
     	} else {
     		
     		$sub_title = mb_substr($sub_title, 0, mb_strlen("yyyy-mm-"));
     		
     		//日付であるかの確認 1900年から2100年としてある。(yyyy-mm-)
     		if(
     			strlen($sub_title) != mb_strlen($sub_title) ||
     			mb_substr($sub_title, 4, 1) != "-" ||
     			mb_substr($sub_title, 7, 1) != "-"
     		) {
     			
 //    			return "debug: 'yyyy-mm-*'じゃない $target ";
     		
     		} else {
     			
 	    		$year  = mb_substr($sub_title, 0, 4);
 	    		$month = mb_substr($sub_title, 5, 2);
 	    		
 	    		if(
 	    			(int) $year < 1900 ||
 	    			(int) $year > 2100 ||
 	    			(int) $month <  1 ||
 	    			(int) $month > 12
 	    		) {
 	    			
 //	    			return "debug: 日付のレンジがおかしい $target ";
 	    			
 	    		} else {
 	    			
 	    			//ここまで来たら、年月を指定するべきときのはず
     				array_push($args, $year . $month);
     				
 				}
 			}
 		}
 	}
 	
 	//一覧表示offオプションを追加してcalendarプラグインを呼び出し。
 	array_push($args, "off");
 	return exist_plugin_convert(PLUGIN_AUTOCALENDAR_BASEPLUGIN) ?
 		do_plugin_convert(PLUGIN_AUTOCALENDAR_BASEPLUGIN, csv_implode(',', $args)) : "";
 }
 
 ?>

***ライセンス [#l0f10d83]

GPL(?よくわかりませんが、コピーレフトなやつで)

***コメントお願いします。 [#m6aa51a7]
- 引数にhtmlspecialchars()してませんが、calendarプラグインにそのまま渡すので、しないようにしてますが、いいんですよね… -- [[tomas3]] &new{2008-06-09 (月) 18:09:52};
- デフォルトのカレンダーは大きすぎて、CSSをカスタマイズできる人しかmenubarへ入れていない予感… -- [[tomas3]] &new{2008-06-09 (月) 19:39:43};
- この間も俊太郎の詩をお  http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra   =]]   -- [[viagra]] &new{2010-03-08 (月) 12:24:34};

#comment
//#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.032 sec.

SourceForge