MTCommentPreviewIsStatic の振る舞いについての改善案
Tag:[]
コメントのポップアップ化に関する事項で、投稿後の表示画面選択情報を保持する 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 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::memoranda:Movable Type 3.0のMTCommentFields tagより引用)を追加する方法もあります。
<script 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は不要ですので削除しました(ポップアップでこれが必要なのはコメント・リストテンプレートのみ)。
2006.04.04 追記
リストから language 属性を削除しました(HTML4.01/XHTMLで非推奨あるいは廃止されているため)。
- Movable Typeの脆弱性と対策
- Movable Type 3.121-ja アップグレード
- Movable Type 3.121の提供を開始
呼ばれたので出てきました。
後者に関してはtextareaの中身やinput要素のvalueにMTCommentPreviewBody、MTCommentPreviewAuthorなどを書けばよいと思いますが、違いますでしょうか。
>(o)さん
こんばんは。
ご教示ありがとうございます!
後者については仰せの通り別途記述を修正致したいと思います。
またスクリプトの引用がもれてましたので(すいません…)併せて追記しておきます。
とりあえずご返事まで。
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)さん
こんばんは。
色々ご面倒おかけしてしまって恐縮です…。
また今回の提案に対する観点についてのアドバイス、大変勉強になりました。
どうもありがとうございました。
たしかにポップアップ画面からの遷移のバリエーションやポップアップ自体の需要を踏まえると、運用上適正な動作が保証されている状態においては過度な要求である気がします。
なにはともあれ、ポップアップ用テンプレート公開に際して色々調べた結果、画面を誘導できる仕組みが分かったのは収穫でした。
また何か言い出すかも知れませんが(笑)、その節はどうぞよろしくお願い致します。m(__)m
念のため、MTCommentFieldsで、staticオプションを与えなかったときに、直前のstaticの値を引き継いだコメントフォームを生成するためのパッチを置いておきます。
http://as-is.net/blog/archives/misc/mt31-comment_fields.patch
>(o)さん
こんにちはー。
バッチリ動作しております!
大変嬉しい限りです。
本当にありがとうございました!!
あ、このパッチはエントリーに追記させて頂いてもよろしいのですよね。
#ノークレーム・ノーリターンで(笑)。
ご利用はご自由にどうぞー。
多分こっちのテンプレートももっと簡単に書けますよね。
http://yujiro.dyndns.org/blog/koikikukan/archives/2004/12/26-021055.php