クローン機能におけるコールバックは、 post_clone すなわち複製が行われた後発生させることができます。複製前に発生させることができればより便利かもしれませんが、MT本体のモジュールを見る限り、複製前にコールバックを発生させることはできません。
プラグインにおいては、以下のように init_registry します。
sub init_registry { my $plugin = shift; $plugin->registry({ callbacks => { 'MT::Blog::post_clone' => \&_post_clone, }, }); }
より詳細に言えば、クローン機能実行の際に出力される進捗状況・実行結果がひととおり表示された後、具体的にはブログのウィジェットを複製した後です。ソースを見る限り、ブログのウィジェットの複製は行われない場合もあるようですが、その場合はテンプレートマップの複製が最後の処理になります。いずれにせよ、クローン機能におけるコールバックはそれらの処理が行われた直後に発生させることができます。
プラグインとして作成したコールバック処理結果の出力についても、その直後に出力することになります。一度表示された本来のクローン機能の実行結果を消すこともできますが、いったん表示されているものを消すのはどうかと思うので、別途出力するのがよいかと思います。処理結果の出力は javascript で行われますが、プラグインを作成する際に気にする必要はありません。コールバックに引数として出力内容と出力位置を渡してやればよいだけです。以下、ClonedBlogCleaner プラグイン のソースコードで解説します。
my $state = 'Checking Entries...'; $callback->($state, "entrycleaner_status_checking");
上記のようにコールバックに渡すと、以下のようなソースが吐き出されます。
<li id="entrycleaner_status_checking">Checking Entries...</li>
要は、id が entrycleaner_status_checking の li タグを出力するということです。これだけでは javascript で吐いているのかどうかはわかりませんが、以下のようにするとわかります。
my $state = 'Cleaning Entries...'; $callback->($state, "entrycleaner_status_cleaning"); (中略: entry を削除し、削除数をカウントする処理) $callback->($state . ' ' . $removed_entries_num . ' Entries were Cleaned.', "entrycleaner_status_cleaning");
このようにすると、以下のようなソースが出力されます。
<li id="entrycleaner_status_cleaning">Cleaning Entries... 7 Entries were Cleaned.</li> <script type="text/javascript">progress('Cleaning Entries... 7 Entries were Cleaned.', 'entrycleaner_status_cleaning');</script>
要は、一度出力したものを置き換える場合に javascript を使っているということです。うまいことやりますね。一度出力したものを置き換えるには、第二引数で渡す li タグの id を、置き換えたいものと同じにしてください。
ちなみに、第二引数に 'perms' を指定すれば権限の複製結果の部分が置き換えられます。同様に、 'assoc' の場合は関連付け、'entries' の場合はエントリ、'cats' ならカテゴリ、'places' ならブログ記事とカテゴリの関連付け、'comments' の場合はコメント、 'tags' ならタグ、'tbs' や 'pings' ならトラックバック、 'tmpls' ならテンプレート、'tmplmaps' ならテンプレートマップ、'widgetmgr' ならウィジェットの複製結果部分をそれぞれ置き換えることができます。
順番が前後しますが、コールバックの際にMTから受け取れる引数は多いです。ハッシュで渡されるので、以下のように受け取ります。
sub _post_clone { my ($cb, %args) = @_; }
上記で受け取ったハッシュの中身は以下の対応表を参考にしてください。
$args{'OldBlogId'} => 複製元のブログのID $args{'NewBlogId'} => 新しく複製したブログのID $args{'OldObject'} => 複製元のブログのオブジェクト $args{'NewObject'} => 新しく複製したブログのオブジェクト $args{'EntryMap'} => エントリーマップ $args{'CategoryMap'} => カテゴリーマップ $args{'TrackbackMap'} => トラックバックマップ $args{'TemplateMap'} => テンプレートマップ $args{'Callback'} => コールバック(結果出力に使います)
実際の組み方は ClonedBlogCleaner プラグイン を参考にしていただければよいのですが、プラグイン作成に必要なことは上記でほぼそろっていると思います。
Comments