Quantcast
Channel: 小粋空間
Viewing all articles
Browse latest Browse all 219

Movable Type 5.13で「Template load error」になる問題について

$
0
0


Movable Type 5.13で「Template load error」になる問題について、MTQフォーラムのトピックで話題になっていたので、こちらでも情報展開します。

1.問題点

Movable Type 5.13にアップグレードしたあと、ブログ記事投稿画面や他の管理画面にアクセスすると「Template load error」になる可能性があります。

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つずつ有効にしていくとよいでしょう。

以下のプラグインを利用すれば、切り分けが楽に行えるかもしれません。

MultiPluginSwitcherプラグイン
MultiPluginSwitcherプラグイン

プラグインを修正する場合は、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プラグインは動作しませんが、とりあえずエラーは解消します。


Viewing all articles
Browse latest Browse all 219

Trending Articles