Movable Type 5 テーマのインポータについて
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(
…中略…
}
}
}
- Movable TypeでRainerテーマのtitle要素にページ番号を表示する方法
- Movable Type(MT)5 テーマ(レスポンシブWebデザイン対応)
- Movable Typeのテーマ機能を使ってブログ記事・ウェブページを移行する
- Movable Typeテーマ「フォトログ」バージョンアップ
- フォトログテーマの画像サイズを変更する
- Movable Type(MT)5 テーマ - SEO対策版
- フォトログ v0.70
- Movable Typeテーマのバージョンチェック(MT DDC TOKYO未公開スライド)
- Movable Type フォトログテーマ(Photolog Theme)
- Movable Type(MT)5 テーマ修正(プレビュー時のエラー対処)
- Movable Type(MT)5 テーマ修正(2カラムリキッドレイアウト修正)
- Movabld Type 5(MT5)テーマ機能の「ファイル」について
- Movable Type(MT)5 テーマ修正(エクスポート時の不具合修正)
- Movable Type(MT)5 テーマ修正(スタイルライブラリ対応)
- Movable Type 5.0 のテーマの警告について