アーカイブ
Tyzohブログ - ikarashiさんのエントリ
 ikarashiさんのエントリ配信

2007/08/02
[Secure-SBM:029] カレンダー表示 (2)

執筆者: ikarashi (1:03 pm)
こんにちは,五十嵐です.前回は日付を指定してブックマークを表示できるようにしました.今回はカレンダー表示と連携させます.

指定された月の1日から末日までを走査し,配列を作成します.ブックマークが存在すればリンクを,存在しなければ 0 を設定します.存在確認は,既存のアクションを用いて 〜 例えば /personal 用であれば SecureSBM::Controller::Personal::personal() に特別な引数を与えて 〜 ブックマークを確認します.

    for( my $day = 1; $day <= $lastday; $day++ ){ 
        my $ymd = sprintf('%04d%02d%02d', $data{year}, $data{month}, $day); 
        # ブックマークの存在確認 
        my $exists = 0; 

        if( $action =~ /^personal$/ ){ 
            $exists = SecureSBM::Controller::Personal::personal( 
                                                $self, $c, 1, $ymd ); 
        }elsif( $action =~ /^searchbookmark$/ ){ 
            $exists = SecureSBM::Controller::Personal::searchBookmark(
                               $self, $c, 1, $ymd, $tag, $searchword ); 
        }else{ 
            # /bookmark etc. 
            $exists = SecureSBM::Controller::Noauth::Bookmark::bookmark(
                                           $self, $c, undef, 1, $ymd ); 
        } 
        if( $exists ){ 
            $link[$day] = "'" . $url . '?' . $urlarg . $amp . "date=" 
                              . $ymd 
                              . "'"; 
            $monthlink = 1; 
        }else{ 
            $link[$day] = '0'; 
        } 
   } 

これをメニューのカレンダーから表示します.
<div class="sidemenu-box">
<h1>カレンダー</h1>
<div id="calendar"></div>

この calendar という id の部分にカレンダーを表示します.
<script type="text/javascript">
<!--
var today = new Date();
var curyear = today.getFullYear();
var curmonth = today.getMonth() + 1;
[% IF dispyear && dispmonth %]
var dispyear = [% dispyear %];
var dispmonth = [% dispmonth %];
[% ELSE %]
var dispyear = curyear;
var dispmonth = curmonth;
[% END %]
[% IF linkurl %]
var linkurl = encodeURI('[% linkurl %]');
[% ELSE %]
var linkurl = encodeURI('/bookmark');
[% END %]
rewriteCal(dispyear,dispmonth,curyear,curmonth,linkurl);
// -->
</script>
dispyear,dispmonth は表示する年月,curyear,curmonth は現在の年月です.rewriteCal() は calendar.js というファイルに格納して,あらかじめ読み込んでおきます.
function rewriteCal( year, month, curyear, curmonth, linkurl ){
    var cal = make_calendar( year, month, curyear, curmonth );
    _getElementById("calendar").innerHTML = cal;

先ほどメニューに設定した '<div id="calendar"></div>' にカレンダーを書き込みます.
/* 表示中の月のリンク array を確認 */
    if( ! _isDefined( "ym_" + year + month ) ){
        // 同期して Array を読み込み
        setupCalendarDispMonth( year, month, linkurl );
    }

    setupCalendarLinkDispMonth( year, month );

この辺りが今回のミソ.例えば今月が 2007 年 7 月であれば,変数 "ym_20077" が設定されているかどうかを確認します.設定されていなければ "ym20077" に配列を読み込みます.ここの読み込み部分は,リンクを設定する関係で,非同期ではなく,同期して読み込みます.

同様に,前後の月を非同期で読み込んでおきます.
/* 前後の月のリンク array を確認 */
    var lastmonth = month - 1;
    var nextmonth = month + 1;
    var lastyear = year;
    var nextyear = year;

    if( lastmonth == 0 ){
        lastmonth = 12;
        lastyear--;
    }
    if ( nextmonth == 13 ) {
        nextmonth = 1;
        nextyear++;
    }

    // lastyear + lastmonth
    if( ! _isDefined( "ym_" + lastyear + lastmonth ) ){
        // Ajax で Array を読み込み
        setupCalendarLastMonth( lastyear, lastmonth, linkurl );
    }

    // nextyear + nextmonth
    if( ! _isDefined( "ym_" + nextyear + nextmonth ) ){
        // Ajax で Array を読み込み
        setupCalendarNextMonth( nextyear, nextmonth, linkurl );
    }
} // end of rewriteCal()

先読みしておいて,前後の月を表示するようにクリックされた場合には,すぐに表示できるようにしておきます.クライアント側が遅い PC だとかえってサクサクとは動かないかもしれません.

2007/06/27 記

参考:

Keyword: Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク オープンソース
ikarashiさんのブログを読む | コメント (0) | トラックバック数 (0) | 閲覧数 (4510)
Trackback is not accepted now.
印刷用ページ 友達に送る
 
投稿された内容の著作権はコメントの投稿者に帰属します。
サイト内検索
ブログ カレンダー
«  «  2008 3月  »  »
24 25 26 27 28 29 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5