アルファサード株式会社 代表取締役 野田 純生のブログ


PSGI環境でMTの環境変数をプラグインでオーバーライドする時の注意


公開日 : 2014-04-24 13:00:23


動かない(違うブログのが出てくるねん)ってのが来たのですよね。ずいぶん昔に公開したものなんですけど。気が抜けないっす。

おかしいのは動的にAltTemplatePath(代替テンプレートパス)をセットしているところ。

        my $plugin_tpldir = File::Spec->catdir( $plugin->path, 'tmpl', $tpl_directory );
        $app->config( 'AltTemplatePath', $plugin_tpldir );

何でだろう、と小一時間悩んだのですが、Core.pmを眺めていて、おやっと。

        'AltTemplatePath' => {
            default => 'alt-tmpl',
            path    => 1,
            type    => 'ARRAY',
        },

あれー(いや、ARRAY...)

my @paths = $app->config( 'AltTemplatePath' );
use Data::Dumper;
MT->log( Dumper \@paths );

# $VAR1 = [ '/Applications/MAMP/htdocs/app/alt-tmpl', '/Applications/MAMP/htdocs/app/plugins/CMSContext/tmpl/Blog_1' ];

あ。。。

ConfigMgrで、defineする

と、いうことで、PSGI環境のMTでは、AltTemplatePathはセットすると配列に追加されるのでした。要するに一度セットした値が残っていて、先にマッチしたAltTemplatePathが使われていた模様。CGI環境ではこの問題は起こりません。対策としては、ConfigMgrで、defineしてからセットするということです。

        require MT::ConfigMgr;
        my $mgr = MT::ConfigMgr->instance;
        $mgr->define( 'AltTemplatePath' );

それでは、良いPSGIライフを。

13:35追記

社内からツッコミがあったので、そのまま貼っておくw

一応、単に $app->config('AltTemplatePath', ['plugins/CMSContext/tmpl']); # => ['plugins/CMSContext/tmpl' ]; でもよいのかと。 RT @junnama ARRAY型の環境変数は、$app->config( 'AltTemplatePath', $plugin_tpldir ); みたいにセットしても配列への追加なので、次回以降も残る(初期化されない) $mgr->define する必要がある。#tips #pl
なので、plugins/CMSContext/tmpl を優先するなら:
my $k = 'AltTemplatePath';
my @alt_tmpl_path = $app->config($k);
unshift @alt_tmpl_path, 'plugins/CMSContext/tmpl';
$app->config($k, \@alt_tmpl_path);
…かと思われます。

$app->config($k);
# => ['plugins/CMSContext/tmpl', 'alt-tmpl'];

これはこれで工夫しないと
# => ['plugins/CMSContext/tmpl', 'alt-tmpl'];
# => ['plugins/CMSContext/tmpl', 'plugins/CMSContext/tmpl', 'alt-tmpl'];
# => ['plugins/CMSContext/tmpl', 'plugins/CMSContext/tmpl', 'plugins/CMSContext/tmpl', 'alt-tmpl'];
# => ['plugins/CMSContext/tmpl', 'plugins/CMSContext/tmpl', 'plugins/CMSContext/tmpl', ..., 'alt-tmpl'];
…と、どんどん増えてしまいそうですが。


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ