(Movable Type) エントリー一覧画面の表示オプションについて
管理画面のエントリー一覧のテンプレート
tmpl/cms/list_common.tmpl
<mtapp:setting id="display_columns" label="<__trans phrase="Column">" label_class="top-label"> <ul id="disp_cols" class="multiple-selection"> <mt:loop name="list_columns"> <li class="<mt:if name="force_display"> hidden</mt:if>"> <input type="checkbox" value="<mt:var name="id" escape="html">" name="custom_prefs" class="main<mt:if name="is_default"> show-default</mt:if>" id="custom-prefs-<$mt:var name="id" escape="html"$>" <mt:if name="display">checked="checked"</mt:if> /> <label for="custom-prefs-<$mt:var name="id" escape="html"$>"><mt:var name="label"></label> </li> <mt:loop name="sub_fields"> <li class="sub-field"> <input type="checkbox" value="<mt:var name="class">" name="custom_prefs" class="sub<mt:if name="is_default"> show-default</mt:if>" id="custom-prefs-<$mt:var name="id" escape="html"$>.<mt:var name="class">" <mt:if name="display">checked="checked"</mt:if> /> <label for="custom-prefs-<$mt:var name="id" escape="html"$>.<mt:var name="class">"><mt:var name="label"></label> </li> </mt:loop> </mt:loop> </ul>
<mt:loop name="list_columns">とあり、list_columnsの要素数だけループさせている。
@list_columns にデータを入れている箇所
lib/MT/CMS/Common.pm
my @list_columns; for my $prop ( values %$list_props ) { next if !$prop->can_display($scope); my $col; my $id = $prop->id; my $disp = $prop->display || 'optional'; my $show = $disp eq 'force' ? 1 : $disp eq 'none' ? 0 : scalar %cols ? $cols{$id} : $disp eq 'default' ? 1 : 0; my $force = $disp eq 'force' ? 1 : 0; my $default = $disp eq 'default' ? 1 : 0; my @subfields; if ( my $subfields = $prop->sub_fields ) { for my $sub (@$subfields) { push @subfields, { display => $cols{ $id . '.' . $sub->{class} } || $sub->{display} eq 'default', class => $sub->{class}, label => $app->translate( $sub->{label} ), is_default => $sub->{display} eq 'default' ? 1 : 0, }; } } push @list_columns, { id => $prop->id, type => $prop->type, label => $prop->label, primary => $primary_col{$id} ? 1 : 0, col_class => $prop->col_class, sortable => $prop->can_sort($scope), sorted => $prop->id eq $default_sort ? 1 : 0, display => $show, is_default => $force || $default, force_display => $force, default_sort_order => $prop->default_sort_order || 'ascend', order => $prop->order, sub_fields => \@subfields, }; } @list_columns = sort { !$a->{order} ? 1 : !$b->{order} ? -1 : $a->{order} <=> $b->{order} } @list_columns;
ここで気になるのが、%$list_props。
%$list_props にデータをいれているのが、同ファイル少し上の
my $list_props = MT::ListProperty->list_properties($type);
恐らく表示させるべき情報を取り扱っているクラスは lib/MT/ListProperty.pm。
list_properties サブルーチンで \%props を return しているので、
この%propsの中に情報が入っているはずだ。
lib/MT/ListProperty.pm
sub list_properties { my $pkg = shift; my $cls = shift; my %props; my $local_props = MT->registry( 'list_properties', $cls ); if ($local_props) { for my $key ( keys %$local_props ) { my $prop = MT::ListProperty->instance( $cls, $key ); if ( $prop->has('condition') ) { next unless $prop->condition; } $props{$key} = $prop; } } my $common_props = MT->registry( 'list_properties', '__common' ); if ($common_props) { for my $key ( keys %$common_props ) { next if $props{$key}; my $prop = MT::ListProperty->instance( $cls, $key ); if ( $prop->has('condition') ) { next unless $prop->condition; } $props{$key} = $prop if $prop; } } return \%props; }
となると、MT->registryが気になる。
lib/MT.pm
sub registry { my $pkg = shift; require MT::Component; my $regs = MT::Component->registry(@_); my $r; if ($regs) { foreach my $cr (@$regs) { # in the event that our registry request returns something # other than an array of hashes, return it as is instead of # merging it together. return $regs unless ref($cr) eq 'HASH'; delete $cr->{plugin} if exists $cr->{plugin}; __merge_hash( $r ||= {}, $cr ); } } return $r; }