Ja dev registry 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
フラグを指定することで、該当カラムのスキーマから判断される継承元を自動的に設定できます。プロパティIDと同じ名前のカラムがオブジェクトに存在している必要があります。
表示名については自動で設定されませんので、 label
をあわせて指定してください。
list_properties:
entry:
title:
auto: 1
label: Title
# EntryオブジェクトのTitleカラムはstring型なので、自動的に
# @__virtual.string@ を継承し、テキスト検索型のフィルタと
# ソートルーチンを利用できる
keyword: Keyword
# これは
# keyword:
# auto: 1
# label: Keyword
# のシンタックスシュガー
CGIパラメータからフィルタを生成するサブルーチンを指定します。
args_via_param => sub {
my $prop = shift;
my ( $app, $val ) = @_; # $val にパラメータ"filter_val"の値が入る
return { option => 'equal', string => $val };
},
プロパティの自動継承を行うかを指定します。デフォルトは偽です。
プロパティの継承元を指定します。デフォルトはundef (継承元なし)です。
リストとして表示するコンテンツの内容を一括で生成するサブルーチンを指定します。
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;
},
ロード済みオブジェクトのソートを行うサブルーチンを指定します。 sort
の指定がなく、 bulk_sort
が指定されている場合のみ有効となります。bulk_sortを行う場合、ページに含まれないものを含めた全オブジェクトがロードされます。そのため、パフォーマンスの劣化を招く恐れがあります。
bulk_sort => sub {
my $prop = shift;
my ($objs, $opts) = @_;
return sort {
$a->name cmp $b->name
} @$objs;
},
プロパティが利用可能となる条件を判定するサブルーチンを指定します。
初期ソートの方向を指定します。ascend か descend が指定できます。デフォルトは ascend です。
テーブルへの表示を行うかを指定します。 以下のうちの一つを指定します。
- force
- 必ず表示。ユーザーは表示オプションで非表示とすることは出来ません。
- default
- 初期状態では表示。ユーザーは表示オプションで非表示とすることが出来ます。
- optional
- 初期状態では非表示。ユーザーは表示オプションで表示させることが出来ます。
- none
- 常に非表示
省略した場合 optional
となります。なお、listing_screenでprimaryに指定したカラムについては(複数指定した場合には、そのうちの一つ以上のカラムに)、必ずforceを指定するようにしてください。
ユーザーがフィルタアイテムの編集を行えるかを指定します。
フィルタアイテムの選択欄で、テーブルのヘッダとは異なる表示を行う場合に指定します。
フィルタアイテムとして利用する MTML テンプレートを指定します。
SQL では絞り込みが行えない場合などに、全アイテムのロード後に実行されるPerlコードによってオブジェクトのフィルタリングを実装する場合にサブルーチンを指定します。パフォーマンスの劣化を招く恐れがあります。
grep => sub {
my $prop = shift;
my ( $args, $objs, $opts ) = @_;
return grep { some_complex_judge( $_ ) } @$objs;
テーブルに表示する HTML を返すサブルーチンを指定します。
html => sub {
my $prop = shift;
my ( $obj, $app, $opts ) = @_;
return sprintf '<p class="foo">%s</p>', $obj->text;
}
テーブルに表示するコンテンツにリンクを指定できます。
html_link => sub {
my $prop = shift;
my ( $obj, $app, $opts ) = @_;
return $app->uri(
mode => 'foo',
args => {
id => $obj->id,
},
);
},
MT::ListProperty クラスのインスタンスが作成された際の初期化ルーチンを指定できます。
プロパティの表示名を指定します。
フィルタの表示名をリクエストパラメータから生成するサブルーチンを指定できます。
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 => sub {
my $prop = shift;
my ( $obj, $app, $opts ) = @_;
return $obj→title;
},
ソートの指定を行うサブルーチンを指定します。 MT::Object::load
に渡される $terms
$args
を受け取って、必要なパラメータを指定してください。
sort => sub {
my $prop = shift;
my ( $terms, $args, $opts ) = @_;
$args->{sort} = 'title';
return;
}
サブフィールドの一覧を指定します。同じカラム内に、ユーザーが表示/非表示を選択可能な表示要素を含めることが出来ます。複数のサブフィールドを配列で指定します。各サブフィールドの指定は、 class
, label
と display
の値を持つハッシュで表現します。
JavaScriptにより、@class@ で指定したCSSクラスに対して、自動的に表示/非表示の処理が行われます。
list_properties:
entry:
title:
sub_fields:
-
class: excerpt
label: Excerpt
display: default
オブジェクトのフィルタリングを行うサブルーチンを指定します。 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 => 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 => [ 'system', 'website', ],