LaunchBackgroundTasks(Movable Type)の挙動。
公開日 : 2007-05-04 05:44:09
mt-config.cgiに LaunchBackgroundTasks 1と指定すると、エントリーを保存する際の再構築処理がバックグラウンドで行われるようになる。(正直知らなかった。何せユーザー歴がまだ半年なので...)。
Movable Type Background Rebuilder Plugin(1.0RC2)でも同じようにエントリーの保存時に再構築処理をバックグラウンドで行っている。思いっきり車輪の再発明...かと思って試していたら、この間自分がつまづいたところと同じところでご本家さんもつまづいてるようだ(同じ事象が発生する)。ということで以下の問題があるようなのでご注意を。
問題はエントリーのカテゴリー変更時に起こる。
エントリーアーカイブのアーカイブマッピングにカテゴリーのbasenameが含まれている時(例:%-c/%f)に、エントリーのプライマリーカテゴリーを変更すると保存場所も変わるのが正しい振る舞いなのだが、LaunchBackgroundTasks 1を指定しているとカテゴリー変更前の保存場所に保存されてしまう。
※もう一度保存し直すと正しい場所に保存される。
また、このブログのようにエントリーカテゴリーをエントリーのページに表示させている場合(エントリーの右下あたり)はカテゴリー名も変更前の古いままになってしまう。
※何故か「複数のカテゴリーを指定」している場合には発生しない。
実はBackground Rebuilder Plugin を書いている時にも同じ現象が発生した。
CMSPreSave_entry, CMSPostSave.entry のタイミングで $entry->permalinkや$entry->categoryを取得しようとしても古いパスやカテゴリーが帰ってきてしまう。$entry->title等は正常に取得できる。
MT::Placementを保存した後でもうまく反映されなかった。$entry->permalinkや$entry->categoryはmt_entryテーブルの項目ではなくメソッドなのでCMSPreSave_entryやCMSPostSave.entryコールバックが呼ばれるタイミングでは既に元のentryのcategory情報や保存先を指定してしまった後だからなんだろうか(未確認)。
結局 Background Rebuilder Plugin では「カテゴリー情報が変わっていたら旧ファイル削除(CMSPreSave_entry)→カテゴリー情報保存→(必要なら)トラックバック送信(CMSPostSave.entry)→保存結果表示テンプレートが呼び出された(MT::App::CMS::AppTemplateSource.edit_entry)」タイミングで再構築を実行、というように修正して解決した。
LaunchBackgroundTasks 1 を指定している方はエントリーのカテゴリー情報変更→保存の際にはご注意を。
Background Rebuilder Plugin では、この問題と旧ファイルが残ってしまう問題を解決しています。