TopMovable Typeテーマ > 2010年2月
2010年2月10日

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

February 10,2010 2:33 AM
Tag:[, , ]
Permalink

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(
                    …中略…
            }
        }
    }
Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3