G-chan Square

じーちゃん/へたっぴの綴る、日々のつれづれとか。
twitterのまとめとゲームネタが中心。2015年からロードバイク/ミニベロ始めました。

じーちゃん、MovableType4.21と戦う! 第3話

こんばんわ。じーちゃんです。

前回に引き続き、MovableType4.21と戦っておりまする。
だいぶ、敵が強かったけど終わりが見えてきました。
さて、前回一通り入れ終わったので、軽く動作確認などをしてみました。

コメントが書けるか……とか
次のページ、前のページが合っているか……とか
新規エントリーを投稿できるか……とか

そしたら、問題発見。

新規にエントリーを投稿したときに、そのカテゴリ内ので前のページから、今作ったばかりの新しいエントリーのページにリンクが張られていないことが発覚。
あれ? これはなんだっけかな? ……あ、そうそう「RebuildPrevNextInCategory.pl」だ。

というわけで、思い出してみたのでWEBからとってきてプラグイン置き場において再構築してみるも……動作しない(´・ω・`)

あれ? なんで? どうして?
ってことで、長い戦いが始まりました。
その長きにわたる戦いの結果、わかったことは次の通り。

RebuildPrevNextInCategory.pl の中に、
my $mt = MT->new or return $cb->error (MT->errstr);
ってのがあるんですが……「MT->new」でインスタンス生成しにいったきり、こちら(=RebuildPrevNextInCategory.pl)に制御が戻ってこない……。
なんで、そんなことが発生するのか、まったくもって謎……。
てか、Perlのオブジェクト指向のソースとか、ホントわかりづらい、わからない……。

perlは、確か関数の中で最後に評価した変数が返り値として適用されるとかいう仕様だったはずなんだけど……
(mt_home)/lib/MT.pm の中にある new とか見てみると、
sub new {
    my $mt = &instance_of;
    $mt_inst ||= $mt;
    $mt;
}
とか書いてあって、最後の$mtの中身にundef以外の何か(参照が入っていた)が入っていたんで、普通ならこれが返ってくると思うんだけど……なぜか、「MT->new」に行ったきり帰ってこない……。
ホント、わけわからん
……というわけで、いろいろあれこれそれこれ試行錯誤して、RebuildPrevNextInCategory.plを書き換えて無理矢理動かしてみました。
$ diff -u RebuildPrevNextInCategory.pl.080903 RebuildPrevNextInCategory.pl
--- RebuildPrevNextInCategory.pl.080903 2008-09-03 00:40:47.000000000 +0900
+++ RebuildPrevNextInCategory.pl        2008-09-03 00:42:12.000000000 +0900
@@ -48,10 +48,9 @@
           if ($entry->status != MT::Entry::RELEASE) {
               return;
           }
-          require MT;
-          my $mt = MT->new or return $cb->error (MT->errstr);
-          if(MT->version_number >= 3.2){
-              $mt = $mt->publisher;
+          my $mt = new MT::WeblogPublisher();
+          if (!$mt) {
+            return $cb->error (MT->errstr);
           }
           my $prev = $entry->previous(1);
           my $next = $entry->next(1);
なんか、バージョンが3.2以降だったら、"$mt = $mt->publisher;" とかやっているのですが、これも直接実行しても動かないので、MT.pmの publisher 見てみたら、
sub publisher {
    my $mt = shift;
    $mt = $mt->instance unless ref $mt;
    unless ( $mt->{WeblogPublisher} ) {
        require MT::WeblogPublisher;
        $mt->{WeblogPublisher} = new MT::WeblogPublisher();
    }
    $mt->{WeblogPublisher};
}
とか書いてあるから、"new MT::WeblogPublisher()" を直接叩いてやればいいんじゃね? ってことでやってみたら動きました……
ま、4.21だし、バージョン判定の所はもういいかな?みたいなw
でも動いたけど、これで本当にいいのかどうか不明w

というわけで、まとめると

●RebuildPrevNextInCategory.pl
chez sugi から、RebuildPrevNextInCategory.plを手に入れる。
(mt_home)/plugins/PreviousNextInCategory の中に、RebuildPrevNextInCategory.plを置く。

RebuildPrevNextInCategory.plを書き換える。
$ diff -u RebuildPrevNextInCategory.pl.080903 RebuildPrevNextInCategory.pl
--- RebuildPrevNextInCategory.pl.080903 2008-09-03 00:40:47.000000000 +0900
+++ RebuildPrevNextInCategory.pl        2008-09-03 00:42:12.000000000 +0900
@@ -48,10 +48,9 @@
           if ($entry->status != MT::Entry::RELEASE) {
               return;
           }
-          require MT;
-          my $mt = MT->new or return $cb->error (MT->errstr);
-          if(MT->version_number >= 3.2){
-              $mt = $mt->publisher;
+          my $mt = new MT::WeblogPublisher();
+          if (!$mt) {
+            return $cb->error (MT->errstr);
           }
           my $prev = $entry->previous(1);
           my $next = $entry->next(1);
RebuildPrevNextInCategoryに関しては以上終了。



ところで、あれこれ調査しているときに、エントリーを削除してもそのエントリーが属しているカテゴリのアーカイブページが更新されないという現象を発見。
これってバグなんじゃないの……? と思っていたのですが……

削除したエントリに依存するアーカイブの再構築
を読むとどうやら仕様らしい。ま、エントリー削除する事なんてあまりないから特に問題はないんですがw

コメントする