« エントリ投稿時の500エラーを強引に回避する方法 | メイン | 「MOVABLETYPE PLUGINS DIRECTORY」が出ます »

2006年11月 8日

エントリ投稿時の500エラーを強引に回避する方法、おかわり[ トラブルシューティング, プラグイン ]

前回、「エントリ投稿時の500エラーを強引に回避する方法」のエントリで書いた、投稿時にコメントとトラックバックを停止するというワザ。
これを、自動化できないもんかなーと、プラグインを作ってみたりしたけど、解除するタイミングが難しくて停止したままになっちゃう可能性が高い。
なんとかできないかなーと思って、こんな風にしてみました。

package MT::Plugin::Silence;

use strict;
use MT::Plugin;
@MT::Plugin::Silence::ISA = qw(MT::Plugin);

use vars qw($PLUGIN_NAME $VERSION);
$PLUGIN_NAME = 'Silence';
$VERSION = '0.50';

use MT;
my $plugin = new MT::Plugin::Silence({
    name => $PLUGIN_NAME,
    version => $VERSION,
    description => "Silence",
    author_name => 'CHEEBOW',
    author_link => 'http://cheebow.info/chemt/',
});

MT->add_plugin($plugin);
MT->add_callback('CMSPreSave.entry', 9, $plugin, \&CMSPreSave_entry);
MT->add_callback('MT::App::CMS::AppTemplateOutput.edit_entry', 9, $plugin, \&hdlr_edit_entry_source);

MT->add_task(
    {
        key => 'rename_scripts',
        name => 'Rename scripts',
        frequency => 5 * 60, # every 5 min
        code => sub {$plugin->rename_scripts;},
    }
);

sub instance { $plugin; }

sub _rename_scripts {
    my ($app, $dir) = @_;

    my $tb_script = File::Spec->catfile($app->{mt_dir}, $app->config('TrackbackScript'));
    my $comment_script = File::Spec->catfile($app->{mt_dir}, $app->config('CommentScript'));
    
    my $renamed_tb_script = $tb_script . ".$PLUGIN_NAME";
    my $renamed_comment_script = $comment_script . ".$PLUGIN_NAME";
    
    my ($from_tb, $to_tb);
    my ($from_comment, $to_comment);
    if ($dir == 0) {
        $from_tb = $tb_script;
        $to_tb = $renamed_tb_script;
        $from_comment = $comment_script;
        $to_comment = $renamed_comment_script;
    } else {
        $from_tb = $renamed_tb_script;
        $to_tb = $tb_script;
        $from_comment = $renamed_comment_script;
        $to_comment = $comment_script;
    }

    if ((-e $from_tb) && !(-e $to_tb)) {
        rename($from_tb, $to_tb);
    }
    
    if ((-e $from_comment) && !(-e $to_comment)) {
        rename($from_comment, $to_comment);
    }
}

sub CMSPreSave_entry {
    my ($cb, $app, $entry) = @_;
    
    _rename_scripts($app, 0);

    1;
}

sub hdlr_edit_entry_source {
    my ($eh, $app, $tmpl_str_ref, $param, $tmpl) = @_;

    return unless $param->{saved_changes};

    _rename_scripts($app, 1);

    1;
}

sub rename_scripts {
    my $plugin = shift;
    my $app = MT->instance;

    _rename_scripts($app, 1);

    1;
}

1;

タスクの機能を使って、リネームしたスクリプトを元に戻します。
とりあえず、一時的にリネームしっぱなしになっちゃったとして、後で元には戻るか、と。
ただ、リネームしっぱなしになる時間が結構かなくなる可能性もあるので、コメント、トラックバックを重要視する方には厳しいかも。
リビルドの最初と最後にフックできるといいんだけどなぁ。


MovableTypeするならおすすめです!

投稿者 CHEEBOW : 2006年11月 8日 13:56