Movable Type 4.15β4とメタデータの扱い

Movable Type 4.15のβ4が公開されました。
米国時間の22日に公開されましたが、不具合があっていったん公開が取りやめられ、23日に修正版(β4b)が公開されました。

Movable Type 4.15βのページ

Movable Type 4.15β4では、「メタデータ」の扱い方が変化しています。

1.メタデータを独立したテーブルに保存

Change Logを見ると、こまごました不具合修正が多く行われています。
ただ、システム内部に一点大きな変更があります。

これまででは、ブログ記事等のオブジェクトにメタデータ(付随的なデータ)を保存する際には、テーブル内の「XXX_meta」というフィールドが使われていました。
4.15β4ではこの点が変更され、メタデータを保存するために独立したテーブルが使われるようになりました。
これによって、メタデータへのアクセスをより柔軟に行うことができるようになります。

2.プラグインでメタデータにアクセスする

プラグイン作者にとっては、「メタデータにどうやってアクセスするのか」という点に関心があるかと思います。

今のところ、MT::Metaクラス(MT_DIR/lib/MT/Meta.pm)のドキュメントがあります。
ただ、これは新規のクラスにメタデータ用テーブルを追加するときの話です。
既存のテーブルにメタデータのフィールドをどのように追加するのかは、今のところドキュメントがない模様です。

試してみたところ、以下のようにすることで、既存のテーブルにメタデータのフィールドを追加することができました。

2-1.レジストリにメタデータのフィールドの情報を追加

まず、レジストリの初期化(init_registry)の際に、以下のような書き方で、レジストリにメタデータのフィールドの情報を追加します。

sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        object_types => {
            'クラス' => {
                'フィールド名' => 'データ型 meta',
                'フィールド名' => 'データ型 meta',
                ・・・
            },
            ・・・
        },
    });
}

例えば、ブログ記事(entry)に「meta_test」という文字列型(string)のフィールドを追加するには、以下のようにします。

sub init_registry {
    my $plugin = shift;
    $plugin->registry({
        object_types => {
            'entry' => {
                'meta_test' => 'string meta',
            },
            ・・・
        },
    });
}

また、プラグインの作成(new)の際に、以下のようにschema_versionを指定して、データベースのアップグレードの処理が行われるようにします。

my $plugin = __PACKAGE__->new({
    ・
    ・
    ・
    schema_version => 'x.xx',
});
MT->add_plugin($plugin);

2-2.メタデータへのアクセス

loadメソッドでオブジェクトを読み込むと、メタデータも同時に読み込まれ、オブジェクトのプロパティに自動的にマッピングされます。
これによって、メタデータのフィールドは、既存のフィールドと同じように、「オブジェクト->プロパティ」の形でアクセスすることができます。

例えば、前述の手順で、ブログ記事に「meta_test」というフィールドを追加したとします。
$entryがブログ記事をさしているとすると、そのブログ記事のmeta_testフィールドに「foo」という値を代入するには、以下のように書きます。

$entry->meta_test('foo');

また、meta_testフィールドの値を変数$meta_testに代入するには、以下のように書きます。

$meta_test = $entry->meta_test;