こんにちは,五十嵐です.登録した日付でブックマークを見たいと思うときがあるので,カレンダーと組み合わせて日付指定ができるようにします.
カレンダーは以前このブログで紹介した「
カレンダー Ajax 風」(2007/06/08) のコードを利用します.
カレンダーの表示の前に,ブックマークの一覧で日付を指定できるようにします.個人ページと最新ブックマーク一覧で URL の引数として date=YYYYMMDD を与えると,その日に登録されたブックマークを表示させます.date=YYYYMM の場合は,当該月の一覧にします.
与えられた引数が有効な日付かどうかを判定する関数を用意しておきます.Secure-SBM のリリースが 2007 年ですから,西暦は 2 から始まることを想定しています.このプログラムが 3000 年まで生き残ることはないと思いますし(笑)
sub _isValidDate : Private {
my $date = shift;
my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$date =~ /^(2[0-9][0-9][0-9])([01][0-9])([0-3][0-9])$/;
my $year = $1;
my $month = $2;
my $day = $3;
# 閏年の判定
if( _isLeapYear( $year ) ){
$days[1]=29;
}
# 月の判定: 1 月から 12 月まで
if( $month < 1 || $month > 12 ){
return 0;
}
# 日の判定: 1 日から $days[$month-1] まで
if( $day < 1 || $day > $days[$month-1] ){
return 0;
}
return 1;
} # end of _isValidDate()
URL に与えられた引数を検査して,date=YYYYMMDD 形式が正しければ,SQL の条件文を追加します.
if( defined $data{date} ){
if( $data{date} =~ /^2[0-9][0-9][0-9][01][0-9]$/ ){
# YYYYMM
$date = $data{date} . '01';
if( SecureSBMLib::_isValidDate( $date ) ){
$where = 'date_trunc(\'month\',user_bookmark_ts)';
}
}elsif( $data{date} =~ /^2[0-9][0-9][0-9][01][0-9][0-3][0-9]$/ ){
# YYYYMMDD
$date = $data{date};
if( SecureSBMLib::_isValidDate( $date ) ){
$where = 'date_trunc(\'day\',user_bookmark_ts)';
}
}else{
# Error
}
}
あとは,変数 $where が定義されているかどうかを見て,search() を呼び出します.
my @bms;
if( defined $where ){
@bms = $ubdb->search({$where => $date},
{order_by => 'user_bookmark_ts DESC'})
->slice( $start, $start + $entrynum - 1 )
}else{
@bms = $ubdb->search(undef, {order_by => 'user_bookmark_ts DESC'})
->slice( $start, $start + $entrynum - 1 );
}
必要な箇所にこれらを施して,date= の処理は終了です.
次回は,カレンダーからのリンクを実装します.
2007/06/27 記
参考:
Keyword: Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク オープンソース