Movable Type 5 テーマのインポータについて

Movable Type 5 テーマのインポータについて

Posted at February 10,2010 2:33 AM
Tag:[Importer, MovableType, Theme]

Movable Type 5 テーマのインポータについて、なんとなく仕組みが理解できたので、紹介しておきます。認識誤りがありましたらご指摘ください。

1.用語

  • エレメント:テンプレートセット、カテゴリ、フォルダ、カスタムフィールドなど、テーマとしてインポートされる要素
  • インポータ:各エレメントを Movable Type にインポートする主体(=実装)
  • エクスポータ:各エレメントをテーマとしてファイルにエクスポートする主体(=実装)

2.theme.yaml へのエレメントとインポータの定義方法

テーマでテンプレートセットを定義する場合は、次のようになります。テンプレートセットのエレメントは青色の「template_set」で、テンプレートセットのインポータは赤色の「template_set」です(多分)。

…前略…
elements:
    template_set:
        component: core
        importer: template_set
        name: template set
        data:
        …後略…

3.インポータを定義する意味

インポータというのは、要するに「Movable Type にデータをインポートする人」という意味なので、インポータの定義とは、Movable Type に実装されている、テンプレートセット用のインポータがどこにあるかを指定している、ということになります。

で、テンプレートセットのインポータは、lib/MT/Theme.pmのcore_theme_element_handlers()に定義されています。エクスポータや他のエレメントのインポータについてもここにまとめて定義されています。

sub core_theme_element_handlers {
    return {
        …中略…
        template_set => {
            label => 'Template Set',
            importer => {
                import => '$Core::MT::Theme::TemplateSet::apply',
                info   => '$Core::MT::Theme::TemplateSet::info',
            },
            exporter => {
                params    => 'template_set_export_ids',
                template  => '$Core::MT::Theme::TemplateSet::export_template',
                export    => '$Core::MT::Theme::TemplateSet::export',
                finalize  => '$Core::MT::Theme::TemplateSet::finalize',
                condition => '$Core::MT::Theme::TemplateSet::condition',
            },
        },
        …中略…
    };
}

実際にインポートをする実装は、青色の行のimportに対応する、lib/MT/Theme/TemplateSet.pmのapply()になります。

sub apply {
    my ( $element, $theme, $obj_to_apply, $opts ) = @_;
    my $set = $element->{data};
    if ( !ref $set ) {
        $set = MT->registry('template_sets', $set);
    }
    …後略…

4.require について

エレメントには次のようにrequireを設定することができます。テーマを適用するにあたって、そのエレメントを必須にしたい場合は、requireに「1」を設定します。デフォルト値は「0」です。

…前略…
elements:
    template_set:
        component: core
        importer: template_set
        require: 1
        name: template set
        data:
        …後略…

「1」を設定した状態でインポートを実行(=テーマを適用)し、何かの不具合でインポートに失敗すると、このエレメントを含むテーマを適用しません。「0」を設定した状態でインポートに失敗すると、このエレメントのインポートをスキップして、次のエレメントのインポートを続行します(多分)。

その実装は、lib/MT/Theme.pmのapply()にあります(他にもあるかもしれません)。

sub apply {
    my $theme = shift;
    my ( $blog, %opts ) = @_;
    …中略…
    ## run all element handlers.
    my @elements = $theme->elements;
    for my $element ( @elements ) {
        next if $element->{class} && ( $element->{class} ne $blog->class_type );
        next if $importer_filter && !$importer_filter->{ $element->{importer} };
        my $result = $element->apply( $blog, $opts{ $element->{importer} } );
        if ( !$result ) {
            if ( $element->{require} ) {
                return $theme->error(
                    MT->translate(
                    …中略…
            }
            else {
                $theme->{warning_on_apply} = 1;
                require MT::Log;
                my $log = MT::Log->new;
                $log->message(
                    MT->translate(
                    …中略…
            }
        }
    }
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)