Skip to content

Ja dev registry list properties

aklaswad edited this page Dec 26, 2011 · 9 revisions

Registry: list_properties

list_properties の構造

リスティングフレームワークでは、リストプロパティと呼ばれる要素をレジストリに追加することで、リスト画面に、表示列やフィルタなどの機能を追加していくことが出来ます。一つのプロパティのなかには、以下の諸動作を一括で定義します。

  • カラムの表示の定義
  • フィルタリングの定義
  • ソートの定義

例えばentryのリストにtitleというプロパティを追加する場合、

  • titleプロパティの表示形式
  • titleプロパティでのフィルタ方法の定義
  • titleプロパティでのソート方法の定義

を、そのプロパティの属性として記述することになります。もちろん、フィルタのみを行うようなプロパティも記述可能です。

list_properties:
    entry:                # __mode=list&_type=entryのリクエストで
        title:            # titleという列で
            label: Entry
            html: $Core::MT::Entry::title_html
            # ...以下、ブログ記事のタイトルを表示/フィルタする場合の設定
        body:
            label: Body
            html: $Core::MT::Entry::body_html
            # ...以下、ブログ記事の本文を表示/フィルタする場合の設定

プロパティの継承

リストプロパティには継承関係を設定することが出来ます。@base@ に継承元となるリストIDとプロパティIDを、ドット . でつないだ文字列を指定します。

#entryリストのtitleプロパティを、__virtual.labelから継承し、labelだけ変更
list_properties:
    entry:
        title:
            label: Title
            base: __virtual.label

Auto

プロパティに auto フラグを指定することで、該当カラムのスキーマから判断される継承元を自動的に設定できます。プロパティIDと同じ名前のカラムがオブジェクトに存在している必要があります。
表示名については自動で設定されませんので、 label をあわせて指定してください。

list_properties:
    entry:
        title:
            auto: 1
            label: Title
        # EntryオブジェクトのTitleカラムはstring型なので、自動的に
        # @__virtual.string@ を継承し、テキスト検索型のフィルタと
        # ソートルーチンを利用できる
        keyword: Keyword
        # これは
        # keyword:
        #     auto: 1
        #     label: Keyword
        # のシンタックスシュガー

指定可能な値

args_via_param

CGIパラメータからフィルタを生成するサブルーチンを指定します。

                  args_via_param => sub {
                      my $prop = shift;
                      my ( $app, $val ) = @_;  # $val にパラメータ"filter_val"の値が入る
                      return { option => 'equal', string => $val };
                  },

auto

プロパティの自動継承を行うかを指定します。デフォルトは偽です。

base

プロパティの継承元を指定します。デフォルトはundef (継承元なし)です。

bulk_html

リストとして表示するコンテンツの内容を一括で生成するサブルーチンを指定します。

bulk_html => sub {
    my $prop = shift;
    my ($objs, $app, $opts) = @_;
    my %authors = map { $_->author_id => 1 } @$objs;
    my @authors = MT->model('author')->load(
        { id => [ keys %authors ], },
    );
    my %author_name = map { $_->id => $_->display_name } @authors;
    my @out;
    for my $obj (@$objs) {
        my $name = $author_name{ $obj->author_id };
        push @out, $name;
    }
    return @out;
},

bulk_sort

ロード済みオブジェクトのソートを行うサブルーチンを指定します。 sort の指定がなく、 bulk_sort が指定されている場合のみ有効となります。bulk_sortを行う場合、ページに含まれないものを含めた全オブジェクトがロードされます。そのため、パフォーマンスの劣化を招く恐れがあります。

bulk_sort => sub {
    my $prop = shift;
    my ($objs, $opts) = @_;
    return sort {
        $a->name cmp $b->name
    } @$objs;
},

condition

プロパティが利用可能となる条件を判定するサブルーチンを指定します。

default_sort_order

初期ソートの方向を指定します。ascend か descend が指定できます。デフォルトは ascend です。

display

テーブルへの表示を行うかを指定します。 以下のうちの一つを指定します。

force
必ず表示。ユーザーは表示オプションで非表示とすることは出来ません。
default
初期状態では表示。ユーザーは表示オプションで非表示とすることが出来ます。
optional
初期状態では非表示。ユーザーは表示オプションで表示させることが出来ます。
none
常に非表示

省略した場合 optional となります。なお、listing_screenでprimaryに指定したカラムについては(複数指定した場合には、そのうちの一つ以上のカラムに)、必ずforceを指定するようにしてください。

filter_editable

ユーザーがフィルタアイテムの編集を行えるかを指定します。

filter_label

フィルタアイテムの選択欄で、テーブルのヘッダとは異なる表示を行う場合に指定します。

filter_tmpl

フィルタアイテムとして利用する MTML テンプレートを指定します。

grep

SQL では絞り込みが行えない場合などに、全アイテムのロード後に実行されるPerlコードによってオブジェクトのフィルタリングを実装する場合にサブルーチンを指定します。パフォーマンスの劣化を招く恐れがあります。

grep => sub {
    my $prop = shift;
    my ( $args, $objs, $opts ) = @_;
    return grep { some_complex_judge( $_ ) } @$objs;

html

テーブルに表示する HTML を返すサブルーチンを指定します。

html => sub {
    my $prop = shift;
    my ( $obj, $app, $opts ) = @_;
    return sprintf '<p class="foo">%s</p>', $obj->text;
}

html_link

テーブルに表示するコンテンツにリンクを指定できます。

html_link => sub {
    my $prop = shift;
    my ( $obj, $app, $opts ) = @_;
    return $app->uri(
        mode => 'foo',
        args => {
            id => $obj->id,
        },
    );
},

init

MT::ListProperty クラスのインスタンスが作成された際の初期化ルーチンを指定できます。

label

プロパティの表示名を指定します。

label_via_param

フィルタの表示名をリクエストパラメータから生成するサブルーチンを指定できます。

label_via_param => sub {
    my $prop = shift;
    my ( $app, $val ) = @_;
    return MT->translate(
        '[_1] in [_2]: [_3]',
        $prop->datasource->class_label_plural,
        $prop->label,
        MT::Util::encode_html($val),
    );
},

raw

オブジェクトの値を返すサブルーチンを指定します。

raw => sub {
my $prop = shift;
my ( $obj, $app, $opts ) = @_;
return $obj→title;
},

sort

ソートの指定を行うサブルーチンを指定します。 MT::Object::load に渡される $terms $args を受け取って、必要なパラメータを指定してください。

sort => sub {
    my $prop = shift;
    my ( $terms, $args, $opts ) = @_;
    $args->{sort} = 'title';
    return;
}

sub_fields

サブフィールドの一覧を指定します。同じカラム内に、ユーザーが表示/非表示を選択可能な表示要素を含めることが出来ます。複数のサブフィールドを配列で指定します。各サブフィールドの指定は、 class, labeldisplay の値を持つハッシュで表現します。
JavaScriptにより、@class@ で指定したCSSクラスに対して、自動的に表示/非表示の処理が行われます。

list_properties:
    entry:
        title:
            sub_fields:
                - 
                     class: excerpt
                     label: Excerpt
                     display: default

terms

オブジェクトのフィルタリングを行うサブルーチンを指定します。 MT::Object::load に渡される $terms $args を受け取って、必要なパラメータを指定してください。

terms => sub {
    my $prop = shift;
    my ( $args, $db_terms, $db_args, $opts ) = @_;
    my $value  = $args->{value};
    return { $col => $value };
},

validate_item

フィルタリングの実行前にリクエストパラメータの整合性を確認するサブルーチンを指定します。

validate_item => sub {
    my $prop   = shift;
    my ($item) = @_;
    my $args   = $item->{args};
    my $option = $args->{option}
        or return $prop->error(
        MT->translate('option is required') );
    return 1;
},

view

このプロパティが利用可能なスコープを指定します。

view => [ 'system', 'website', ],

See Also

Clone this wiki locally