BLOG

Go to top


コメント保存時のコールバック「cms_post_save.comment」と「MT::Comment::post_save」の違いについて

April 25, 2008 11:34 PM

なんか変だ...と思っていましたが、これについては、ちょっと勘違いしていたことが判明したので忘れないうちに。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 のコメント編集画面で保存した場合

Movable Type の、すでに投稿されたコメントの編集画面からコメントを保存したときに呼ばれるのは、「cms_post_save.comment」と、「MT::Comment::post_save」の両方です。上記のコードだと、コメント編集画面からコメントを保存すると「cms_post_save.comment START.」と、「MT::Comment::post_save START.」というログが残ります。

Movable Type 管理画面の「返信」機能を利用した場合はどうか

この場合は、「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


Contact me

Copyright © 2005 - 2017 okayama All rights reserved.