2008年3月17日
コメントのフラグメントを動的に切り替える
Movable Type のブログ記事アーカイブにある、コメントのフラグメントを動的に切り替えるカスタマイズです。
「フラグメント」とは「文書の特定の場所へのリンク」のことです。フラグメントに対応する、コメントへのリンクのフラグメント識別子(URLの#以降の部分)は、今回の場合、次のようになっています。
http://user-domain/2008/03/post.html#comments
今回実現したい、フラグメントによるリンクは次の通りです。
- ブログ記事にコメントが投稿されている場合、メインページに表示されているコメントへのリンクをクリックすると、その先頭にジャンプする
- ブログ記事にコメントが投稿されていない場合、メインページに表示されているコメントへのリンクをクリックすると、コメント投稿フォームにジャンプする
デフォルトテンプレートのコメント関連のマークアップは次のようになっています。投稿コメントおよびコメントフォーム全体を div 要素で括り、フラグメントとなる id 属性(赤色)を付与しているので、投稿コメントの有無に依存せず、常にフラグメントが存在します。
<MTIfCommentsActive>
<div id="comments" class="comments">
<MTIf name="comment_preview_template">
<$MTInclude module="コメント入力フォーム"$>
</MTIf>
<MTComments>
<MTCommentsHeader>
<h2 class="comments-header">コメント(<$MTEntryCommentCount$>)</h2>
<div class="comments-content">
</MTCommentsHeader>
<$MTInclude module="コメント詳細"$>
<MTCommentsFooter>
</div>
</MTCommentsFooter>
</MTComments>
<MTUnless name="comment_preview_template">
<$MTInclude module="コメント入力フォーム"$>
</MTUnless>
</div>
</MTIfCommentsActive>
問題となるのは、コメント全体に対してフラグメントが設定できないマークアップになっている場合です。
例えば次のようなマークアップを想定します。
<MTIfCommentsActive>
<MTIf name="comment_preview_template">
<div>
<$MTInclude module="コメント入力フォーム"$>
</div>
</MTIf>
<MTComments>
<MTCommentsHeader>
<h2 id="comments" class="comments-header">コメント(<$MTEntryCommentCount$>)</h2>
<div class="comments-content">
</MTCommentsHeader>
<$MTInclude module="コメント詳細"$>
<MTCommentsFooter>
</div>
</MTCommentsFooter>
</MTComments>
<MTUnless name="comment_preview_template">
<div>
<$MTInclude module="コメント入力フォーム"$>
</div>
</MTUnless>
</MTIfCommentsActive>
このマークアップでは、もし投稿コメントがひとつもないと、MTComments 内部が実行されず、フラグメントも表示されないため、コメントのリンクをクリックするとページのトップにジャンプすることになります。
つまり、投稿コメントの有無によって、フラグメントの出力位置を切り替える必要があります。
この問題を解消するには、次のようにコメント入力フォーム部分に MTIfNonZero を追加し(青色部分)、投稿コメント件数が0の場合だけ id 属性を表示するようにします。
<MTIfCommentsActive>
<MTIf name="comment_preview_template">
<div>
<$MTInclude module="コメント入力フォーム"$>
</div>
</MTIf>
<MTComments>
<MTCommentsHeader>
<h2 id="comments" class="comments-header">コメント(<$MTEntryCommentCount$>)</h2>
<div class="comments-content">
</MTCommentsHeader>
<$MTInclude module="コメント詳細"$>
<MTCommentsFooter>
</div>
</MTCommentsFooter>
</MTComments>
<MTUnless name="comment_preview_template">
<div<MTIfNonZero tag="MTEntryCommentCount"><MTElse> id="comments"</MTIfNonZero>>
<$MTInclude module="コメント入力フォーム"$>
</div>
</MTUnless>
</MTIfCommentsActive>
なお、コメント入力フォームの MTInclude が2ヶ所ありますが、最初に現れる、MTIf タグで括られた方は、コメントプレビュー時しか表示されない(=フラグメントの対象にならないため)ので、対処する必要はありません。
参考記事:文書の特定の場所へのリンク
Posted by yujiro
- LogCommentAuthors プラグイン
- Movable Type でコメント用 RSS フィードを出力する
- 他人の Movable Type 4 へのコメント投稿で Movable Type 認証を利用する方法
- アーカイブページのリストの表示内容が異なる理由
- コメント投稿フォームの「情報を保存する」のチェックを外した時の振る舞いを変更する
- コメント投稿フォームをデフォルトで表示する&「匿名でコメントすることもできます。」の文言を修正する
- Simply Threaded プラグイン(MT4版)でコメントフォームに返信機能を追加する
- Movable Type 4 で返信コメントをスレッド形式で表示する
- Movable Type 3 から Movable 4 へのアップグレード(コメント関連テンプレート差分)
- コメント投稿者欄が無記名の時に代替名を表示する
- コメントとトラックバックを分けて表示する for WordPress(その2:タイトルを非表示にする方法)
- コメントとトラックバックを分けて表示する for WordPress(その1)
- WordPress のコメントをページ分割する Paged Comments Plugin
- コメントを新着順に並べ替える
- Authen::Captcha をインストールして Captcha Plugin を利用する(CPAN による perl モジュールのインストール)
- エントリー・アーカイブで同一カテゴリーのコメントを表示する
- コメント投稿で「エントリーIDが見つかりません」と表示される不具合について
- SCode プラグインでコメントスパムを制限する(その2:Typekeyサイン・インとの競合制御)
- SCode プラグインでコメントスパムを制限する(その1:基本設定)
トラックバックURL
コメントする

