なんか変だ...と思っていましたが、これについては、ちょっと勘違いしていたことが判明したので忘れないうちに。Movable Type 4.1 および OpenSource で確認しています。
そのまま貼付けます。コメント保存の際の二種類のコールバック指定「cms_post_save.comment」と「MT::Comment::post_save」を、両方定義しています。動作はいずれも同じで、Movable Type のログに「(コールバック指定) START.」と出力したあと、保存したコメントの ID を出力します。
package MT::Plugin::TestPostSaveComment;
######################### Setting etc. #########################
use strict;
use MT;
use MT::Plugin;
use MT::Comment;
use Data::Dumper;
our $VERSION = '0.1';
our $SCHEMA_VERSION = '0.1';
use base qw( MT::Plugin );
@MT::Plugin::TestPostSaveComment::ISA = qw(MT::Plugin);
my $plugin = __PACKAGE__->new({
id => 'TestPostSaveComment',
key => 'testpostsavecomment',
name => 'TestPostSaveComment',
author_name => 'okayama',
author_link => 'http://weeeblog.net/',
description => 'コメント保存のコールバックのテスト用プラグイン',
version => $VERSION,
schema_version => $SCHEMA_VERSION,
});
MT->add_plugin($plugin);
my $DEBUG = 1;
######################### Init Plugin #########################
sub init_registry {
my $plugin = shift;
$plugin->registry({
callbacks => {
'cms_post_save.comment'
=> \&_cms_post_save_comment,
'MT::Comment::post_save'
=> \&_mt_comment_post_save,
},
});
}
######################### Routines for CMS #########################
sub _cms_post_save_comment {
my ($eh, $app, $obj, $original) = @_;
my $comment_id = $obj->id;
$app->log('cms_post_save.comment START.');
$app->log($comment_id . ' is saved.');
}
sub _mt_comment_post_save {
my ($cb, $obj, $original) = @_;
my $app = MT->instance();
my $q = $app->param;
my $comment_id = $obj->id;
$app->log('MT::Comment::post_save START.');
$app->log($comment_id . ' is saved.');
}
1;
生成されたブログ記事からコメントを投稿した場合、「MT::Comment::post_save」だけが呼ばれます。上記のコードだと、「MT::Comment::post_save START.」というログが残ります。
Movable Type の、すでに投稿されたコメントの編集画面からコメントを保存したときに呼ばれるのは、「cms_post_save.comment」と、「MT::Comment::post_save」の両方です。上記のコードだと、コメント編集画面からコメントを保存すると「cms_post_save.comment START.」と、「MT::Comment::post_save START.」というログが残ります。
この場合は、「MT::Comment::post_save」だけが呼ばれます。「MT::Comment::post_save START.」というログが残ります。
この場合も、「MT::Comment::post_save」だけが呼ばれます。「MT::Comment::post_save START.」というログが残ります。
「MT::Comment::post_save」は、とにかくコメントが保存されたら呼ばれることになります。「cms_post_save.comment」は、Movable Type のコメント編集画面からコメントを保存した場合のみ呼ばれることになります。
Movable Type 管理画面におけるコメントの保存では処理を行わないようにする、と考えれば、「MT::Comment::post_save」で呼び出すルーチンの冒頭で、クエリパラメータ「__mode」をチェックし、これが存在すれば 1 を返し、何もさせないようにします。具体的には、上記コードにおける「_mt_comment_post_save」サブルーチンを以下のようにします。
sub _mt_comment_post_save {
my ($cb, $obj, $original) = @_;
my $app = MT->instance();
my $q = $app->param;
my $mode = $q->param('__mode');
if ($mode) {
return 1; # パラメータに __mode があれば return し、以降の処理は行わない
}
my $comment_id = $obj->id;
$app->log('MT::Comment::post_save START.');
$app->log($comment_id . ' is saved.');
}
このようにしておけば、ブログの複製の時にも処理が行われないようになります。クエリパラメータのチェックは「return_args」でも同じです。
ブログの複製は、ブログの一覧から複製したいブログにチェックを入れ、ドロップダウンメニューから「ブログの複製」を選択することによって行われます。この場合、クエリパラメータ「action_name」で「clone_blog」という値が渡されますので、これをチェックして処理が行われないように分岐することができます。具体的には、以下のようにします。
sub _mt_comment_post_save {
my ($cb, $obj, $original) = @_;
my $app = MT->instance();
my $q = $app->param;
if (($q->param('action_name') eq 'clone_blog')) {
return 1; # パラメータ action_name の値が clone_blog であれば return し、何もしない
}
my $comment_id = $obj->id;
$app->log('MT::Comment::post_save START.');
$app->log($comment_id . ' is saved.');
}
サイト構築の際は、コメント投稿フォームを問い合わせフォームとして利用することがよくあるのではないかと思いますが、そのときにコメント投稿とともにメールを飛ばすような処理にしていると、ブログを複製したときや、コメント編集画面から保存した場合にもメールが飛んでくるのでびっくりします。僕のようにテスト環境で何十通もメールを受け取るハメになります。テスト環境だからよかったものの...
Comments