Movable Type 5.13で「Template load error」になる問題について
Movable Type 5.13で「Template load error」になる問題について、MTQフォーラムのトピックで話題になっていたので、こちらでも情報展開します。
1.問題点
Movable Type 5.13にアップグレードしたあと、ブログ記事投稿画面や他の管理画面にアクセスすると「Template load error」になる可能性があります。
アップグレードだけでなく、MT5.13を新規インストールしたあとにプラグインをインストールした場合も同様です。
2.原因
5.13でセキュリティが強化によりテンプレート読み込み処理が変更されたため、管理画面にテンプレートを埋め込む処理を行っているプラグインを利用している場合にこの問題が発生するようです。
具体的には、テンプレートファイルを読み込むプラグインについて、読み込むテンプレートファイルのパスを明示的に指定していないと、冒頭の「Template load error」が発生します。
エラーになったプラグインのソースコードをトレースしたところ、次のような処理を行っているプラグインがこのエラーに遭遇するようです(これがすべてかどうかは不明)。
use File::Spec;
…中略…
my $plugin = $cb->plugin;
my $hoge = $tmpl->getElementById('hoge');
my $tmpl = File::Spec->catdir($plugin->path, 'tmpl', 'foo.tmpl');
my $include = $tmpl->createElement('include', { name => $tmpl });
$tmpl->insertAfter($include, $hoge);
上記の処理は、管理画面テンプレートの任意の位置(例ではid="hoge"のついたテンプレートタグの直後)にMTIncludeタグを追加し、追加したMTIncludeタグを使って、プラグインで定義しているテンプレートをインクルードするものです。
ソースコード上は見えませんが赤色のようなMTIncludeタグが追加されます。
<mtapp:setting id="hoge">
…中略…
</mtapp:setting>
<$mt:Include name="プラグインのパス/tmpl/foo.tmpl"$>
3.対処方法
一番手っ取り早い方法は、該当のプラグインを無効化すれば解消します。
問題となるプラグインが分からない場合は一旦すべてのプラグインを無効化して、1つずつ有効にしていくとよいでしょう。
以下のプラグインを利用すれば、切り分けが楽に行えるかもしれません。
プラグインを修正する場合は、plugin_template_pathを明示的に指定すればいいようです。先程の例では赤色部分を追加します。
use File::Spec;
…中略…
my $plugin = $cb->plugin;
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
my $hoge = $tmpl->getElementById('hoge');
my $tmpl = File::Spec->catdir($plugin->path, 'tmpl', 'foo.tmpl');
my $include = $tmpl->createElement('include', { name => $tmpl });
$tmpl->insertAfter($include, $hoge);
投稿したばかりですいませんが訂正です。MTQフォーラムに適切な情報が掲載されていました。上記の例であれば下記の赤色部分を追加します。
use File::Spec;
…中略…
my $plugin = $cb->plugin;
my $hoge = $tmpl->getElementById('hoge');
my $tmpl = File::Spec->catdir($plugin->path, 'tmpl', 'foo.tmpl');
my $include = $tmpl->createElement('include', { name => $tmpl, component => 'プラグイン名' });
$tmpl->insertAfter($include, $hoge);
ブログ記事投稿画面で冒頭のエラーが発生するEmoticonButtonプラグインの場合は、Plugin.pmを任意のエディタで開き赤色部分を追加します。
sub inject_button_param {
my ( $cb, $app, $param, $tmpl ) = @_;
my $footer = $tmpl->getElementById('footer_include');
if ( $footer ) {
my $plugin = $cb->plugin;
require File::Spec;
my $tmpl_path = File::Spec->catdir($plugin->path, 'tmpl', 'emoticon.tmpl');
my $include = $tmpl->createElement('include', { name => $tmpl_path, component => 'EmoticonButton' });
$tmpl->insertBefore($include, $footer);
}
1;
}
そもそもMT5ではEmoticonButtonプラグインは動作しませんが、とりあえずエラーは解消します。
- Movable Type 5.13パッチリリース(注意:3月5日再リリース)
- Movable Type 5.13リリース:新機能の紹介と変更テンプレートのまとめ
私はMT4.292のサイトを二つ管理していて、どちらも違うテンプレートを利用しております
両方共、再構築時にテンプレのエラーが出てました
一つのテンプレは、テンプレ制作の会社が修正ファイルを出し、もう一つのテンプレは初期化し復旧となりました
もしエラーが出るようでしたらテンプレの初期化や制作会社に問い合わせてみるのもよいと思います
MT4.292はMTOS4.38にしか出来ないし、そろそろMT5です
>ひでぼんさん
こんにちは。
情報ありがとうございました。
このエントリーで掲載している問題はテンプレートの修正では解決しないので、もしMT5.13にアップグレードされる場合はご注意ください。