2004年12月22日

●MTCommentPreviewIsStatic の振る舞いについての改善案

コメントのポップアップ化に関する事項で、投稿後の表示画面選択情報を保持する MTCommentPreviewIsStatic の振る舞いについて改善案を記します。


MTCommentFields タグで MTCommentPreviewIsStatic が指定できない

MTCommentFields はコメント・リスト/コメント・プレビュー/コメント・エラーの各テンプレートでコメント入力フォームを指定するコンテナタグです。MTCommentPreviewIsStatic は、ユーザー・マニュアルでは

特別な秘匿タグで、Comment Preview and Comment Error テンプレートで使います。システムは、コメントを投稿後、どのページを表示したらよいか知るために、このタグを利用します。このタグを使うときは Comment Preview と Comment Error テンプレートの中の HTML フォーム の INPUT HIDDEN の中に埋め込みます。

という説明になっています。これは変数タグで、値と意味は次の通りと考えられます。
    0:ポップアップ・ウィンドウ
    1:非ポップアップ・ウィンドウ
MTCommentPreviewIsStatic の元となる情報は、個別エントリーアーカイブではコメントフォームに埋め込まれた
<input type="hidden" name="static" value="1">

またはコメント・リストの
<MTCommentFields static="0">

より取得します。


この値の取得方法は Movable Type ユーザー・マニュアルによると、コメント・プレビュー/コメント・エラーテンプレートのコメントフォーム内に

<input type="hidden" name="static" value="<$MTCommentPreviewIsStatic$>">

を指定するようになっています。
input タグを用いるということは、デフォルトテンプレートで使われている MTCommentFields が適用できないということを暗黙的に指しており、コメント用テンプレートに 個別エントリーアーカイブと同じ(膨大な)テンプレートを貼り付ける必要があります。
これは大きな問題ではありませんが面倒です。また直感的およびポップアップ化によるテンプレート変更の容易性から、コメント・プレビュー/コメント・エラーテンプレートで
<MTCommentFields preview="1" static="<$MTCommentPreviewIsStatic$>">

という指定ができても良いのではないでしょうか(実験しましたが×)。


という訳で上記は改善案として記させて頂きました。またこの指定が可能となるパッチが Orgawa::memoranda さんより公開されることを密かに期待しております。


なお MTCommentPreviewIsStatic 値の取得は、MTCommentFields を残した状態で下記のスクリプト(青色部分)を追加することで実現できます。

<MTCommentFields preview="1">
<script language="javascript" type="text/javascript">
<!--
if (document.comments_form.static)
    document.comments_form.static.value = '<$MTCommentPreviewIsStatic$>';
//-->
</script>

この方が、個別エントリーアーカイブよりコメント用フォームをコピー&ペーストし、その中の input タグの指定を変更するという作業を行うよりはるかに簡単です。


コメント・プレビュー/コメント・エラー画面でフォーム情報が引き継がれない

真面目に input タグから MTCommentPreviewIsStatic 値を取得した場合の問題です。
現状の仕様により、MTCommentPreviewIsStatic を使用するためにコメント・プレビュー/コメント・エラーテンプレートの

<MTIfCommentsAllowed>
        :
</MTIfCommentsAllowed>

を個別エントリーアーカイブのもの(厳密にはcookie取得用のJavaScriptを含む)に入れ替える必要がありますが、そのままではフォーム入力がプレビュー画面に引き継がれないという問題(カスタマイズ不足?)が発生します。
これについては入れ替えた部分の下記の input タグにvalue 属性等(青色部分)を追加することで解決します。
<input tabindex="1" id="author" name="author" value="<$MTCommentPreviewAuthor encode_html="1"$>"/>
             :
<input tabindex="2" id="email" name="email" value="<$MTCommentPreviewEmail encode_html="1"$>"/>
             :
<input tabindex="3" type="text" name="url" id="url" value="<$MTCommentPreviewURL encode_html="1"$>"/>
             :
<textarea tabindex="4" id="text" name="text" rows="10" cols="50"><$MTCommentPreviewBody convert_breaks="0" encode_html="1"$></textarea>

また入れ替えたタグの直後に下記のスクリプト(Ogawa::memorandaMovable Type 3.0のMTCommentFields tagより引用)を追加する方法もあります。
<script language="javascript" type="text/javascript">
<!--
if (document.comments_form.author)
document.comments_form.author.value =
'<$MTCommentPreviewAuthor encode_js="1"$>';
if (document.comments_form.email)
document.comments_form.email.value =
'<$MTCommentPreviewEmail encode_js="1"$>';
if (document.comments_form.url)
document.comments_form.url.value =
'<$MTCommentPreviewURL encode_js="1"$>';
if (document.comments_form.text)
document.comments_form.text.value =
'<$MTCommentPreviewBody convert_breaks="0" encode_js="1"$>';
//-->
</script>

仮にこれが不具合であったとしてもシステムとして修正されることは考えにくいので、やはりコメント・プレビュー/コメント・エラーテンプレートでは MTCommentFields の利用が前提ではないかと推測しています。


動作および振る舞いについて認識誤り等ございましたらご指摘ください。


2004.12.23 追記
フォーム情報が引き継がれない問題について、(o)さんよりアドバイス頂いた方法(inputタグに挿入)に修正しました。先に書いたのもとりあえず残してます。
またスクリプトの引用がもれていたので追記しました。
さらにcookie取得用のJavaScriptは不要ですので削除しました(ポップアップでこれが必要なのはコメント・リストテンプレートのみ)。

Posted by yujiro at 2004年12月22日 15:08
トラックバックURL

このエントリーのトラックバックURL:
http://yujiro.dyndns.org/blog/koikikukan/mt-tb.cgi/437

トラックバック実行後、タイムアウトした旨のメッセージが表示されることがありますが、トラックバック先の処理は(これまでの経験上)正常に終了しています。正常に送信されたかどうかはトラックバック先の個別アーカイブページ等をご確認ください(タイムアウトについてはこちらの記事を参照ください)。
また同一のトラックバックが重複してしまった場合、こちらで気がついた時に適宜削除しておりますので削除のご連絡は不要です。ただし期間が空いている場合(数日とか)は気がつかない場合がありますのでご連絡ください。

コメント

呼ばれたので出てきました。

後者に関してはtextareaの中身やinput要素のvalueにMTCommentPreviewBody、MTCommentPreviewAuthorなどを書けばよいと思いますが、違いますでしょうか。

投稿者 (o) [TypeKey Profile Page] : 2004年12月22日 17:40

>(o)さん
こんばんは。
ご教示ありがとうございます!
後者については仰せの通り別途記述を修正致したいと思います。
またスクリプトの引用がもれてましたので(すいません…)併せて追記しておきます。
とりあえずご返事まで。

投稿者 yujiro : 2004年12月23日 01:09

encode_jsではなくてencode_htmlの方がよいですね。2.6用のテンプレートが参考になると思います。
http://www.movabletype.org/help/default_templates_26.shtml

問題の前者に関してですが、変更するとしたらMTCommentFieldsにstaticオプションを与えなかったときにMTCommentPreviewIsStaticの値を使うというのが妥当な線かなと思います。

ただこれはカスタマイズすべき点であって修正すべき点とまでは言いがたいと思います。例えば、yujiroさんのように元のコメント時のコンテキストに誘導したいと考える人もいれば、誘導されるページはstaticかdynamicに一意に定まっているべきだと考える人もいるし、ポップアップコメントが完了したらウインドウを閉じたいという人もいるでしょう。他のパターンを望む人もいるでしょう。というより、MTCommentFieldsの生成するHTMLが嫌なので変更したいケースまで考えたらパターンは無限にあります。それらに一般的に応えるのはとても難しいことです。

確かに、現状のMTCommentFieldsは上の例で言うと2番目の要求にだけ応えており、上述の変更を行えば1番目と2番目の要求には応えられます。しかし、マークアップの自由度のなさを考えるとこのMTタグを保守していくことにどれほどの意味があるのかと疑問に思わなくもない…微妙なところです。

投稿者 (o) [TypeKey Profile Page] : 2004年12月23日 04:31

>(o)さん
こんばんは。
色々ご面倒おかけしてしまって恐縮です…。
また今回の提案に対する観点についてのアドバイス、大変勉強になりました。
どうもありがとうございました。
たしかにポップアップ画面からの遷移のバリエーションやポップアップ自体の需要を踏まえると、運用上適正な動作が保証されている状態においては過度な要求である気がします。
なにはともあれ、ポップアップ用テンプレート公開に際して色々調べた結果、画面を誘導できる仕組みが分かったのは収穫でした。

また何か言い出すかも知れませんが(笑)、その節はどうぞよろしくお願い致します。m(__)m

投稿者 yujiro : 2004年12月24日 00:18

念のため、MTCommentFieldsで、staticオプションを与えなかったときに、直前のstaticの値を引き継いだコメントフォームを生成するためのパッチを置いておきます。

http://as-is.net/blog/archives/misc/mt31-comment_fields.patch

投稿者 (o) [TypeKey Profile Page] : 2004年12月27日 15:47

>(o)さん
こんにちはー。
バッチリ動作しております!

大変嬉しい限りです。
本当にありがとうございました!!

あ、このパッチはエントリーに追記させて頂いてもよろしいのですよね。
#ノークレーム・ノーリターンで(笑)。

投稿者 yujiro : 2004年12月27日 16:56

ご利用はご自由にどうぞー。
多分こっちのテンプレートももっと簡単に書けますよね。
http://yujiro.dyndns.org/blog/koikikukan/archives/2004/12/26-021055.php

投稿者 (o) [TypeKey Profile Page] : 2004年12月27日 17:10

はい、ありがとうございます!

あとはTypeKeyですね。
だんだん深みにはまっていくような気が…。

投稿者 yujiro : 2004年12月27日 17:34
コメントする




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)

コメントありがとうございます。投稿が反映されるまでに時間がかかる場合がありますが「投稿」ボタンを続けてクリックされないようお願い致します。またコメント投稿処理が終了しない場合、トップページに反映されない場合がありますがコメントは正常に投稿されています(サーバ側の不具合のようです。こちらで操作してページに反映させています)。また1回のクリックでも重複してしまう場合がありますが適宜削除しておりますのでご連絡は不要です。