読者です 読者をやめる 読者になる 読者になる

(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;
}