Listing Framework API
  • 2010/12/18 MTDDC Sapporo
  • Akira Sawada ( @aklaswad )
自己紹介
お詫び
この後プログラムの話ばかりになります。 眠くなったらごめんなさい。
アジェンダ
  • Listing Framework API の概要
  • Demo
Listing Framework
  • 管理画面内のリスト画面を共通化
  • 絞り込み/並べ替え/表示列の切り替え
Listing Framework API
  • レジストリ経由でリストを定義
  • 表示列単位/絞り込みの種類単位で追加可能
  • 既存のリストに独自の列を追加
  • 独自オブジェクト用のリストを一から作成
Listing Framework APIの目指すところ
  • 最小限の記述ですぐリストが拡張/作成できる
  • 高度/複雑な処理もカバーできる
ちなみにレジストリとは?
  • 各種設定値やサブルーチンをまとめた巨大なハッシュ(連想配列)
ちなみにレジストリとは?(2)
  • MTの拡張性の肝
  • プラグインファイルからハッシュを登録
  • 実行時にマージする事で、コア/プラグイン間で設定を共有
  • ハッシュなのでperlファイル以外にYAMLからも拡張できる
主に使用するレジストリは の2つ
ほかにも などが関わってきます
これらのレジストリに値を追加する事でリストを作成していきます。
listing_screensとlist_properties
listing_screens
リスト画面全体の設定
  • スクリーン名
  • アクセス権限
  • 初期ソート値
  • etc...
list_properties
リストに表示する要素の設定
  • 表示列の追加
  • フィルタの追加
  • etc...
in config.yaml
listing_screens:
    # __mode=list&_type=entry でアクセス
    entry:
        object_label: Entry
        default_sort_key: title
list_properties:
    # listing_screens と同じ名前で指定
    entry:
        # リスト内で使う要素を宣言
        title:
            sort: sub { ... }
            html: sub { ... }
in config.yaml
listing_screens:
    # __mode=list&_type=entry でアクセス
    entry:
        object_label: Entry
        default_sort_key: title
list_properties:
    # listing_screens と同じ名前で指定
    entry:
        # リスト内で使う要素を宣言
        title:
            sort: sub { ... }
            html: sub { ... }
こんな感じに組み合わせて使います。
list_propertiesはちょっと特殊
  • 実行時にMT::ListPropertyクラスにblessされ、オブジェクトとして扱われます。
  • サブルーチンを登録すると、第一匹数として自身のインスタンスが渡されます。
list_properties:
  entry:
    text:
      label: Text
      html: |
        sub {
          my $prop = shift;
          # $propは、自分自身(entry.text以下のハッシュ)が
          # MT::ListPropertyパッケージにblessされたもの
          # 値の取り出しや、サブルーチンの呼び出しも可能
          $prop->label # labelの値("Text")を取り出す
        }
さらに、Prototypal な継承関係があります
  • baseにprototypeとなるプロパティ名を指定
  • スカラもサブルーチンも継承可能(javascriptっぽい感じ)
  • Perlのオブジェクトとは別の独自実装
用意されている基本的なpropertyを継承できます
  • __virtual.string
  • __virtual.integer
  • __virtual.date
用意されている基本的なpropertyを継承できます(2)
  • __common.title
  • __common.tag
  • __common.object_count
list_properties:
  entry:
    text:
      label: Text
      sort: |
        sub {
          # do something...
        }
      html: |
        sub {
          # do otherthing...
        }
  page:
    text:
      base: entry.text # 継承元を指定
      # entryのtextからsortメソッドを継承
    html: | # オーバーライド
      sub {
        # page.text プロパティのインスタンス
        my $prop = shift;

        # page.text.sortはないのでentry.textのsortが実行される
        $prop->sort();

        # 継承元の同名のメソッドを呼ぶ
        $prop->super(@_);

      }
Demo
Demoのあらすじ

うまいもんが大好きなサワダは、うまいもん制覇を目指して、独自オブジェクトクラスMT::Umaimonを搭載したプラグイン「Umaimon」の開発を開始した。既に30近いumaimonオブジェクトがデータベースに登録されており、これからumaimon一覧画面の作成に取りかかる。。。

ご清聴ありがとうございました