JavaScript、Ajax、HTML5(API)、Ruby…Web及び関連技術の実験&情報公開&制作物紹介。

ダイナミック・パブリッシング対応 ArchiveDateHeader プラグイン

| コメント(7)

「MTプラグイン PHPizeプロジェクト」第4弾!

今回勝手にPHP対応化させていただいたのは、ArchiveDateHeaderプラグイン。
ver.1.0 by Adam Kalsey, ver.2.0 by Tim Appnel)
個人的には使用していなかったのですが、需要がありそうなので(含笑)、対応してみることにしました。

ついでに、現在の(Perl版)<MTArchiveDateHeader>に潜んでいる問題点にも触れてみたいと思います。

【2007/03/18 一部追記・修正】

ダウンロード

(どちらかを選択してください。内容は同じです。)

セット・アーカイブ

ArchiveDateHeader と ArchiveDateFooter のPHP版を一つにしたお得なセットをご用意いたしました。
ArchiveDateFooter(PHP版)と組み合わせてご使用する場合は、こちらをダウンロードしてください。

インストール

  1. ダウンロードしたファイルを解凍してください。
    ただ一つのPHPファイル block.MTArchiveDateHeader.php が生成されます。
    ※セット・アーカイブの方をダウンロードされた場合は、もう一つのファイル block.MTArchiveDateFooter.php も生成されます。
  2. 解凍して得られた(すべての)ファイルを、[MT]/php/plugins/ フォルダ内にコピー(アップロード)してください。

使い方

このプラグインは、<MTArchiveDateHeader>というテンプレートタグを提供します。
このタグは、<MTArchiveList>の中で使用し、その archive_type 属性値が "Monthly" の場合は アーカイブ日付の年が新しくなったとき、"Weekly" の場合は 月が新しくなったときにだけ、その内容が表示されるものです。

よく引き合いに出される例として、以下のようなテンプレートソースを考えます。

<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<h4><MTArchiveDate format="%Y"></h4>
</MTArchiveDateHeader>
<a href="<$MTArchiveLink$>"><MTArchiveDate format="%B"></a>
</MTArchiveList>

これは、例えば↓このように表示されます。

2007

3 2 1

2006

12 11 10 9 8 7 6
注意点

……と、archive_type="Monthly"の場合は期待通りに動作します。
が、実はarchive_type="Weekly"の場合はというと。

<MTArchiveList archive_type="Weekly">
<MTArchiveDateHeader>
<h4><MTArchiveDate format="%B %Y"></h4>
</MTArchiveDateHeader>
<MTArchiveTitle>
</MTArchiveList>

例えば↑これをスタティックなテンプレートで構築すると、現状では↓こうなってしまいます。

2007年03月

2007年03月11日 - 2007年03月17日

2007年03月

2007年03月04日 - 2007年03月10日

2007年02月

2007年02月25日 - 2007年03月03日

2007年02月

2007年02月11日 - 2007年02月17日

2007年02月

2007年02月04日 - 2007年02月10日

2007年01月

2007年01月28日 - 2007年02月03日

つまり、「月が新しくなるごとに」と説明に書いてあるのに、毎週ヘッダーが出力されてしまうのです。
(ver.1.0, ver.2.0 で確認)

今回作成したPHP版では、この問題に対処しています。
つまり、ダイナミック・パブリッシングだと以下のように出力されます。

2007年03月

2007年03月11日 - 2007年03月17日 2007年03月04日 - 2007年03月10日

2007年02月

2007年02月25日 - 2007年03月03日 2007年02月11日 - 2007年02月17日 2007年02月04日 - 2007年02月10日

2007年01月

2007年01月28日 - 2007年02月03日

スタティックページでも、本来の仕様通り月ごとにヘッダーが出力されるようにするには、以下の要領でソースを修正してください。

ver.1.0の場合 … ArchiveDateHeader.pl の27行目を以下のように修正:

 24:    if ($at eq "Monthly") {
25:        $this_date = substr $ts, 0, 4;
26:    } elsif ($at eq "Weekly"){
27:        $this_date = substr $ts, 5, 6;
28:    } else {
29:        return '';
30:    }

 24:    if ($at eq "Monthly") {
25:        $this_date = substr $ts, 0, 4;
26:    } elsif ($at eq "Weekly"){
27:        $this_date = substr $ts, 4, 2;
28:    } else {
29:        return '';
30:    }

ver.2.0の場合 … mt-archive-dateheader.pl の34行目を以下のように修正:

 31:    if ( $at eq 'Monthly' ) {
32:        $this_date = substr $ts, 0, 4;
33:    } elsif ( $at eq 'Weekly' ) {
34:        $this_date = substr $ts, 5, 6;
35:    } else {
36:        return '';
37:    }

 31:    if ( $at eq 'Monthly' ) {
32:        $this_date = substr $ts, 0, 4;
33:    } elsif ( $at eq 'Weekly' ) {
34:        $this_date = substr $ts, 4, 2;
35:    } else {
36:        return '';
37:    }

Weeklyで一覧を表示したい方は、ご注意ください。

(て言いますか、初版が公開されてから5年も経つというのに、誰も指摘してないんでしょうか? それだけ Weekly の需要が低いってことなんでしょうけれど。)

互換性について

現在公開されているArchiveDateHeaderプラグインと互換性があります。
ただし、以下の点に注意してください。

  • エラーが発生したときの挙動がPerl版と異なります。
  • archive_type="Weekly" を指定した <MTArchiveList>?</MTArchiveList> 内での挙動がPerl版と異なります。

前者は、Perl版とPHP版のプラグインのシステムそのものが異なるためというのもありますが、Perl版では再構築時にエラーが発生した場合そこで再構築がストップしてしまいますが、今回作成したPHP版ではエラーが発生した場合そのエラーメッセージを表示内容に埋め込み、できる限りページが期待通りの表示になるよう工夫しています。
後者については、上記注意点を参照してください。

著作権・ライセンスについて

ただいま調査中です。
ソースそのものは、オリジナルの動作を完全にシミュレートする形で一から書き起こしていますので、著作権の侵害には当たらないと思われますが、ライセンスに関しては詳細が判明次第、ここに追記いたします。

なお、こちらで公開しているPHPソースおよびそれを使用したことによる問題点や気づいた点に関して、原作者に直接問い合わせをしないでください。
この記事へのコメント、もしくはトラックバック等でお願いいたします。

コメント(7)

こんにちは、あんちもん2さん
>需要がありそうなので(含笑)
だれだろうな(含笑)

Weeklyは頭の中に無かったですよ。というか週刊のアーカイブって見た事無いんですけど。自分のブログでも、とっとと削除しちゃうし。
学校とかでブログやると必要になるんですかね?

>oscarさん
お待たせしました(笑)
HeaderとFooterのお得なセットもご用意いたしましたので、ぜひお試しください。

Weekly、私自身も今まで全くノータッチでした。
今回初めて触ってみて、ちょっとびっくり。
欧米では多少ニーズがあるのではないでしょうか。
あーあと、1日に数件投稿するような場合は月ごとだとエントリーの件数が多すぎるから週ごとに、っていう考えはあるのでしょうけれど。

こんにちは、このArchiveDateHeaderなのですが、中身を出力しないだけで、例えばAutoIncrementalVarの処理などは行われているようなのですが、これはこういうものでしたっけ?

表示内容に変化があった時だけ、変数をリセットするとかしたいのですが。

>oscarさん
あ、えーと、そうですね……。
オリジナルのArchiveDateHeaderは中の処理は一切おこないませんけれど、PHP版は今のだと中身処理しちゃいます。
何も考えずに前に作ったほかのソースを流用したら、無駄に条件タグ互換になってしまっていました。そのせいです。
オリジナルが条件タグ互換ではない(中で<MTElse>が使えない)ので、そちらに合わせようと思います。
とりあえず、しばしお待ちくださいm(_ _)m

>とりあえず、しばしお待ちくださいm(_ _)m
了解です。
とりあえず、原因が解りましたので、お待ちしてます。

取り急ぎ対応してみました。
たぶん大丈夫だと思います。
もう少しきちんと検証して、ソースを見直してから、正式にアナウンスします。

ArchiveDate_H_F_php_rev20070405.zip

コメント投稿者のところにリンク張ってあります。↓

急いで対応して下さったみたいで申し訳ありません。
こういう微妙な違いが、意外とあるんですね。
結構いろんな所でつまづいてます。

カテゴリ

月別 アーカイブ

OpenID対応しています OpenIDについて

このブログ記事について

このページは、あんちもん2が2007年3月17日 21:24に書いたブログ記事です。

ひとつ前のブログ記事は「SbCode ver.0.2 - ダイナミック・パブリッシングでの動作を変更」です。

次のブログ記事は「ダイナミック・パブリッシング対応 ArchiveDateFooter プラグイン」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。