CodeIgniterの学習 10 - カレンダークラスを使ってカレンダーを生成してみる
今日はカレンダークラスを試して、タスクリストのパーツとして使うようにしてみる。
カレンダークラスはデフォルトで使える状態なので、
事前準備は必要なく、すぐに呼び出すことができる。
3行で書くと、
$this -> load -> library( 'calendar');
echo $this -> calendar -> generate();
でカレンダーは作れるでありますぅ〜。
というお話。
詳しくはマニュアルにちゃんと記述されているので、
ここでの説明は省略し やった作業だけ書く。
(カレンダークラス - http://codeigniter.jp/user_guide_ja/libraries/calendar.html )
(尚、例によってまだいろいろ実験しているだけの段階なので、ソースの場所とか書き方とか細かいところは気にしていない。)
作業内容
ソースの量がそこそこ長くなってきて、毎回貼り付けるのも冗長なので、今日は抜粋箇所のみ記述する。(ベースは昨日までのエントリで貼っているソース)
todo:最新ソースだけ毎回貼る場所を作るか、3日に1回程 全ソースを貼るか何か方策を考える。
1)コントローラー内にカレンダーを呼び出す処理を追加
ビューの生成をまとめている_SetTpl内に
$tpl["calendar"] = $this -> _MakeCalendar();とし、_MakeCalendar()の呼び出しを追加した。
_MakeCalendar()側でカレンダーのテーブルタグを生成している。
新規に作った_MakeCalendar() 内は、マニュアルを参考に、
- 月の移動リンク
- 日付内のリンク
- 生成するカレンダーのタグをデフォルト状態から変更
を設定して、カレンダータグを生成し戻している。
後でここにDBから読み出したタスク一覧データを渡し、
カレンダーの日付 → タスクへの遷移 のリンクを生成させる予定。
ソース抜粋:
コントローラー: application/controllers/tasklist.php 内
<?php //上略 // ビューの生成 一カ所にまとめた function _SetTpl( $data ) { // カレンダーの生成 $tpl["calendar"] = $this -> _MakeCalendar(); // 大枠のテンプレート側の変数(ヘッダ部分のタイトルと、xajax用javascriptタグ) $tpl["page_title"] = "タスクリストにようこそ"; $tpl["xajax_js"] = $this -> xajax -> getJavascript( base_url() ); // xajax用javascript生成 // タスクリスト(実験ソース)のテンプレートにデータをセット $tpl["main_content"] = $this -> load -> view( 'tasklist_view', $data , true ); // 大枠のテンプレートに、タスクリストのビューをはめ込む $this -> load -> view( 'base_view', $tpl ); } //中略 // カレンダーの生成 function _MakeCalendar() { // todo:タスクリストとつなげ、 // 日付クリック→その日迄の未完了タスクを表示させる /** * $data = array( * 3 => '/article/2006/03/', * 7 => '/article/2006/07/', * 13 => '/article/2006/13/', * 26 => '/article/2006/26/' * ); * echo $this->calendar->generate(年, 月, $data); * の形式でリンク付カレンダーが作れるのでこれを使って実装すればOK */ // 日付リンク埋め込みのテスト todo:後でDB内の一覧データから自動生成させる $data = array( 24 => 'http://d.hatena.ne.jp/dix3/20080924', 28 => 'http://d.hatena.ne.jp/dix3/20080928' ); //月の移動用初期設定 todo:日付遷移の先を作る まだ飛び先が無い $prefs = array ( 'show_next_prev' => TRUE, 'next_prev_url' => '/tasklist/show' , // /tasklist/show/yyyy/mm に移動する ); //カレンダーの見た目の調整用初期設定 //指定しなくてもいいけど調整したい時はこんな感じで $prefs['template'] = ' {table_open}<table>{/table_open} {heading_row_start}<tr>{/heading_row_start} {heading_previous_cell}<th><a href="{previous_url}"><<</a></th>{/heading_previous_cell} {heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell} {heading_next_cell}<th><a href="{next_url}">>></a></th>{/heading_next_cell} {heading_row_end}</tr>{/heading_row_end} {week_row_start}<tr class="cal_weekrow">{/week_row_start} {week_day_cell}<td>{week_day}</td>{/week_day_cell} {week_row_end}</tr>{/week_row_end} {cal_row_start}<tr>{/cal_row_start} {cal_cell_start}<td>{/cal_cell_start} {cal_cell_content}<a href="{content}">{day}</a>{/cal_cell_content} {cal_cell_content_today}<span class="cal_today"><a href="{content}">{day}</a></span>{/cal_cell_content_today} {cal_cell_no_content}{day}{/cal_cell_no_content} {cal_cell_no_content_today}<span class="cal_today">{day}</span>{/cal_cell_no_content_today} {cal_cell_blank} {/cal_cell_blank} {cal_cell_end}</td>{/cal_cell_end} {cal_row_end}</tr>{/cal_row_end} {table_close}</table>{/table_close} '; $this -> load -> library( 'calendar' ,$prefs ); return $this -> calendar -> generate( "", "", $data ); } //下略 ?>
2)外枠のビュー内にカレンダー用の変数を設置する
カレンダーは、コントローラ側で$calendarがセットされていれば、
左ブロックに常時表示するようにする。
ソース抜粋:
ビュー側(外枠): application/views/base_view.php
(上略) <!-- leftblock //--> <div id="leftblock"> <div> <p>ようこそ!dix3さん</p> <p class="yellow">締切り前のタスクが1件あります</p> <p class="red">期限切れのタスクが2件あります</p> </div> <div> <!-- サブメニュー --> <ul id="submenu"> <li><a href="#">セッションの動作テスト</a></li> <li><a href="#">キャプチャの動作テスト</a></li> <li><a href="#">グラフの動作テスト</a></li> <li><a href="#">なんとかかんとかの動作テスト</a></li> </ul> </div> <?php if(isset($calendar)){ ?> <!-- calendar //--> <div class="calendar"><?=$calendar?></div> <!--// calendar --> <?php } ?> </div> <!--// leftblock --> (下略)
3)スタイルシート(/css/style.css)側で見た目を調整する
ソース抜粋:
スタイルシート: html/css/style.css
/*上略*/ /* カレンダー */ .calendar { margin-top:8px; font-size:1.1em; } .calendar table{ border-collapse: collapse; background:#bc8f8f; border:1px solid #ccc; } .calendar th{ border:1px solid #ccc; text-align:center; color:#fff; padding:5px; } .calendar th a{ color:#fff; } .calendar th a:hover{ color:#ff6600; } .calendar td{ border:1px solid #ccc; background:#fcfcfc; padding:6px; text-align:center; } /* カレンダーの週 */ .cal_weekrow td{ background:#a69090; color:#fff; } .cal_today{ text-decoration:underline; color:#ff6600; } /*下略*/
カレンダー生成結果
さて、明日はなにやろう。やっぱり認証かなぁー。