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'];
…と、どんどん増えてしまいそうですが。