ListingFrameworkのオブジェクトの中身を見る

MTQを見ていたところ、tomixさんから以下のような質問が上がっていました。

MTDDCからかえってきて、
早速、荒木さんのサンプルをいれて、
リスティングフレームワークをいじり始めています。
リストに表示するために取ってくるオブジェクトの中身が、どのようなものか、みてみたいのですが。方法はありますか?

この質問に答えてみます。

1.Data::Dumper

Listing Frameworkだけでなく、Perl一般のオブジェクトの中身を見る際には、Data::Dumperを使います。
Data::Dumperは、配列/ハッシュ/オブジェクトの中身をダンプする際に使います。
例えば、$objの中身をダンプして変数$dに代入するには、以下のように書きます。

use Data::Dumper;

my $d = Dumper($obj);

ダンプの結果は、Perlのコードの形の文字列になります。

2.プラグインの修正

上記の話に基づいて、MTQに上がっていたプラグインを修正すると、以下のようになります。
ただし、$appは巨大なオブジェクトなので、$appは出力しないようにしました。
また、ダンプ結果にHTMLが含まれ、そのまま出力すると表示が若干乱れますので、MT::Util::encode_htmlを使って、ダンプ結果をHTMLエンコードしてから出力しています。

id: hogehoge
list_properties:
  entry:
    keywords:
      auto: 1
      label: キーワード
      display: force
    title:
      auto: 1
      label: 記事
      display: force
      sub_fields:
        - class: excerpt
          label: 本文
          display: force
      html: >
        sub {
          use Data::Dumper;
          use MT::Util qw( encode_html );
          my ($prop, $obj, $app ) = @_;
          my $title = $obj->title;
          my $p = encode_html(Dumper($prop));
          my $out =qq{
            <span><b>$title</b><span><br />
            <pre class="excerpt" style="height : 100px;">$p</pre>
          };
          return $out;
        }

このプラグインをインストールして、ダンプ結果を表示してみると、以下の画面のようになります。

$propのダンプ結果

3.$propの中身

$propは、config.yamlファイルでlist_propertiesに登録した情報を、MT内部で追加・修正したものになっています。
ちなみに、上記のプラグインのダンプ結果を整形すると、以下のようになっています。
「html」や「sub_fields」を見ると、config.yamlファイルに書いた内容が、そのままPerlの形になっていることが分かります。

$VAR1 = bless( {
    'base' => '__virtual.title',
    'object_type' => 'entry',
    '_base' => bless( {
・
・(途中略)
・
    }, 'MT::ListProperty' ),
    'datasource' => 'MT::Entry',
    'display' => 'force',
    'sort' => sub { "DUMMY" },
    'html' => 'sub {
        use Data::Dumper;
        use MT::Util qw( encode_html );
        my ($prop, $obj, $app ) = @_;
        my $title = $obj->title;
        my $p = encode_html(Dumper($prop));
        my $out =qq{
            <span><b>$title</b><span><br />
            <pre class="excerpt" style="height : 100px;">$p</pre>
        };
        return $out;
    }',
    'col' => 'title',
    'order' => 200,
    'sub_fields' => [
        {
            'label' => "\x{672c}\x{6587}",
            'class' => 'excerpt',
            'display' => 'force'
        }
    ],
    'id' => 'title',
    'type' => 'title',
    'class' => 'entry',
    'label' => sub { "DUMMY" },
    'raw' => sub { "DUMMY" }
}, 'MT::ListProperty' );

4.$appの内容

$appは、MT::App::CMSオブジェクトを指しています。
$appの中には多数のメソッドやプロパティがありますので、ダンプするとかなり巨大な文字列が出力されます。