Top > 開発ガイド > コンポーネント開発Tips集 > カレンダとの連携

カレンダとの連携

対象バージョン

当ドキュメントはRubricks-0.6.x向けです。

概要

  • カレンダと連携するようにコンポーネントを作成することができる
  • 連携することで、例えばTodoコンポーネントで登録されたTodoをカレンダ上で閲覧したり、日付をずらしたりできるようになる
  • 今回はtodoとカレンダーの連携をサンプルに説明する

作成物

  • カレンダ連携をするためには下記ファイルの作成が必要である
    • init.rb(vendor配下ではなく、コンポーネント独自プラグインのもの)
    • アダプタクラス
RAILS_ROOT/components/コンポーネント名
└component_plugins
  └─calendar ・・・ プラグイン名(任意の名称)
      │  init.rb
      │
      └─lib
              todo_list_adapter.rb ・・・ アダプタクラス(任意の名称)

init.rbの作成

#init.rb

lib = File.expand_path("#{File.dirname(__FILE__)}/lib")
require_dependency "#{lib}/todo_list_adapter"

RubricksScheduleManager << TodoList::TodoListAdapter
  • アダプタクラスをrequire_dependencyで読み込む
  • RubricksScheduleManager?にアダプタクラスを登録する

注意:このinit.rbはvendor配下に作成するものではない

アダプタクラスの作成

todo_list_adapter.rb

class TodoList::TodoListAdapter
  class << self
    def schedules(params)
      sync_todos = TodoList::TodoListTodo.find(
        :all,
        :conditions => [
          'sync_calendar_flag = 1 and ' +
          'todo_list_category_boxes.rubricks_user_id = ? and ' +
          'YEAR(close_on) = ? and MONTH(close_on) = ?',
          params[:current_user].id ,
          params[:year], params[:month]
        ],
        :include => [:todo_list_category_box]
      )
      
      sync_todos.collect do |sync_todo|
#...中略
        RubricksSchedule.new(
          :id => sync_todo.id,
          :start => sync_todo.close_on,
          :finish => finish_datetime,
          :description => sync_todo.title,
          :publicity => true,
          :callback => "alert('click!')",
          :icon => "/images/components/todo_list/todo_icon_for_calendar.gif",
          :icon_for_list => "/images/components/todo_list/todo_icon_for_list.gif",
          :removable => true
        )
      end
    end

    def change(schedule)
      target = TodoList::TodoListTodo.find(schedule.sid)
      target.close_on = schedule.start
      target.save
      {:target => 'html_id' :args => ['/xxx/xxx', 'xxx', {}]}
    end

    def delete(id)
      TodoList::TodoListTodo.destroy(id)
      [
        {:target => 'html_id' :args => ['/xxx/xxx', 'xxx', {}]},
        {:target => 'html_id2' :args => ['/yyy/yyy', 'yyy', {}]}
      ]
    end
  end
end

  • scheduleメソッドとchangeメソッドをクラスメソッドとして定義する
  • scheduleメソッドはカレンダが表示されるときに叩かれるメソッド
    • 戻り値としてRubricksSchedule?インスタンスの配列を返却する
    • RubricksSchedule?をnewする際のパラメータは下記
      • :id => カレンダ連携しているモデルのid
      • :start => スケジュール開始日時。DateTime?型。
      • :finish => スケジュール終了日時。DateTime?
      • :description => カレンダに表示される文字列。
      • :publicity => falseを設定すると鍵アイコンが表示される。デフォルトtrue。
      • :callback => スケジュールをダブルクリックされたときに実行されるJavascript。
      • :icon => カレンダー上のスケジュールとともに表示されるアイコン
      • :icon_for_list => リスト表示のときに表示されるアイコン
      • :removable => falseに設定すると削除できなくなる(ゴミ箱アイコンが表示されなくなる)。デフォルトtrue。

  • 返却したインスタンスがカレンダに表示される
  • 引数のparamsには下記のパラメータが入っている
    • :year => 表示されているカレンダーの年
    • :month => 表示されているカレンダーの月
    • :current_user => ログイン中のrubricks_userオブジェクト
  • changeメソッドはカレンダ内でスケジュールの時間が移動したときに叩かれるメソッド
    • 移動とつじつまが合うようにデータを変更する
    • パラメータのscheduleは対応するRubricksSchedule?オブジェクト
    • shchedule.sidでカレンダ連携しているモデルのidが取得できる
    • 返り値を渡すことでsimple_render_componentが呼び出し画面を更新することができる
      • 返り値は、Hashでtargetとargsを指定する。Hashを複数含んだArrayでもよい。
      • target => 更新するHTMLのID
      • args => simple_render_componentの引数。配列でcontroller、action、paramsを渡す。
  • deleteメソッドはカレンダ内でスケジュールが削除されたときに叩かれるメソッド
    • 引数でカレンダ連携しているモデルのidが渡される
    • 返り値を渡すことでsimple_render_componentが呼び出し画面を更新することができる
      • 返り値は、Hashでtargetとargsを指定する。Hashを複数含んだArrayでもよい。
      • target => 更新するHTMLのID
      • args => simple_render_componentの引数。配列でcontroller、action、paramsを渡す。

カレンダーブロックを更新する方法

任意のスケジュールを更新したときに、同期を取る場合などに行う

  • カレンダーブロックが表示されている場合、リクエストパラメータとして"rubricks_system_calendar"が自動的に送信される
  • rubricks_system_calendarパラメータが送られてきた場合は、以下のようにsimple_render_component_as_stringを実行し、その値をレスポンスとして返却する。
    • 例: simple_render_component_as_string("/system/calendar", "refresh_detail_calendar", {:rubricks_system_calendar => params[:rubricks_system_calendar]})
    • 上記のsimple_render_component_as_stringの戻り値は、Javascript(<script>タグで囲まれていない)文字列。