コメントまわりをAjax化しました。(for MovableType)

Category

MovableType

投稿日

2008/08/14 - 05:24

ブックマーク

来週の木曜日まで夏休みです。ひゃっほう。

ってなわけでAjaxの勉強を兼ねて、前々からやりたかったコメントプレビューとコメント投稿をAjax化しました。
ただ、単純にコメントプレビューと投稿結果の表示をページ遷移なしでやっているだけなので、サーバー側に関しては普通にmt-comments.cgiを使用しております(というかサーバーサイドは完全に門外漢なのでいじれない\(^o^)/)。
かなり我流なので、突っ込んでくれる人がいたら超歓迎します。

大まかな考え方はMovableType 備忘録さんのところの記事等を参考にしたりしました。

とりあえず使い方!

まずは何はなくともJSを読み込む

<script type="text/javascript" src="js/ajax_comment.js"></script>

コメントフォームに関しては以下のようなマークアップ。

<div class="commentForm">
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" id="comments-form">
<fieldset>
フォーム部分が色々
<ul>
<li><input type="submit" accesskey="v" name="preview" id="comment-preview" value="確認" /></li>
<li><input type="submit" accesskey="s" id="comment-post" value="投稿" /></li>
</ul>
</fieldset>
</form>
<!--/commentForm--></div>

デフォルトのフォームをclass:commentFormで囲めばたぶん問題ないはず。確認用のボタンと投稿用のボタンのidにはそれぞれcomment-preview,comment-postを付与。

システムテンプレートコメントプレビュー、コメント完了のテンプレートから、Ajaxで抜き出したい部分をclass:ajax_commentで囲む。

例:コメントプレビュー

<div class="ajax_comment">
<h3>Your Comment</h3>
<div class="commentList">
<h4><$MTCommentPreviewAuthorLink default_name="Anonymous"> - <$MTCommentDate format="%Y/%m/%d" language="ja">-<$MTCommentDate format="%X" language="ja"></h4>
<$MTCommentPreviewBody$>
</div>

例:コメント完了

<h2><$MTGetVar name="heading"$></h2>
<div class="ajax_comment">
<$MTGetVar name="message"$>
</div>

多分分かると思いますが、各テンプレートのclass:ajax_commentで囲まれている部分が「確認」ボタンや「投稿」ボタンを押されたときに表示されます。

JSの44行目あたりにmt-comments.cgiが置いてあるパスを、書く。

commentRequest.open("post", "/mt/mt-comments.cgi", true);

これで完了!

mt-comments.cgiを叩くと、システムテンプレートのコメントプレビューの内容(パラメータにpreviewがある場合)、コメント完了が返ってくるので、その中からclass:ajax_commentで囲まれているものをぶっこ抜くというかなり強引なやり方でやっています。

プレビューや結果が表示される場所はデフォルトでは、コメントプレビューはフォームの上に、コメント完了コメントはフォームの下に表示されます。

<div class="commentForm">
ここにコメントプレビューが挿入される。
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" id="comments-form">
<fieldset>
フォーム部分が色々
<ul>
<li><input type="submit" accesskey="v" name="preview" id="comment-preview" value="確認" /></li>
<li><input type="submit" accesskey="s" id="comment-post" value="投稿" /></li>
</ul>
</fieldset>
</form>
ここにコメント完了コメントが挿入される。
<!--/commentForm--></div>

挿入する場所を変える場合は、JSの45行目~50行目あたりを変えれば良いんじゃないでしょうか。

var insertElm = getElementsByClassName("commentForm")[0];
if(flag == "preview"){ //ここでプレビューが挿入する場所を指定
   insertElm.insertBefore(cResult , form);
}else{ //ここでコメント完了コメントが挿入する場所を指定
   insertElm.appendChild(cResult);
}

cResultってのが挿入されるソースになります。
ちなみに、JavaScriptが無効な場合は、普通にページ遷移で投稿やプレビューが出ます。

対象ブラウザ
  • WindowsIE6,7
  • Firefox3以上
  • Opera9.5以上
  • Safari3以上

JSファイルは下記。前に作った検索用JSと併用する場合は、下の方を使ってちょ。

MITライセンス(検索用Ajaxに関しては元ネタに準じます。)なので使いたい方ご自由にカスタマイズどぞー。

手探りで色々やっているので、突っ込みは大大大歓迎です。教えてください!

しかし、レンタルサーバはロリポを使っているんですが、レスポンスが死ぬほど遅い...。orz(レンタルサーバのせいだよね?)
期限切れたら乗り換えようかしら。。

This Entry's Tag
ajax,javascript,movabletype,sample

Trackback URI

http://mk-t-lab.com/mt/mt-tb.cgi/20

Post Your Comment

コメント投稿フォーム