mt-site.js について(その3:cookie登録の改善)
mt-site.js について(その2:注意事項)の最後で述べた、
コメント投稿フォームの「情報を登録しますか?」チェックボックスのチェックを外すと、mt-site.js の forgetMe が実行され、それまで入力していたコメント情報が消去されてしまいます。お世辞にも使い勝手が良いとは言えないので、別途修正案を提示したいと思います。
の修正案です。これを行う理由は、cookie非登録というチェックを外す操作によるフォーム情報のクリアはユーザが意図しない動作である、というところに基づいています。英語圏では等しいのかもしれませんが少なくとも私はそう感じましたので。
解決策はたいした内容ではありません。管理画面よりテンプレートの mt-site.js を選択し、「テンプレートの内容」にある、
function forgetMe (f) {
deleteCookie('mtcmtmail', '/', '');
deleteCookie('mtcmthome', '/', '');
deleteCookie('mtcmtauth', '/', '');
f.email.value = '';
f.author.value = '';
f.url.value = '';
}
の赤色部分を削除します。
2005.11.18 追記
mt-site.js について認識誤りがあったため本文を修正しました。
mt-site.js について(その2:注意事項)
Movable Type 3.2-ja 以降でデフォルト・テンプレートをご利用になるか、新たにテンプレートを作成される場合、mt-site.js の振る舞いの制約上、いくつか注意する点があります。またコメント・トラックバック関連の表示でいくつかの不具合が確認されていますので、下記の修正あるいは設定を推奨します。
1.cookie登録のチェックボックスを追加
修正の対象はコメント・プレビューテンプレートです。
エントリー・アーカイブには、コメント投稿フォームに cookie 登録用のチェックボックス
この情報を登録しますか?
が存在しますが、コメント・プレビューテンプレートにはこのチェックボックスが存在しません。このチェックボックスが存在しないと、ページを開いた時に
document.comments_form.bakecookie has no properties
という JavaScript エラーが発生します。これは mt-site.js の individualArchivesOnLoad に含まれるコード
if (mtcmtauth || mtcmthome) {
document.comments_form.bakecookie.checked = true;
} else {
document.comments_form.bakecookie.checked = false;
}
が実行される時に document.comments_form.bakecookie がみつからないためです。
ということで、本チェックボックス(青色部分)を下記の位置に追加しましょう。
<p>
<label for="comment-url">URL: </label>
<input id="comment-url" name="url" size="30" value="<$MTCommentPreviewURL$>" />
</p>
<p>
<label for="comment-bake-cookie"><input type="checkbox"
id="comment-bake-cookie" name="bakecookie" onclick="if (!this.checked) forgetMe(document.comments_form)" value="1" />
この情報を登録しますか?</label>
</p>
</div>
2.コメント関連タグのID属性について
mt-site.js はコメント投稿フォームにある下記のID属性を利用して表示・非表示を制御しています。
- comments-open
- comments-open-data
- name-email
- comments-open-text
- comments-open-footer
mt-site.js ではこれらのID属性有無チェックは行っていないため、テンプレートを自作される場合(特に他へ公開される等)はこれらのタグを含むようにしましょう。
3.トラックバック関連タグのID属性について
mt-site.js はトラックバック欄にある下記のID属性を参照して、表示・非表示を制御しています。
- trackbacks-info
3項と同様、テンプレートを自作される場合等はこれらのタグを含むようにしましょう。
4.その他1(commenter_name.js の削除)
コメント・プレビューテンプレートのヘッダ部分に記述されている
<script type="text/javascript" src="<MTStaticWebPath>js/commenter_name.js"></script>
は不要です。この行が残っているとコメント・プレビュー画面で JavaScript エラーが発生する可能性があるため削除しましょう。
commenter_name.js というファイルは、英語版の初期β版には含まれていましたが、それ以降は含まれていません。また commenter_name.js の内容は mt-site.js に包含されていますので削除しても問題はありません。
公開テンプレートでは現在コメントアウトしていますが、初期のテンプレートでは有効になっている場合があるため、JavaScript エラーになる場合はこの行を削除してください。
5.その他2(cookie登録用チェックボックスの振る舞い)
コメント投稿フォームの「情報を登録しますか?」チェックボックスのチェックを外すと、mt-site.js の forgetMe が実行され、それまで入力していたコメント情報が消去されてしまいます。お世辞にも使い勝手が良いとは言えないので、別途修正案を提示したいと思います。
とりあえず無闇にチェックを外はずないよう気をつけましょう。
mt-site.js について(その1:仕組みと動作)
エントリー・アーカイブやコメント・プレビュー画面のヘッダ部分には、
<script type="text/javascript" src="<$MTBlogURL$>mt-site.js"></script>
という設定があります。
この mt-site.js は、エントリー・アーカイブやコメント・プレビュー画面でのコメント・トラックバック欄の表示・非表示および、TypeKey認証時のコメンター情報や投稿フォームの表示を制御するためのものです。
以下、mt-site.js の仕組みおよび動作について説明します。
1.インタフェース
mt-site.js では下記のインタフェース(関数)が定義されています(内部で利用されるインタフェースは省略しています)。
- rememberMe:cookie に投稿者情報(名前・メールアドレス・URL)を保存
- forgetMe:cookie から投稿者情報(名前・メールアドレス・URL)を削除し、フォームデータをクリア
- individualArchivesOnLoad:設定状態によってコメント・トラックバック欄の表示・非表示を制御+cookieからコメント投稿者情報取得
- writeTypeKeyGreeting:TypeKeyサイン・イン/サイン・アウト情報表示を制御
また、mt-site.js が取得された、つまりHTMLのヘッダに記述された冒頭の script 要素が読み込まれた時点で、
- commenter_name
が生成(プログラム的には「変数定義」を指します)されます。commenter_name は TypeKey による投稿者のニックネームで、ニックネームを cookie あるいは Movable Type から取得するコードも同時に生成されます(生成契機は2項参照)。このコードも script 要素が読み込まれる契機に実行されます。
2.生成契機
mt-site.js は、テンプレートの再構築を契機に生成されるダイナミックなスクリプトです。ダイナミックな生成を行う理由は、ブログのコメント・トラックバックの設定内容によってスクリプトの振る舞いを変える必要があるためです。
例えば、コメントを「一切受け付けない」という設定にした場合、エントリー・アーカイブのコメント欄は表示されなくなり、コメント・プレビュー画面は当然それ自体にジャンプできなくなります。
これは設定に応じた mt-site.js が再構築によって自動生成され、エントリー・アーカイブを表示する時にコメント投稿フォーム表示させないように mt-site.js が制御しているためです。
mt-site.js は「インデックステンプレート」として登録されており、「インデックス・テンプレートの再構築」を契機に生成されます(メインページではなく「インデックス・テンプレート」であることに注意してください)。設定の変更を行って「インデックス・テンプレートの再構築」が促された場合は、再構築が必要であることを指します(再構築が不要な場合は表示されません)。
それ以外の契機でインデックス・テンプレートの再構築を行う場合は、再構築画面の「すべてを再構築」または「インデックス・テンプレートを再構築」を選択してください。
また設定画面の TypeKey 登録を行い、インデックス・テンプレートを再構築すると、mt-site.js の最後の辺りに TypeKey 投稿者のニックネームを取得する
if ('user-domain' != 'user-domain') {
document.write('<script src="http://user-domain/mt/mt-comments.cgi?__mode=cmtr_name_js"></script>');
} else {
commenter_name = getCookie('commenter_name');
}
が生成されます。
user-domain 同士を比較している部分は、実際には MTCGIHost と MTBlogHost が展開された値が設定されます。独自ドメインを取得している場合等には cookie からの取得ができない(ホスト名が異なるため)ので、
http://user-domain/mt/mt-comments.cgi?__mode=cmtr_name_js
が実行されます。ちなみにこのURLを実行すると、
var commenter_name = 'hogehoge';
というレスポンスになります。hogehoge の部分がコメンター情報で、つまりコメンター情報が JavaScript として直接HTMLに表示されるという仕組みです。
3.動作
エントリーアーカイブにおける、TypeKey サイン・インした後の TypeKey 関連情報の表示の流れを説明します(設定画面で TypeKey 登録が完了していることを前提としています)。
3.1 ニックネーム取得
ページが表示されると(厳密にはヘッダの script 要素が実行されると)、mt-site.js に記述された、
if ('user-domain' != 'user-domain') {
document.write('<script src="http://user-domain/mt/mt-comments.cgi?__mode=cmtr_name_js"></script>');
} else {
commenter_name = getCookie('commenter_name');
}
が実行されて、cookie あるいは Movable Type より投稿者のニックネームを取得。
3.2 名前・メールアドレスの表示制御
次に、body 要素の individualArchivesOnLoad が実行され、commenter_name が存在する場合は、コメント投稿フォームの名前・メールアドレス欄を非表示に、存在しない場合は表示します。
3.3 サイン・インの表示制御
最後に、投稿フォームの中にある writeTypeKeyGreeting が実行されて、commenter_name が存在する場合は、コメント投稿フォームに
サインインを受け付けました。hogehoge さん。コメントしてください。(サイン・アウト)
と表示し、存在しない場合は、
TypeKey IDを使ってサイン・インしてください。
と表示します。
2005.11.18 追記
本文を修正しました。

