« ダッシュボードへのお手軽な情報配信を実現する TwitterWidget | メイン | デスクトップPCからスケジュールタスクを実行する方法 Windows編 »

ブログごとにプラグインの有効/無効を切り替える

MTプラグインは、MTシステムにインストールするとシステム単位の有効/無効は指定できますが、ブログごとの有効/無効を指定することができません(2009/07現在)。
システムに実装されていない以上プラグインで実装するしかないわけです。
毎回同じようなコードを書くわけで、いいかげんテンプレート化できてきたので、ここで、紹介しておこうと思います。

package MT::Plugin::BlogEnable;

use strict;
use MT::Plugin;
use base qw( MT::Plugin );

use MT;
my $plugin = MT::Plugin::BlogEnable->new({
    id => 'blogenable',
    key => __PACKAGE__,
    name => 'BlogEnable',
    blog_config_template => \&blog_config_template,
    settings => new MT::PluginSettings([
        ['plugin_enable', { Default => 1, Scope => 'blog' }],
    ]),
});

MT->add_plugin($plugin);

sub blog_config_template {
    my $tmpl = <<'EOT';
<mtapp:setting
    id="plugin_enable"
    label="<__trans phrase="Enable:">">
    <p><input type="checkbox" value="1" name="plugin_enable" id="plugin_enable"<mt:if name="plugin_enable"> checked="checked"</mt:if> class="cb"/> <label for="plugin_enable">Plugin enable</label></p>
</mtapp:setting>
EOT
}

sub plugin_enable {
    my $plugin = shift;
    my ($blog_id) = @_;
    my %plugin_param;

    $plugin->load_config(\%plugin_param, 'blog:'.$blog_id);
    my $value = $plugin_param{plugin_enable};
    $value;
}

1;

結局のところ、ブログごとのプラグイン設定で、有効/無効を指定させるってことになります。
で、実際のタグの処理や、フックの処理の部分で

return 1 unless $plugin->plugin_enable($blog_id);

みたいな感じで、有効になっていなければ抜けるみたいにするのが良いのかも。
もっとスマートな方法もありそうな気がするんですけど、割と自由にコントロールしやすいこの方法が今のところベストな気がしています。

お問い合わせ

エムロジック株式会社ではMovable Typeによるサイト構築やプラグイン開発、iPhone・Windows等のアプリケーション開発業務を行っています。
お問い合わせはこちらまで。

コメント (6)

かまた:

すみません。質問させてください。

return 1 unless $plugin->plugin_enable($blog_id);

の前はどのように記述すればよいのでしょうか。

sekine :

>かまたさん
これは、フックのタイプなどによっても異なるのですが、フックした関数内で、現在のブログIDを取得してから、この条件文を使うことになると思います。たとえば、こんな感じで。

sub CMSPostDelete_entry {
my ($cb, $app, $entry) = @_;
my $blog_id = $entry->blog_id;

return 1 unless $plugin->plugin_enable($blog_id);

<中略>

}

かまた:

>sekineさん

ご返信ありがとうございます。
asset_insertのタイミングで$blog_idを取得するにはどのようにすればよいでしょうか?

my ($eh, $app, $tmpl, $ctx) = @_;
$blog_id = $ctx->stash('blog_id');

このように記述しても $blog_id には
"dialog/asset_insert.tmpl"
としか入っていませんでした。

たびたびの質問申し訳ありません。
ご教授頂ければ幸いです。
よろしくお願いします。

sekine :

>かまたさん
それであれば、

my ($eh, $app, $tmpl, $ctx) = @_;
my $q = $app->param;
my $blog_id = $q->param('blog_id');

こんな感じでしょうか?
この手のものを調べるときには、渡ってきた引数を一度ダンプして(Data::Dumperでシステムログにかきだしてみるとか)中身を見てみるとよいかもしれません。

かまた:

>sekineさん
ご返信ありがとうございます。
$blog_idを取得することができました。
無事期待通りの動作をさせることができました。
大変助かりました!
ありがとうございます!

mayona:

プラグインを記述を勉強しています。
こちらの記述には「チェックが入っていたら、入っていなかったら」という記述が見当たらないのですが、どこでそれを行っているのでしょうか。

「チェックが入っていたら、入っていなかったら」の記述はプラグインだと一般的にどういった書き方をするのか、ご教授いただけないでしょうか。

どうぞよろしくお願いします。