コメントスパム対策(その5)
約5ヶ月ぶりの対策です。
これまでの経緯は、コメントスパム対策(その3)で特定の文字列をエラーとする対処を行った後、コメントスパム対策(その4)を実施したのですが、通常のコメントでエラーが発生するようになってしまい、一旦全て元に戻しておりました。その後、大量のコメントスパムを頂く度に削除するという原始的な手法に陥ってましたがさすがにみっともないので今回、下記のプラグインを使わせて頂きました。
個人的にコメントスパム対策は特定の文字列のみをエラーとするのが望ましいと思ってましたので、まさにうってつけのプラグインです。ありがとうございました。
使い方は簡単です。以下、引用です。
quasi-spamfilter.zipをダウンロードし、展開してください。次に中に含まれるquasi-spamfilter.plをMovable Typeのpluginsディレクトリーにアップロードしてください。以上です。
また、デフォルト状態では
# Set your spam pattern
our $PATTERN = '<h1>|<a\s'; # H1 or A elements
と h1 タグおよび a タグを対象とする設定となってますので、私は下記のように変更しています。
# Set your spam pattern
our $PATTERN = 'hoge1|hoge2|hoge3';
hogen が対象文字列です。文字列を"|"で区切ることで何文字でも設定できます。
このように特定かつ複数文字列を含んだコメントをフィルタリングすることができる他、その後のリアクションを変更することもできます。エラーにすることもできますし、特定のURLにリダイレクトさせることもできます。私はデフォルト状態で利用させていただいてますので、フィルタリングされたコメントはあたかも正常に受け付けられたかのように振る舞います。
ということで、もしコメント投稿後の個別エントリーアーカイブにコメントが反映されていなければフィルタリングされたと解釈ください(普段使われることのない文字列しかフィルタの対象にしてませんので大丈夫とは思いますが)。
RSSリーダーの本文表示の違いを探る(その3:NoCDATAの利用)
Movable Typeには NoCDATA というオプションが用意されています。これを用いれば RSSフィードのデータの特殊文字をエンコードする設定も可能です。ユーザーズマニュアルに下記の説明があります。
デフォルトでMovable Typeは、データをXMLにエンコードしているとき、あなたのデータにHTMLタグや、XMLに対し安全でないデータが含まれていないかどうかをチェックし、検出した場合は、データをCDATAタグで囲みます。 ただし、ニュース・アグリゲータの中には、CDATAを他のデータと一緒にすると、問題が生じることがあります。こうした問題がある場合は、NoCDATAを使って特殊文字をエンティティにエンコードすることができます。
具体的には設定ファイル mt.cfg の250行目にある
- # NoCDATA 1
という行の先頭の#とブランクを削除することで有効になります。
実験として、
本文に<a href="hogehoge">HTMLタグ</a>を含んでいます。
という本文を例に変換してみました。
NoCDATA 0 の場合
<description><![CDATA[<p>本文に<a href="hogehoge">HTMLタグ</a>を含んでいます。</p>]]></description>
NoCDATA 1 の場合
<description><p>本文に<a href="hogehoge">HTMLタグ</a>を含んでいます。</p></description>
これまでのまとめです。
- HTMLタグや特殊文字を存在する場合、CDATAセクションとなる
- NoCDATAオプションを利用することでHTMLタグや特殊文字のエンコード(つまりCDATAセクションとならない)が可能
- MTEntryBody を使用し Convert Line Breaks が有効の場合、改行用のHTMLタグが付与されるため常にCDATAセクションとなる。MTEntryExcerpt を使用するとHTMLタグは全て除去されるため、CDATAセクションとなるのはHTMLエンティティが存在する場合のみ
- Movable Type3.0 と 3.1x では description のテキスト部分に用いられているMTタグが異なる
ということで、一番最初の index.rdf のサンプルはHTMLタグを用いてCDATAセクションの有無を説明したかったのですが、CDATAセクション有無がMTタグに依存してしまうため、description には MTEntryExcerpt を適用した状態でHTMLエンティティを用いました。
しかしよく考えてみると、その状態で本文とは別に「概要(excerpt)」を記述すればHTMLタグを利用できた訳です。つまりCDATAセクション化やエンコードはそもそも「概要」を対象とした機能であり、そうすることで機能は本来の役割を自然に振る舞うのではないでしょうか。
RSSリーダーの本文表示の違いを探る(その2)
RSSフィード本文のエンコードの仕組みについては前回の通りですが、ここでひとつ疑問がわきました。それはサイトによってHTMLタグがあるものとないものが混在するのはなぜか?という点についてです。これはMyBlogListリーダーをご覧になったことのある方ならご存知と思います。
本テンプレートユーザの方は Movable Type をお使いなので一律同じ結果、つまりHTMLタグが常に表示されるか、あるいは常に表示されないか、のどちらか一方になるだろうと思って見比べてみたところ、それでもタグありとタグなしの表示が混在していました。
今回はこの原因について探ってみました。たいした結果ではありません。
実は最初、私が試したサンプルは本文に
本文にHTMLタグを含んでいません。本文にHTMLタグを含んでいません。
本文にHTMLタグを含んでいません。
と書いて、これをRSSフィードにすると
<description>本文にHTMLタグを含んでいません。本文にHTMLタグを含んでいません。本文にHTMLタグを...</description>
という結果になることを期待しました。ところが実際に生成してみると、
<description><![CDATA[<p>本文にHTMLタグを含んでいません。本文にHTMLタグを含んでいません。<br />
本文にHTMLタグを含んでいません。</p>]]></description>
となりました。これは明らかに Mobable Type の Convert Line Breaks 機能により <p> や <br> タグが付与されたもので、たしかにMyBlogListリーダーではここから "<![CDATA]" と "]]>" を除いた部分が表示されていた記憶があります。
ではタグが付与されないパターンはどうやって生成されているのでしょうか?
ここで小粋空間の index.rdf(抜粋) を見てみると
:
<item rdf:about="http://www.koikikukan.com/archives/2005/01/25-233913.php">
<title>Movable Typeの脆弱性と対策</title>
<link>http://www.koikikukan.com/archives/2005/01/25-233913.php</link>
<description>ほぼ引用ですいません(+出遅れてます)。 【重要】 Movable Typeの脆...</description>
<dc:subject>3.121-ja</dc:subject>
<dc:creator>yujiro</dc:creator>
<dc:date>2005-01-25T23:39:13+09:00</dc:date>
</item>
:
と、HTMLタグは付与されていませんでした(他のエントリーについても同様です)。私は index.rdf のテンプレートをカスタマイズしていませんし、そもそも積極的にカスタマイズするページでもありません。
両者の違いについて内部処理で表示が切り替わる仕組みがあるのか?とも考えましたが、答えは簡単でした。
小粋空間で用いているindex.rdf テンプレート(抜粋)では該当部分に
<description><$MTEntryExcerpt encode_xml="1"$></description>
と MTEntryExcerpt が設定されており、実験で用いた Movable Type 3.121(新規インストールで利用)の index.rdf テンプレートには
<description><$MTEntryBody encode_xml="1"$></description>
と、MTEntryBodyが設定されていました。
つまり、Movable Type3.1x で index.rdf テンプレートの description タグのテキスト部分に MTEntryBody が用いられるようになったことが、表示に違いが生じていた原因と考えられます。小粋空間は3.01からのアップデートだったため、旧テンプレートの設定である MTEntryExcerpt が引き継がれていた、という訳です。
RSSリーダーの本文表示の違いを探る(その1)
昨年末、「MyBlogListリーダー等のRSSリーダーの本文表示でHTMLタグが表示される場合があります(注:現在は改善されているようです)がどうしてですか?」という質問の回答です。色々調べてみたとろ結構面白い結果となりましたので連載ものでいってみます。
MyBlogListリーダーで本文にHTMLタグが含まれるのはその仕様に依存すると思われますが、HTMLタグが本文に付与されることについては、少なくとも Movable Typeについてはその機能によるものです。
具体的には、本文中にHTMLタグまたはHTMLエンティティ(らしきもの)が存在する場合、文章全体がCDATAセクションという
- <![CDATA[ ~ ]]>
というもので括られます("~"に本文が入ります)。これで括ることによって文章にどのような文字が含まれていても適正なXMLデータとして扱われますので、一切加工されずそのまま保存されるという仕組みになっています。
RSSリーダーはRSSフィード(index.rdf/index.xml等)を参照します。下記に Movable Type でひとつだけエントリーしたRSS1.0フィードの index.rdf を示します。上は本文にHTMLエンティティを含まないもの、下は含んだ(ここでは"<"と">")ものです。青字部分と赤字部分がそれぞれ対象となる部分です。
index.rdf(本文にHTMLエンティティを含まない)
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:cc="http://web.resource.org/cc/"
xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://~/">
<title>First Weblog</title>
<link>http://~/</link>
<description></description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.121-ja" />
<items>
<rdf:Seq><rdf:li rdf:resource="http://~/archives/2005/01/post.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://~/archives/2005/01/post.html">
<title>てすと</title>
<link>http://~/archives/2005/01/post.html</link>
<description>本文にHTMLエンティティを含んでいません。本文にHTMLエンティティを含んでい...</description>
<dc:subject></dc:subject>
<dc:creator>Melody</dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
</item>
</rdf:RDF>
index.rdf(本文にHTMLエンティティを含む)
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:cc="http://web.resource.org/cc/"
xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://~/">
<title>First Weblog</title>
<link>http://~/</link>
<description></description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.121-ja" />
<items>
<rdf:Seq><rdf:li rdf:resource="http://~/archives/2005/01/post.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://~/archives/2005/01/post.html">
<title>てすと</title>
<link>http://~/archives/2005/01/post.html</link>
<description><![CDATA[本文に<b>HTMLエンティティ</b>を含んでいます。...]]></description>
<dc:subject></dc:subject>
<dc:creator>Melody</dc:creator>
<dc:date>2005-01-27T17:39:25+09:00</dc:date>
</item>
</rdf:RDF>
仮にHTMLタグが含まれていれば、
<description><![CDATA[本文に<b>HTMLエンティティ</b>を含んでいます。...]]></description>
となります。最初からHTMLタグを例に扱った方がわかりやすいのですが、扱えない理由があります。これについては後ほど明らかにしたいと思います。
参考までに、変換処理を実際に行っている
- lib/MT/Util.pm
のソース(抜粋)を掲載しておきます。
my %Map = ('&' => '&', '"' => '"', '<' => '<', '>' => '>', '\'' => ''');
my $RE = join '|', keys %Map;
sub encode_xml {
my($str, $nocdata) = @_;
$nocdata ||= MT::ConfigMgr->instance->NoCDATA;
if (!$nocdata && $str =~ m/
<[^>]+> ## HTML markup
| ## or
&(?:(?!(\#([0-9]+)|\#x([0-9a-fA-F]+))).*?);
## something that looks like an HTML entity.
/x) {
## If ]]> exists in the string, encode the > to >.
$str =~ s/]]>/]]>/g;
$str = '<![CDATA[' . $str . ']]>';
} else {
$str =~ s!($RE)!$Map{$1}!g;
}
$str;
}
ポップアップ画面を用いたコメント投稿(その5:その4の補足)
「その4:コメントフォームのカスタマイズ」で、コメント・プレビュー/コメント・エラー時のサイン・インおよびサイン・アウトについては、
<$MTRemoteSignInLink static="<$MTCommentPreviewIsStatic$>"$>
という記述がサポートされていないため「画面を誘導できません」と書きましたが、Ogawaさんのパッチを流用させて頂くという案がありましたので追記致します。
- lib/MT/Context.pm
の1110?1140行目辺りにあるサイン・イン/サイン・アウト用リンクをハンドリングするプログラムに対して下記の通り、赤字を削除して青字を追加します。
sub _hdlr_remote_sign_in_link {
my ($ctx, $args) = @_;
my $cfg = MT::ConfigMgr->instance;
:
my $comment_script = $cfg->CommentScript;
my $static_arg = $args->{static} ? "static=1" : "static=0";
my $static_arg;
if (defined($args->{static})) {
$static_arg = $args->{static} ? "static=1" : "static=0";
} else {
$static_arg = $ctx->stash('comment_is_static') ? "static=1" : "static=0";
}
my $e = $_[0]->stash('entry');
:
}
sub _hdlr_remote_sign_out_link {
my ($ctx, $args) = @_;
my $cfg = MT::ConfigMgr->instance;
:
my $static_arg = $args->{static} ? "static=1" : "static=0";
my $static_arg;
if (defined($args->{static})) {
$static_arg = $args->{static} ? "static=1" : "static=0";
} else {
$static_arg = $ctx->stash('comment_is_static') ? "static=1" : "static=0";
}
my $e = $_[0]->stash('entry')
:
}
これでコメント・プレビューおよびコメント・エラーテンプレートの MTRemoteSignInLink および MTRemoteSignOutLink を
<$MTRemoteSignInLink$>
<$MTRemoteSignOutLink$>
と static属性を省略して記述することで、コメント・リストまたは個別エントリーアーカイブの MTRemoteSignInLink または MTRemoteSignOutLink で設定された static値を引き継ぎます。具体的には、例えば <$MTRemoteSignOutLink$> がHTMLソースに展開されると
<a href="http://~/mt-comments.cgi?__mode=handle_sign_in&static=0&entry_id=3&logout=1">サイン・アウト</a>
のように static値(0はポップアップ画面への誘導を示します)が query string に設定されます。またこれ以降の画面遷移にも引き継がれます。
誤りがありましたらご指摘よろしくお願い致します。
Movable Typeの脆弱性と対策
ほぼ引用ですいません(+出遅れてます)。
Movable Typeの脆弱性により、スパムメールの送信を幇助してしまう現象が発生することが分かりました。出荷済みのすべてのMovable Type日本語版に、この脆弱性があることが確認されました。
旧バージョンに対して、この脆弱性を回避するためのプラグインが公開されています。なお日本語版サイトではダウンロード可能なMovable Typeが、脆弱性の問題に対策済みのバージョン3.122に更新されています。
詳細は上記ページを参照ください。
テンプレートのアンカー修正
昨年からの宿題となっていた、個別エントリーアーカイブのコメント、コメント投稿、およびトラックバックにあるアンカータグの id 属性および name 属性の指定を修正しました。修正対象のテンプレートは
です。修正内容は下記の通りです。
<MTEntryIfAllowPings>
<a id="trackbacks" name="trackbacks"></a>
<div id="trackbacks" class="comments-head">トラックバックURL</div>
:
:
<a id="comments" name="comments"></a>
<div id="comments" class="comments-head"><a name="comments"></a>コメント</div>
<MTComments>
<a id="c<$MTCommentID$>" name="c<$MTCommentID$>"></a>
<div id="c<$MTCommentID$>" class="comments-body">
:
修正の動機は、「テンプレートから生成されたページで、コメントやトラックバックのアンカー指定が Another HTML-lint gateway の文法チェックにひっかかる」というご指摘を頂いたのが発端で、とりあえず分散していた id 属性と name 属性をアンカータグにまとめました。
またコメント用の name 属性値の先頭に"c"を付与しました。理由は id 属性との属性値が異なっていることによる文法エラーを避けるためと、デフォルトテンプレートの記述("c+MTCommentID")に従いました。
2つの属性を同一のタグに移動したことで、リンクを示す a タグとスタイルを決定する div タグが意味的に理解しやすくなるという効果もあったようです。なお現状の設定でも動作上問題ありません。
また、個別エントリーアーカイブ(3カラム用)/コメント・プレビュー(3カラム用)/コメント・エラー(3カラム用)の各テンプレートのサイドメニューにあるコメント投稿者のリンクも併せて修正致しました。修正内容は下記の通りです。こちらは"c"の追加およびアンカー名にバグがありましたので、その対処です。
<div class="side">
<MTEntries recently_commented_on="5">
<a href="<$MTEntryLink$>"><MTEntryTitle></a>
<br/>
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#c<$MTCommentID$><MTEntryID pad="1"$>">
<MTCommentAuthor></a> <$MTCommentDate format="%m/%d"$><br />
</MTComments>
</MTEntries>
</div>
個別エントリーアーカイブのサイドメニューにあるコメント投稿者欄をクリックして、該当の投稿者位置にページがスクロールされない場合は上記の対処を行ってください。"#"の後ろにある"c"は付与しない方が修正が楽です。
ポップアップ画面を用いたコメント投稿(その4:コメントフォームのカスタマイズ)
3回で終わらせるつもりでしたが追加内容がありましたので。
コメント・リスト/コメント・プレビュー/コメント・エラーのテンプレートに MTCommentFields を用いない、つまり個別エントリーアーカイブのフォーム部分を利用する場合の修正方法です。
具体的な作業としては、コメント・リストテンプレートの
<MTCommentFields static="1">
およびコメント・プレビュー/コメント・エラーテンプレートの
<MTCommentFields preview="1">
の部分を下記のソースにそれぞれ入れ替えます。ソースは個別アーカイブテンプレートから該当部分を切り出したもので、赤色および青色部分の修正を行います。赤色は本来の修正箇所、青色はフォーム情報を前ページから引き継ぐための修正です(Ogawa::memorandaさんからのアドバイスによるものです)。
繰り返しになりますが投稿されたコメントがポップアップ画面からのものか、非ポップアップ画面からのものかを次の画面に知らせる必要があります。それを引継ぐ情報としてstatic属性が使われています。赤色の
<$MTRemoteSignOutLink static="n"$>
または
<input type="hidden" name="static" value="n" />
の部分を適宜修正してください。n の意味は下記の通りです。必要な値を適宜設定してください。
- 0:サイン・イン/サイン・アウト/コメント投稿後、ポップアップ画面へ誘導
- 1:サイン・イン/サイン・アウト/コメント投稿後、非ポップアップ画面へ誘導
- <$MTCommentPreviewIsStatic$>:前画面のstatic値を引き継ぐ
ただし、コメント・プレビュー/コメント・エラーで
<$MTRemoteSignOutLink static="<$MTCommentPreviewIsStatic$>"$>
という記述はサポートされていないようです。→ 2005.01.27追記:その5に対処方法を記しました。
コメント・リストテンプレート
<h2>コメントしてください</h2>
<MTIfRegistrationRequired>
<MTIfNonEmpty tag="MTTypeKeyToken">
<div id="thanks">
<p>サイン・インを確認しました、
<script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script><script>document.write(commenter_name);</script>
さん。コメントしてください。 (<a href="<$MTRemoteSignOutLink static="1"$>">サイン・アウト</a>)</p>
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">
<input type="hidden" name="static" value="1" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
<p><label for="url">URL:</label><br />
<input tabindex="1" type="text" name="url" id="url" />
情報を登録する?
<input type="radio" id="remember" name="bakecookie" onclick="rememberMe(this.form)" /><label for="remember">はい</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">いいえ</label><br style="clear: both;" />
</p>
<p><label for="text">コメント:</label><br />
<textarea tabindex="2" id="text" name="text" rows="10" cols="50"></textarea></p>
<div align="center">
<input type="submit" tabindex="3" name="preview" value=" 確認 " />
<input style="font-weight: bold;" tabindex="4" type="submit" name="post" value=" 投稿 " />
</div>
</form>
</div>
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.getElementById('thanks').style.display = 'block';
} else {
document.write('サイン・インしていません。このサイトにコメントをする前に登録してください。 <a href="<$MTRemoteSignInLink static="1"$>"> サイン・イン</a>');
document.getElementById('thanks').style.display = 'none';
}
// -->
</script>
<MTElse>
コメント登録機能が設定されていますが、TypeKey トークンが設定されていません。
</MTElse>
</MTIfNonEmpty>
<MTElse>
<MTIfNonEmpty tag="MTTypeKeyToken">
<script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script>
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.write('サイン・インを確認しました、', commenter_name, '. さん。コメントしてください。 (<a href="<$MTRemoteSignOutLink static="1"$>">サイン・アウト</a>)');
} else {
document.write('TypeKey ID を使って <a href="<$MTRemoteSignInLink static="1"$>"> サイン・イン</a> してください。');
}
// -->
</script>
</MTIfNonEmpty>
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">
<input type="hidden" name="static" value="1" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
<div id="name_email">
<p><label for="author">名前:</label><br />
<input tabindex="1" id="author" name="author" /></p>
<p><label for="email">メールアドレス:</label><br />
<input tabindex="2" id="email" name="email" /></p>
</div>
<MTIfNonEmpty tag="MTTypeKeyToken">
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.getElementById('name_email').style.display = 'none';
}
// -->
</script>
</MTIfNonEmpty>
<p><label for="url">URL:</label><br />
<input tabindex="3" type="text" name="url" id="url" />
保存しますか?
<input type="radio" id="remember" onClick="rememberMe(this.form)" name="bakecookie" /><label for="remember">はい</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">いいえ</label><br style="clear: both;" />
</p>
<p><label for="text">コメント:</label> <MTIfAllowCommentHTML>
(書式を変更するような一部のHTMLタグを使うことができます)</MTIfAllowCommentHTML><br/>
<textarea tabindex="4" id="text" name="text" rows="10" cols="50"></textarea></p>
<div align="center">
<input type="submit" name="preview" tabindex="5"
value=" 確認 " />
<input style="font-weight: bold;" type="submit" name="post"
tabindex="6" value=" 投稿 " />
</div>
</form>
</MTElse>
</MTIfRegistrationRequired>
コメント・プレビュー/コメント・エラーテンプレート
<h2>コメントしてください</h2>
<MTIfRegistrationRequired>
<MTIfNonEmpty tag="MTTypeKeyToken">
<div id="thanks">
<p>サイン・インを確認しました、
<script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script><script>document.write(commenter_name);</script>
さん。コメントしてください。 (<a href="<$MTRemoteSignOutLink static="1"$>">サイン・アウト</a>)</p>
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">
<input type="hidden" name="static" value="<$MTCommentPreviewIsStatic$>" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
<p><label for="url">URL:</label><br />
<input tabindex="1" type="text" name="url" id="url" />
情報を登録する?
<input type="radio" id="remember" name="bakecookie" onclick="rememberMe(this.form)" /><label for="remember">はい</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">いいえ</label><br style="clear: both;" />
</p>
<p><label for="text">コメント:</label><br />
<textarea tabindex="2" id="text" name="text" rows="10" cols="50"></textarea></p>
<div align="center">
<input type="submit" tabindex="3" name="preview" value=" 確認 " />
<input style="font-weight: bold;" tabindex="4" type="submit" name="post" value=" 投稿 " />
</div>
</form>
</div>
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.getElementById('thanks').style.display = 'block';
} else {
document.write('サイン・インしていません。このサイトにコメントをする前に登録してください。 <a href="<$MTRemoteSignInLink static="1"$>"> サイン・イン</a>');
document.getElementById('thanks').style.display = 'none';
}
// -->
</script>
<MTElse>
コメント登録機能が設定されていますが、TypeKey トークンが設定されていません。
</MTElse>
</MTIfNonEmpty>
<MTElse>
<MTIfNonEmpty tag="MTTypeKeyToken">
<script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script>
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.write('サイン・インを確認しました、', commenter_name, '. さん。コメントしてください。 (<a href="<$MTRemoteSignOutLink static="1"$>">サイン・アウト</a>)');
} else {
document.write('TypeKey ID を使って <a href="<$MTRemoteSignInLink static="1"$>"> サイン・イン</a> してください。');
}
// -->
</script>
</MTIfNonEmpty>
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">
<input type="hidden" name="static" value="<$MTCommentPreviewIsStatic$>" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
<div id="name_email">
<p><label for="author">名前:</label><br />
<input tabindex="1" id="author" name="author" value="<$MTCommentPreviewAuthor encode_html="1"$>" /></p>
<p><label for="email">メールアドレス:</label><br />
<input tabindex="2" id="email" name="email" value="<$MTCommentPreviewEmail encode_html="1"$>" /></p>
</div>
<MTIfNonEmpty tag="MTTypeKeyToken">
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
document.getElementById('name_email').style.display = 'none';
}
// -->
</script>
</MTIfNonEmpty>
<p><label for="url">URL:</label><br />
<input tabindex="3" type="text" name="url" id="url" value="<$MTCommentPreviewURL encode_html="1"$>" />
保存しますか?
<input type="radio" id="remember" onClick="rememberMe(this.form)" name="bakecookie" /><label for="remember">はい</label><input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)" value="Forget Info" style="margin-left: 15px;" /><label for="forget">いいえ</label><br style="clear: both;" />
</p>
<p><label for="text">コメント:</label> <MTIfAllowCommentHTML>
(書式を変更するような一部のHTMLタグを使うことができます)</MTIfAllowCommentHTML><br/>
<textarea tabindex="4" id="text" name="text" rows="10" cols="50"><$MTCommentPreviewBody convert_breaks="0" encode_html="1"$></textarea></p>
<div align="center">
<input type="submit" name="preview" tabindex="5"
value=" 確認 " />
<input style="font-weight: bold;" type="submit" name="post"
tabindex="6" value=" 投稿 " />
</div>
</form>
</MTElse>
</MTIfRegistrationRequired>
| その1:基本動作 |
| その2:カスタマイズ |
| その3:公開テンプレート修正方法 |
| その4:コメントフォームのカスタマイズ |
| その5:その4の補足 |
選択されたアーカイブリンクを強調表示する
サイドメニューにある Monthly Archives および Categories のリンクをクリックした時に該当のリンクを強調表示させるカスタマイズです。
本カスタマイズは下記の記事を参考にさせて頂きました。ありがとうございました。
ここではカスタマイズ方法のみ記しておりますので機能の詳細につきましては参照元の記事をご覧ください。
以下カスタマイズ方法です。なおオリジナルは PerlScript プラグインを利用されていますがここでは php を使ってみました。したがって利用するアーカイブファイルの拡張子が .php になっていることが前提となります。またモジュール化されている場合は正常に動作しませんので予めご了承ください。PerlScriptプラグインを利用される場合は拡張子の制約はありませんので必要な箇所を適宜修正ください。
1.MTTagInvoke のダウンロード
MTExtensions のページより MTTagInvoke をダウンロードしてください(ページ左上に「Download」のリンクがあります)。ダウンロードしたファイルを解凍して MTTagInvoke.pl を plugins フォルダに配置(FTP等によるアップロードを含む)します。
2.Monthly Archives を変更する場合
日付アーカイブテンプレートにあるサイドメニューの Monthly Archives のタグ(下のリスト)の下線部分を削除して、青色のタグを追加してください。例は公開テンプレートのものを利用しています。
<div class="sidetitle">
Monthly Archives
</div>
<MTTagInvoke tag_name="MTSetVar" name="thismonth">
<MTTagAttribute name="value"><$MTArchiveDate format="%Y%m"$></MTTagAttribute>
</MTTagInvoke>
<div class="side">
<MTArchiveList archive_type="Monthly">
<a href="<$MTArchiveLink$>">
<a href="<$MTArchiveLink$>"<?php $a ="<$MTGetVar name="thismonth"$>"; $b = "<$MTArchiveDate format="%Y%m"$>"; if ($a == $b) print " style=\"font-weight:bold;\""; ?>>
<$MTArchiveTitle$></a> [<$MTArchiveCount$>]<br/>
</MTArchiveList>
</div>
本設定は日別アーカイブページにも適用されます。例えば月別アーカイブと日別アーカイブが同じ「日付アーカイブテンプレート」を利用する設定になっていて(デフォルトではそのようになっています)、カレンダーのリンクが日別アーカイブページになっている場合、カレンダーのリンクをクリックした先のページで該当月が強調表示されます。
3.Categories を変更する場合
カテゴリー・アーカイブテンプレートにあるサイドメニューの Categories のタグ(下のリスト)の下線部分を削除して、青色のタグを追加してください。同じく公開テンプレートのものを例にしています。
3.1 一括表示
<div class="sidetitle">
Categories
</div>
<MTTagInvoke tag_name="MTSetVar" name="thiscategory">
<MTTagAttribute name="value"><$MTArchiveTitle$></MTTagAttribute>
</MTTagInvoke>
<div class="side">
<MTCategories>
<a href="<$MTCategoryArchiveLink$>">
<a href="<$MTCategoryArchiveLink$>" <?php $a ="<$MTGetVar name="thiscategory"$>"; $b = "<$MTArchiveTitle$>"; if ($a == $b) print "style=\"font-weight:bold;\""; ?>>
<$MTCategoryLabel$></a> [<$MTCategoryCount$>]<br />
</MTCategories>
</div>
3.2 サブカテゴリー表示
<div class="sidetitle">
Categories
</div>
<MTTagInvoke tag_name="MTSetVar" name="thiscategory">
<MTTagAttribute name="value"><$MTArchiveTitle$></MTTagAttribute>
</MTTagInvoke>
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
<a href="<$MTCategoryArchiveLink$>" <?php $a ="<$MTGetVar name="thiscategory"$>"; $b = "<$MTArchiveTitle$>"; if ($a == $b) print "style=\"font-weight:bold;\""; ?> title="<$MTCategoryDescription$>">
<MTCategoryLabel></a> [<$MTCategoryCount$>]
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
サブカテゴリーについては MTTopLevelCategories で括られているか、モジュール化されていないとクリックしたカテゴリー自体が表示されませんのでご注意ください。
いずれも表示部分を、
style=\"font-weight:bold;\"
に統一していますが、
class=\"hogehoge\"
に変更し、スタイルシートへ
.hogehoge {
font-weight:bold;
}
と設定することも可能です。
2005.01.11 追記
モジュール化されている場合は正常に動作しない旨を追記しました。
2005.01.12 追記
モジュール化対応版を公開しました。
リアルタイムカレンダー(改)
Movable Type がサポートするカレンダーでは、エントリー投稿やコメント投稿が行われないとカレンダー(のリンク)は更新されません。したがって MTCalendarIfToday タグを利用して本日の日付を装飾するカスタマイズを行っている場合も、先の動作がない限りカレンダーの本日表示は更新されません。
本カスタマイズは仕様に依存せず、リアルタイムに日付を更新させます(ブラウザの更新等は必要です)。本日の日付がリアルタイムに更新されることを指して「リアルタイムカレンダー」と(勝手に)命名しました。なおカレンダー自体が存在しない月跨りについては機能の対象外ですので予めご了承ください。
注:本エントリーではPHP化が必要なため、現在は JavaScript によるカスタマイズを推奨しています。詳細は下記のエントリーまたはカレンダーアーカイブをご覧ください。
- リアルタイムカレンダー(JavaScript版)
- 休日表示付リアルタイムカレンダー for Movable Type
- 休日表示付きリアルタイムカレンダー(月送り・横型) for Movable Type
このカスタマイズを行う前提条件はPHPが利用可能なこと、つまりカレンダータグを利用するテンプレートのファイル名の拡張子が .php になっていることです(詳細は後述)。
オリジナルサイトは下記です。ありがとうございました。
また記事のURLは以前よりこのカスタマイズを利用されていた Magic White さんより教えて頂きました(自力で発見できず…)。併せてありがとうございました。
タイトルの「改」は下記を指しています。
- 文字自体のスタイル設定だったオリジナルからテーブルのカラムにスタイルを与えられるように変更
- 本日であることを日でしか判定していなかったので年月日判定を追加(月送りカレンダー用)
ここでは拡張子がすでに .php になっている場合とそうでない場合、および月送りカレンダー利用の場合の3つのケースについて説明しています。それぞれに必要な項目は下記の通りです。
- 拡張子が .php になっている場合:1、2.1(または2.3)
- 拡張子が .php になっていない場合:1、3、4
- 月送りカレンダーの場合:1、2.2
月送りカレンダーの場合の注意事項
- 本エントリーとは別に月送りカレンダーでのカスタマイズが必要です。
- カレンダー用テンプレートのファイル名の拡張子は .php に変更してください。
- 月送りカレンダーを引き込むタグ(iframe)は .html ファイルを呼び出すようになってますので、下記のように .php ファイルを引き込むように変更してください。
<div align="center" class="side">
<iframe name="cal-iframe" src="<MTBlogURL>archives/calendar/<MTDate format="%Y/%m/index">.html.php" width="150" height="115" scrolling="NO" frameborder="0" marginwidth="0" marginheight="0">
</iframe>
</div>
- 横型カレンダーご利用で拡張子が .php になっていない場合は、本エントリー3項のリストの下半分(空行から下の部分)を2.3項のリストに置き換える形で行ってください。
- 月送りカレンダー用ファイルの拡張子を「.html」から「.php」に変更した際、.html ファイルが残っているとカレンダーが正常に表示されない場合があります。 .html ファイルは必ず削除してください。
1.スタイルシートにカレンダー用スタイルの追加(共通)
スタイルシートのcalendar設定の下辺りに下記の青色部分を追加します。リストは公開テンプレートを例にしています。設定部分は2パターン掲載していますので不要な部分を削除して設定内容を適宜修正してください。
.calendar table {
padding: 0px;
border-collapse: collapse;
}
.today {
background : #000000; /* 背景色をつける設定 */
border : 1px solid #000000; /* 枠線をつける設定 */
}
注:月送りカレンダーの方は、上記の設定をカレンダー用スタイルシート(calendar.css)の一番下に追加してください。
2.カレンダー関連タグの変更(拡張子が .php になっている場合/月送りカレンダーの場合)
カレンダーの設定がされている各テンプレートの <MTCalendar>~</MTCalendar> の部分を下記のスクリプトに変更します。利用中のカレンダーによって2種類のテンプレートを用意していますので該当する方をお使いください。
2.1 通常の1ヶ月表示の場合
<?php $day = date("j");?>
<MTCalendar>
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<MTCalendarIfEntries><?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?><td align="center"<?php print "$style"; ?>><span class="calendar"><MTEntries lastn="1"><a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a></MTEntries></span></td></MTCalendarIfEntries>
<MTCalendarIfNoEntries><?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?><td align="center"<?php print "$style"; ?>><span class="calendar"><$MTCalendarDay$></span></td></MTCalendarIfNoEntries>
<MTCalendarIfBlank><td> </td></MTCalendarIfBlank>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
2.2 月送りカレンダーの場合
月送りカレンダーご利用の方は「アーカイブ・テンプレート」の「カレンダー」に設定されている該当部分を下記に変更してください。
<?php $day = date("j"); $year = date("Y"); $month = date("m"); ?>
<MTCalendar month="this">
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<MTCalendarIfEntries>
<?php $y="<$MTCalendarDate format='%Y'$>"; $m="<$MTCalendarDate format='%m'$>"; $d="<$MTCalendarDay$>"; if($year == $y && $month == $m && $day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?>
<td align="center"<?php print "$style"; ?>><span class="calendar"><MTEntries lastn="1"><a href="<$MTEntryLink archive_type="Daily"$>" target="_top"><$MTCalendarDay$></a></MTEntries></span></td>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries>
<?php $y="<$MTCalendarDate format='%Y'$>"; $m="<$MTCalendarDate format='%m'$>"; $d="<$MTCalendarDay$>"; if($year == $y && $month == $m && $day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?>
<td align="center"<?php print "$style"; ?>><span class="calendar"><$MTCalendarDay$></span></td>
</MTCalendarIfNoEntries>
<MTCalendarIfBlank><td> </td></MTCalendarIfBlank>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
ちなみに両者の違いですが、月送りカレンダー/複数月表示の場合は本日の判定に年月日を取得しています。1ヶ月表示の場合は日のみの判定なので若干軽いです。月送りカレンダーで1ヶ月用のタグを使うと毎月同じ日に印がつきますのでご注意ください。
2.3 横型カレンダーの場合
このカレンダーは table タグを用いてないパターンです。1項のスタイルシートは .today があれば大丈夫です(table のスタイル設定は不要)が、若干スタイルの指定が必要かもしれませんので適宜行ってください。
<?php $day = date("j");?>
<MTCalendar>
<MTCalendarIfEntries>
<?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = "today"; } else { $style = "calendar"; } ?>
<span class="<?php print "$style"; ?>">
<MTEntries lastn="1">
<a href="<$MTEntryLink archive_type="Daily"$>"> <$MTCalendarDay$></a>
</MTEntries>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries>
<?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = "today"; } else { $style = "calendar"; } ?>
<span class="<?php print "$style"; ?>">
<$MTCalendarDay$>
</MTCalendarIfNoEntries>
<MTCalendarIfBlank><MTElse></span></MTElse></MTCalendarIfBlank>
</MTCalendar>
3.カレンダー用インデックステンプレートの作成(拡張子が .php になっていない場合)
「管理メニュー」の「テンプレート」をクリック→次ページ右上の「新しいインデックス・テンプレートを作る」をクリック(3.2-ja 以降の場合は左上の「インデックス」→右上の「テンプレートを新規作成」をクリック)し、下記を設定してください。
- テンプレート名:カレンダー(何でも良い)
- 出力ファイル名:calendar.php
- インデックス?自動的に再構築する:チェック
- テンプレートの内容:下記リストをコピー&ペースト(公開テンプレート用に合わせてますのでそれ以外の方はクラス名等を適宜修正してください)
<div class="side">
<div class="calendar">
<div class="sidetitle">
Calendar of <$MTDate format="%B %Y"$>
</div>
<table border="0" cellspacing="4" cellpadding="0" align="center" summary="投稿した日にリンクする月別のカレンダー">
<tr>
<th abbr="Sunday"><span class="calendar"><font color="#e50003">Sun</font></span></th>
<th abbr="Monday"><span class="calendar">Mon</span></th>
<th abbr="Tuesday"><span class="calendar">Tue</span></th>
<th abbr="Wednesday"><span class="calendar">Wed</span></th>
<th abbr="Thursday"><span class="calendar">Thu</span></th>
<th abbr="Friday"><span class="calendar">Fri</span></th>
<th abbr="Saturday"><span class="calendar"><font color="blue">Sat</font></span></th>
</tr>
<?php $day = date("j");?>
<MTCalendar>
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<MTCalendarIfEntries><?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?><td align="center"<?php print "$style"; ?>><span class="calendar"><MTEntries lastn="1"><a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a></MTEntries></span></td></MTCalendarIfEntries>
<MTCalendarIfNoEntries><?php $d="<$MTCalendarDay$>"; if($day == $d) { $style = " class=\"today\""; } else { $style = ""; } ?><td align="center"<?php print "$style"; ?>><span class="calendar"><$MTCalendarDay$></span></td></MTCalendarIfNoEntries>
<MTCalendarIfBlank><td> </td></MTCalendarIfBlank>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
</div>
</div>
設定終了後、保存・再構築してください。
4.calendar.phpのインクルード(拡張子が .php になっていない場合)
各テンプレートの カレンダー設定部分(赤色)をごっそり削除して青色のタグに置き換えてください。
<div class="side">
<div class="calendar">
<table border="0" cellspacing="4" cellpadding="0" align="center" summary="投稿した日にリンクする月別のカレンダー">
<caption class="calendarhead"><$MTDate format="%B %Y"$></caption>
<tr>
<th abbr="Sunday"><span class="calendar"><font color="#e50003">Sun</font></span></th>
<th abbr="Monday"><span class="calendar">Mon</span></th>
<th abbr="Tuesday"><span class="calendar">Tue</span></th>
<th abbr="Wednesday"><span class="calendar">Wed</span></th>
<th abbr="Thursday"><span class="calendar">Thu</span></th>
<th abbr="Friday"><span class="calendar">Fri</span></th>
<th abbr="Saturday"><span class="calendar"><font color="blue">Sat</font></span></th>
</tr>
<MTCalendar>
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<td align="center" <MTCalendarIfToday>bgcolor="#ffffe0"</MTCalendarIfToday>><span class="calendar">
<MTCalendarIfEntries>
<MTEntries lastn="1"><a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a></MTEntries>
</MTCalendarIfEntries><MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries><MTCalendarIfBlank> </MTCalendarIfBlank>
</span></td><MTCalendarWeekFooter></tr></MTCalendarWeekFooter></MTCalendar>
</table>
</div>
</div>
<$MTInclude file="calendar.php"$>
設定終了後、保存・再構築してください。
2005.01.05 追記
月送りカレンダー用のタグにtypoがありましたので修正しました。また同タグのリンクにターゲット指定を追加しました。
2005.02.02 追記
月送りカレンダーのエントリーへのリンクおよび説明を本文に追加しました。
2005.03.11 追記
横型カレンダーの説明を本文に追加しました。
2005.03.21 追記
横型カレンダーの </span> の制御が誤っていましたので修正しました。
2005.07.31 追記
月送りカレンダーの場合、 iframe タグを修正する説明が不足していましたので追記しました。
2005.08.07 追記
Apache のログにPHPエラーが出ていたためスクリプトを一部修正しました。
2005.10.31 追記
3.2-ja 用の記述を追加しました。
ポップアップ画面を用いたコメント投稿(その3:公開テンプレート修正方法)
このシリーズの(多分)最後は、公開テンプレートの修正方法についての説明です。
2004年12月30日、本エントリー投稿に伴いまして公開テンプレートにもポップアップ機能を追加致しました。そのためテンプレート取得日によってカスタマイズ方法が若干異なります。これにつきましては各項目の右側に対応するテンプレートを記しましたので必要な方を適宜参照ください。念のため
- 2004年12月30日以前に取得された方:1、2、3、4.2、5、6
- 2004年12月30日以降に取得された方:1、2、3、4.1
となっています。どちらか分からない場合は4項のテンプレートの内容で判断してみてください。
Movable Type 3.121を新規インストール、公開テンプレートの内容に差し替えた後、下記の手順を実施して動作確認しています。その中で個別エントリーアーカイブよりコメント・プレビューまたはコメント・エラー画面にジャンプした後でTypeKeyサインインした場合、個別エントリーアーカイブにリダイレクトされずにコメント・リストにリダイレクトされるという事象が発生しています。この点につきましては予めご容赦ください。また日本語のTypeKeyニックネームでサイン・インした場合、どの画面からのサイン・インも文字化けしないことを確認しておりますが、文字化けする場合はご連絡ください。
1.ポップアップ用テンプレート設定(必須)
より
- コメント・リスト(ポップアップ用)
- コメント・プレビュー(ポップアップ用)
- コメント・エラー(ポップアップ用)
- コメント・保留(ポップアップ用)
の各テンプレートを、該当するテンプレートの内容に上書きしてください(どちらのエントリーも同じ内容です)。
なお、コメント・プレビュー/コメント・エラー/コメント・保留テンプレートについては現在お使いのテンプレートを上書き致しますので、予め任意のファイル名でバックアップされることをお勧め致します。
2.Context.pm修正・その1(必須)
Ogawa::Memorandaさんの提供のパッチを
- lib/MT/Template/Context.pm
の1170行目辺りに設定します。赤色部分を削除して青色部分を追加してください(念のためバックアップを保存しておきましょう)。
my $allow_comment_html_note = (($blog->allow_comment_html)
? ($args->{html_ok_msg} ||
MT->translate("(You may use HTML tags for style)")) : "");
my $lang = ($cfg->DefaultLanguage eq 'ja') ? "&lang=ja" : '';
my $needs_email = $blog->require_comment_emails ? "&need_email=1" : "";
my $registration_required = ($blog->allow_reg_comments
&& !$blog->allow_unreg_comments);
my $registration_allowed = $blog->allow_reg_comments;
my $unregistered_allowed = $blog->allow_unreg_comments;
my $static_arg = $args->{static} ? "static=1" : "static=0";
my $static_field = ($args->{static} || !defined($args->{static}))
my ($static_arg, $static_field);
if (defined($args->{static})) {
$static_arg = $args->{static} ? "static=1" : "static=0";
$static_field = $args->{static}
? (q{<input type="hidden" name="static" value="1" />})
: (q{<input type="hidden" name="static" value="0" />});
} else {
$static_arg = $ctx->stash('comment_is_static') ? "static=1" : "static=0";
$static_field = $ctx->stash('comment_is_static')
? (q{<input type="hidden" name="static" value="1" />})
: (q{<input type="hidden" name="static" value="0" />});
}
my $typekey_version = $cfg->TypeKeyVersion;
このパッチはコメント・プレビュー/コメント・エラーテンプレートの MTCommentField タグに static属性が指定されていない場合、個別エントリーアーカイブまたは3項のコメントリストに設定した static 属性値を自動的に取得してくれるもので、投稿後の画面遷移がその1の通りになります。
3.Context.pm修正・その2(必須)
MTCommentField タグを利用する場合、展開されるソースに getCookie 関数が含まれます。実はコメント用各テンプレートの「Remember Me」またはHTMLの head タグ内にも同じ関数が存在しており、同一名称の関数が重複する場合は後方に定義されたもの(つまり MTCommentField での getCookie)が有効になります。
これにより、ポップアップ画面で日本語のTypeKeyニックネームが文字化けする場合等は
- lib/MT/Template/Context.pm
の(3.121の場合は)1210行目あたりにある下記のスクリプトについて、青色部分を追加してコメントアウトしてください(if文もろとも削除しても良いでしょう)。
if ($registration_allowed || $unregistered_allowed) {
$javascript = <<JAVASCRIPT;
<script language="javascript">
//function getCookie (name) {
// var prefix = name + \'=\';
// var c = document.cookie;
// var nullstring = \'\';
// var cookieStartIndex = c.indexOf(prefix);
// if (cookieStartIndex == -1)
// return nullstring;
// var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
// if (cookieEndIndex == -1)
// cookieEndIndex = c.length;
// return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex));
//}
</script>
JAVASCRIPT
}
テンプレートモジュール「Remember Me」の有無は設定環境によって異なります。修正しても文字化けが解消しない場合は cookie を一旦削除(IEであれば「ツール」→「インターネットオプション」→「Cookieの削除」)してみてください。
4.各アーカイブテンプレート変更(その1:リンク先変更)
ポップアップしたい各アーカイブテンプレート(メインページ/カテゴリー・アーカイブ/日付アーカイブ等)の個別エントリーアーカイブへのリンクを、ポップアップ画面へのリンクに変更します。
4.1 2004年12月30日以降にテンプレートを取得された場合
赤色部分を削除(非ポップアップへのリンクをコメントアウト)して青色部分を追加(ポップアップへのリンクを有効化)してください。よく分からない場合は「ポップアップ用」という行のコメントに括られた部分だけを残して、他(「ポップアップ用」という行も含めて)はごっそり削除してください。
<MTEntryIfAllowComments>
<!-- コメント・非ポップアップ用 -->
| <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments</a> [<$MTEntryCommentCount$>]
<!-- コメント・非ポップアップ用 -->
<!-- コメント・ポップアップ用 -->
| <a href="<$MTCGIPath$><$MTCommentScript$>?entry_id=<$MTEntryID$>" onclick="OpenComments(this.href); return false">Comments</a> [<$MTEntryCommentCount$>]
<-- コメント・ポップアップ用 -->
</MTEntryIfAllowComments>
<MTEntryIfAllowPings>
<!-- トラックバック・非ポップアップ用 -->
| <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">Trackbacks</a> [<$MTEntryTrackbackCount$>]
<!-- トラックバック・非ポップアップ用 -->
<!-- トラックバック・ポップアップ用 -->
| <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">Trackbacks</a> [<$MTEntryTrackbackCount$>]
<-- トラックバック・ポップアップ用 -->
</MTEntryIfAllowPings>
4.2 2004年12月30日以前にテンプレートを取得された場合
赤色部分を青色部分の内容に修正してください。よく分からない場合は青色のリストを丸ごとコピーして赤色のリストと入れ替えてやってください。
<MTEntryIfAllowComments>
| <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments (<$MTEntryCommentCount$>)</a>
</MTEntryIfAllowComments>
<MTEntryIfAllowPings>
| <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">Trackbacks (<$MTEntryTrackbackCount$>)</a>
</MTEntryIfAllowPings>
<MTEntryIfAllowComments>
| <a href="<$MTCGIPath$><$MTCommentScript$>?entry_id=<$MTEntryID$>" onclick="OpenComments(this.href); return false">Comments (<$MTEntryCommentCount$>)</a>
</MTEntryIfAllowComments>
<MTEntryIfAllowPings>
| <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">Trackbacks (<$MTEntryTrackbackCount$>)</a>
</MTEntryIfAllowPings>
各リストの
<MTEntryIfAllowComments>~</MTEntryIfAllowComments>
で括られた部分がコメント、
<MTEntryIfAllowPings>~</MTEntryIfAllowPings>
で括られた部分がトラックバックに該当します。
5.各アーカイブテンプレート変更(その2:JavaScript追加)(2004.12.30以前にテンプレート取得された場合)
ポップアップを利用したいテンプレートの <head> ? </head> の間(</head> の直前がいいです)に下記のスクリプトを追加します。先のリンクがクリックされるとこの JavaScript が起動し、ポップアップ画面を表示します。width(画面の幅) および height(画面の高さ) は任意の値を指定できます。OpenComments はコメントポップアップ用、OpenTrackback はトラックバックポップアップ用です。
<script language="javascript" type="text/javascript">
<!--
// コメント・リスト用
function OpenComments (c) {
window.open(c, 'comments', 'width=480,height=480,scrollbars=yes,status=yes');
}
// トラックバック・リスト用
function OpenTrackback (c) {
window.open(c, 'trackback', 'width=480,height=480,scrollbars=yes,status=yes');
}
//-->
</script>
6.スタイルシート修正(2004.12.30以前にテンプレート取得された場合)
スタイルシートに下記の青色部分を追加または修正してください(現状のスタイルシートはポップアップ用の設定を行っていましたが、見直したところ一部不具合がありましたので、その修正です)。なお現在ご使用のタイプが固定/可変で設定内容が若干異なりますのでご注意ください。また設定内容はデフォルト状態のものですので、デザインにあわせて適宜修正してくださって結構です。
可変3カラム/固定3カラム共通
/* ポップアップウインドウのタイトル部分 */
#banner-commentspop {
z-index: 1;
color:#999999;
background:#ffffe0;
background-position:right top;
background-repeat:repeat-y;
background-repeat:no-repeat;
background-image: url("画像を置くURl/ファイル名.gif");
padding-left:10px;
padding-top:10px;
padding-bottom:10px;
text-align: left;
border: 1px solid #666699;
}
#banner-commentspop h1 {
color: #999999;
font-family: "MSゴシック", Arial, sans-serif;
font-weight: normal;
font-size: 32px;
}
固定3カラムご使用の場合は上記の設定の直前にさらに下記を追加
#box-commentspop {
width: auto;
border-bottom: 1px solid #666699;
border-left: 1px solid #666699;
border-right: 1px solid #666699;
background-color: #FFFFFF;
}
| その1:基本動作 |
| その2:カスタマイズ |
| その3:公開テンプレート修正方法 |
| その4:コメントフォームのカスタマイズ |
| その5:その4の補足 |
2004.12.30 追記
2項のパッチ表示が誤っておりました。本日10:05に修正致しましたので、それ以前に本画面より直接コピーされた方は差し替えくださいますようお願い致します。またコメント・プレビュー/コメント・エラーでサイン・インしても問題ないことを確認しましたので記述を削除しました。
2004.12.31 追記
投稿後に日本語全角の名前が文字化けする問題が解消されていなかったため3項を追加しました。それに伴い以降の項番をシフトしました。
コメント投稿者の情報表示をカスタマイズする
コメント投稿者の情報表示のカスタマイズについてご説明致します。
表示に使用される変数タグは MTCommentAuthorLink / MTCommentPreviewAuthorLink の2種類で、表示方法の詳細設定にタグアトリビュート(属性)を用います。これによりコメントに入力されたコメント投稿者の情報(URL・メールアドレス等)の表示・非表示やを表示方法等をコントロールすることができます。
カスタマイズ方法です。まず MTCommentAuthorLink / MTCommentPreviewAuthorLink は、下記の各テンプレートの赤色部分に存在します(デフォルトテンプレートで示しています)。カスタマイズされる場合はこれらが一律対象となります。
個別エントリーアーカイブ
<MTComments>
<div id="c<$MTCommentID$>">
<$MTCommentBody$>
</div>
<p class="posted">投稿者 <$MTCommentAuthorLink default_name="Anonymous" spam_protect="1"$> <MTCommentAuthorIdentity> : <$MTCommentDate$></p>
</MTComments>
コメント・プレビュー
<$MTCommentPreviewBody$>
<p class="posted">投稿者 <$MTCommentPreviewAuthorLink spam_protect="1"$> : <$MTCommentPreviewDate$></p>
:
<MTComments>
<$MTCommentBody$>
<p class="posted">投稿者 <$MTCommentAuthorLink default_name="Anonymous" spam_protect="1"$> : <$MTCommentDate$></p>
</MTComments>
コメント・リスト(本テンプレートを使用している場合)
<MTComments>
<$MTCommentBody$>
<p class="posted">投稿者 <$MTCommentAuthorLink default_name="Anonymous" spam_protect="1"$> : <$MTCommentDate$></p>
</MTComments>
次にタグアトリビュート一覧を示します。
名前の入力がない場合のデフォルト名を設定する
default_name="Anonymous"
これは管理メニュー左の「ウェブログの設定」をクリック→次ページ右上の「設定」をクリック→次ページ下の方にある「コメント」の「名前とURLを必須にする」にチェックがついていない場合に有効になります。デフォルトテンプレートではこの属性が付与されていますが、先のチェックがついていれば気にする必要はありません。この属性の設定がなく「名前とURLを必須にする」チェックがついていない状態で名前なしのコメントが投稿されると、コメント欄に投稿者名が表示されません。
なお設定した場合(および無効にした場合)は以前の名無しコメント全てに適用されます。
メールアドレスにリンクしない
show_email="0"
コメントのメールアドレス欄にメールアドレスが入力されてもリンクしません。デフォルトテンプレートではリンクする状態になっています。
URLにリンクしない
show_url="0"
コメントのURL欄にURLが入力されてもリンクしません。デフォルトテンプレートではリンクする状態になっています。
URLをリダイレクトしない
no_redirect="1"
コメントスパムの目的は、リンクがクリックされることにより検索エンジンのランクを向上させることです。この部分でURLをリダイレクトする意味は、コメント投稿者のURLを検索エンジンから直接見えないようにするためです。そうすることでコメント・スパムの検索エンジンでのランク向上を抑制する効果があります。
デフォルト状態ではこのリダイレクト機能を有効にしていますが、リダイレクトを使いたくない場合は上記の設定を追加してください。
メールアドレスをスパム・ボット対策されたアドレスに変更する
spam_protect="1"
スパマーはHTMLソースに記述されるメールアドレスのフォーマットを見つけてスパムメールを送ります。
spam_protect アトリビュートを設定すればメールアドレスのリンクは表示されますが、スパム・ボット対策されたアドレスに変更されます。つまりブラウザ上では正しいメールアドレスとして表示され、実際のHTMLソースには「@」や「.」を含みません。例えばメールアドレスが
- foo@bar.com
であれば、HTMLでは
- foo@bar.com
となります。
デフォルトテンプレートではこの設定になっていますが、先の show_email="0" を指定した場合はメールアドレスにリンクしなくなるため冗長な設定となります。ただし設定が残っていても問題はありません。
下記に設定例を示します。最もポピュラーと思われるケースで「メールアドレスをリンクしない&メールアドレスをスパム・ボット対策されたアドレスに変更する」の設定は、
<$MTCommentAuthorLink show_email="0" spam_protect="1"$>
または
<$MTCommentPreviewAuthorLink show_email="0" spam_protect="1"$>
となります。
属性を記述する場合はその前後に半角空白を挿入します(変数タグの終了を示す"$"との間はなくても大丈夫です)。属性の記述順序に制約はありません。
ユーザー・マニュアルのテンプレート
利用方法は、本テンプレートを貼り付けたいテンプレートのサイドメニュー部分の任意の位置にコピー&ペーストしてください。メニュータイトルもセットになっています。公開テンプレートのスタイルシートをお使いの方は(多分)そのまま使えます。それ以外の方や変更されている方はクラス名等を適宜修正してください。また <$MTBlogURL$> の部分は docs の配置先によって適宜変更してください。
またサイドメニューの折りたたみおよび、サブカテゴリーの折りたたみもデフォルトで設定していますので、折りたたみを利用されている方は(これも多分)折りたたみ状態になります。折りたたみ用の id 属性名は「manual」にしています。折りたたみを利用されていない方も既に使用中の id 属性名と重複していないか確認してください。
ユーザー・マニュアル
各サブメニューはトップページと同じインデントにしています。トップページのサブカテゴリーに変更したい場合は赤色部分のコメントマークを全て削除してください。
:
<li><!--<div class="subcategories" id="subcategories100name">--><a href="<$MTBlogURL$>docs/mtmanual.html" target="_blank">トップ</a> <!--</div>-->
<!--<div id="subcategories100list">-->
<!--<ul>-->
<li><a href="<$MTBlogURL$>docs/mtmanual_about.html" target="_blank">Movable Type について</a></li>
:
<li><a href="<$MTBlogURL$>docs/mtmanual_configuration.html" target="_blank">mt.cfg 設定ガイド</a></li>
<!--</ul>-->
<!--</div>-->
:
2004.12.28 追記タグ内の id 属性が公開テンプレートにないものを指定していましたので修正しました。すいません。またパスの設定について補足を追記しました。
ポップアップ画面を用いたコメント投稿(その2:カスタマイズ)
今回はコメント・トラックバックのポップアップ化のカスタマイズ方法をご説明致します。
ここではデフォルトテンプレートにもとづいたカスタマイズ方法について記しています。当サイトの公開テンプレート用のポップアップ対応版につきましては本シリーズ次回のエントリーでお知らせする予定です。お待たせして申し訳ございませんがもう少々お待ちください。
以下カスタマイズ方法です。なおポップアップはコメントおよびトラックバックについて有無を選択できます。いずれか片方のみをポップアップにする場合は必要な箇所を適宜お読みになってください。
1.各アーカイブテンプレート変更(その1:リンク先変更)
ポップアップしたい各アーカイブテンプレート(メインページ/カテゴリー・アーカイブ/日付アーカイブ等)の個別エントリーアーカイブへのリンクを、ポップアップ画面へのリンクに変更します。
<MTEntryIfAllowComments>
| <a href="<$MTEntryPermalink archive_type="Individual"$>#comments">Comments (<$MTEntryCommentCount$>)</a>
</MTEntryIfAllowComments>
<MTEntryIfAllowPings>
| <a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">Trackbacks (<$MTEntryTrackbackCount$>)</a>
</MTEntryIfAllowPings>
<MTEntryIfAllowComments>
| <a href="<$MTCGIPath$><$MTCommentScript$>?entry_id=<$MTEntryID$>" onclick="OpenComments(this.href); return false">Comments (<$MTEntryCommentCount$>)</a>
</MTEntryIfAllowComments>
<MTEntryIfAllowPings>
| <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">Trackbacks (<$MTEntryTrackbackCount$>)</a>
</MTEntryIfAllowPings>
各リストの
<MTEntryIfAllowComments>~</MTEntryIfAllowComments>
で括られた部分がコメント、
<MTEntryIfAllowPings>~</MTEntryIfAllowPings>
で括られた部分がトラックバックに該当します。
2.各アーカイブテンプレート変更(その2:JavaScript追加)
ポップアップを利用したいテンプレートの <head> ? </head> の間(</head> の直前がいいです)に下記のスクリプトを追加します。先のリンクがクリックされるとこの JavaScript が起動し、ポップアップ画面を表示します。width(画面の幅) および height(画面の高さ) は任意の値を指定できます。OpenComments はコメントポップアップ用、OpenTrackback はトラックバックポップアップ用です。
<script language="javascript" type="text/javascript">
<!--
// コメント・リスト用
function OpenComments (c) {
window.open(c, 'comments', 'width=480,height=480,scrollbars=yes,status=yes');
}
// トラックバック・リスト用
function OpenTrackback (c) {
window.open(c, 'trackback', 'width=480,height=480,scrollbars=yes,status=yes');
}
//-->
</script>
3.コメント・リストテンプレート修正
コメント・リストがポップアップ画面であることを示す MTCommentFields フィールドタグの static 属性に "0" を追加します。コメント投稿後の画面をコメント・リストに誘導する場合はこの指定を行ってください。
<MTCommentFields static="0">
4.Context.pm修正(その1:static属性値取得用パッチ)
Ogawa::Memorandaさんの提供のパッチを
- lib/MT/Template/Context.pm
の1170行目辺りに設定します。赤色部分を削除して青色部分を追加してください(念のためバックアップを保存しておきましょう)。
my $allow_comment_html_note = (($blog->allow_comment_html)
? ($args->{html_ok_msg} ||
MT->translate("(You may use HTML tags for style)")) : "");
my $lang = ($cfg->DefaultLanguage eq 'ja') ? "&lang=ja" : '';
my $needs_email = $blog->require_comment_emails ? "&need_email=1" : "";
my $registration_required = ($blog->allow_reg_comments
&& !$blog->allow_unreg_comments);
my $registration_allowed = $blog->allow_reg_comments;
my $unregistered_allowed = $blog->allow_unreg_comments;
my $static_arg = $args->{static} ? "static=1" : "static=0";
my $static_field = ($args->{static} || !defined($args->{static}))
my ($static_arg, $static_field);
if (defined($args->{static})) {
$static_arg = $args->{static} ? "static=1" : "static=0";
$static_field = $args->{static}
? (q{<input type="hidden" name="static" value="1" />})
: (q{<input type="hidden" name="static" value="0" />});
} else {
$static_arg = $ctx->stash('comment_is_static') ? "static=1" : "static=0";
$static_field = $ctx->stash('comment_is_static')
? (q{<input type="hidden" name="static" value="1" />})
: (q{<input type="hidden" name="static" value="0" />});
}
my $typekey_version = $cfg->TypeKeyVersion;
このパッチはコメント・プレビュー/コメント・エラーテンプレートの MTCommentField タグに static属性が指定されていない場合、個別エントリーアーカイブまたは3項のコメントリストに設定した static 属性値を自動的に取得してくれるもので、投稿後の画面遷移がその1の通りになります。
5.Context.pm修正(その2:重複関数の修正)
MTCommentField タグを利用する場合、展開されるソースに getCookie 関数が含まれます。実はコメント用各テンプレートの「Remember Me」またはHTMLの head タグ内にも同じ関数が存在しており、同一名称の関数が重複する場合は後方に定義されたもの(つまり MTCommentField での getCookie)が有効になります。
これにより、ポップアップ画面で日本語のTypeKeyニックネームが文字化けする場合等は
- lib/MT/Template/Context.pm
の(3.121の場合は)1210行目あたりにある下記のスクリプトを、前方のスクリプトの内容をコピーして一致させる(多分赤色の1行が問題)か、
if ($registration_allowed || $unregistered_allowed) {
$javascript = <<JAVASCRIPT;
<script language="javascript">
function getCookie (name) {
var prefix = name + \'=\';
var c = document.cookie;
var nullstring = \'\';
var cookieStartIndex = c.indexOf(prefix);
if (cookieStartIndex == -1)
return nullstring;
var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
if (cookieEndIndex == -1)
cookieEndIndex = c.length;
return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}
</script>
JAVASCRIPT
}
青色部分を追加してコメントアウトしてください(if文もろとも削除しても良いでしょう)。
if ($registration_allowed || $unregistered_allowed) {
$javascript = <<JAVASCRIPT;
<script language="javascript">
//function getCookie (name) {
// var prefix = name + \'=\';
// var c = document.cookie;
// var nullstring = \'\';
// var cookieStartIndex = c.indexOf(prefix);
// if (cookieStartIndex == -1)
// return nullstring;
// var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
// if (cookieEndIndex == -1)
// cookieEndIndex = c.length;
// return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex));
//}
</script>
JAVASCRIPT
}
テンプレートモジュール「Remember Me」の有無は設定環境によって異なります。
以上です。例によって不具合等ございましたらご連絡ください。
2004.12.26 追記
MTCommentFiled を利用する場合、getCookie 関数による不具合が生じる可能性があるため、記述を追加しました。
2004.12.27 追記
Ogawa::Memorandaさんより提供くださったパッチの適用により、4項以降の記述を全面修正致しました。
2004.12.30 追記
4項のパッチ表示が誤っておりました。本日10:00頃に修正致しましたので、それ以前に本画面より直接コピーされた方は差し替えくださいますようお願い致します。
menufolder.js 3.01 リリース
折りたたみスクリプトの menufolder.js をマイナーバージョンアップしました。
今回の修正は MacIE 用の対処です。3.00での MacIE で折りたたみが正常に動作しない問題について修正致しました。MacIE をご使用の方は多くないかも知れませんが、折りたたみ可能なブラウザが拡大されますのでアップグレードされることをお勧めします。
なお今回の修正は TOY COZY MUSEUM:toycozy さんおよび、Mellout,inc.:mellout さんのご助言およびご協力によりリリースすることができました。この場をお借りしてお礼申し上げます。
アップグレードされる場合は下記のリンクでスクリプトのページ(あちこちにリンクを貼るとメンテナンスが大変なので新しく作りました)へジャンプし、そこからダウンロードしてください。
なお 3.00 のスクリプトから修正される場合は下記の変更を行ってください。
まず95行目あたりにある赤色部分の行を青色のものに入れ替えます。
for(var x = 0; x < list.length; x++) {
if (list[x] != name) {
newData.push(list[x]);
}
}
for(var x = 0; x < list.length; x++) {
if (list[x] != name) {
newData[newData.length] = list[x];
}
}
次にスクリプト冒頭に配している各設定データ(赤色部分)
//--------------------------------------------------------
// Configuration
//--------------------------------------------------------
// サイドメニュー用折りたたみマーク
var openMarkForSideBarMenu = '▽';
var closeMarkForSideBarMenu = '△';
:
(中略)
:
// サブカテゴリー用折りたたみマーク
var openMarkForSubCategories = '▽';
var closeMarkForSubCategories = '△';
//--------------------------------------------------------
をごっそり切り取り、下記の位置(切り取り前の行数で言うと172行と173行の間)に移動します。
:
:
function FoldNavigation(idName,initMode,viewNum) {
//--------------------------------------------------------
// Configuration
//--------------------------------------------------------
// サイドメニュー用折りたたみマーク
var openMarkForSideBarMenu = '▽';
var closeMarkForSideBarMenu = '△';
:
(中略)
:
// サブカテゴリー用折りたたみマーク
var openMarkForSubCategories = '▽';
var closeMarkForSubCategories = '△';
//--------------------------------------------------------
var openMark; // The mark for opening, when having closed
var closeMark; // The mark for closing, when open
var preMark; // The insertion position of a mark.
:
:
具体的な修正内容は下記の通りです。
- 現状のスクリプトで用いている push 関数が MacIE では期待する動作とならないため、push 関数による処理を配列の代入処理に変更。
- グローバル変数として設定している各設定値用の変数のスコープが正常に認識できないため、ローカル変数として配置するように変更。
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 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で非推奨あるいは廃止されているため)。
用語集追加
サイドバーメニューの「Introduction」に「用語集」を追加しました。とりあえずこのサイトで用いる用語の中から分かりづらいと思われるものを選んで書いてみましたが、このページはどんどん追加していきたいと考えておりますので、追加希望等がございましたらこちらのエントリーのコメントにご記入頂ければ幸いです。
用語集をカテゴリーとして独立させる手もありますが、それについては別途検討したいと思います。
このページとは別にブログの使い方を記したページを随分前から作っておりまして、そのページとペアで公開する予定でしたがまだ陽の目を見れそうにないので、アクセス頻度の高そうなこちらのページだけ先に公開することにしました。
ポップアップ画面を用いたコメント投稿(その1:基本動作)
ポップアップ画面を利用したコメント投稿の仕組みについてご説明致します(分かる範囲で)。このエントリーを投稿した段階ではテンプレートおよびカスタマイズ方法を公開しておりません。予めご了承ください。
最初に Movable Type ユーザー・マニュアルよりポップアップの定義を引用します。
アーカイブの1ページに2つ以上のエントリーを持つような種類のアーカイブを使う場合、コメントをインラインにするのはあまり意味がありません。 そのような場合のために、Movable Typeでは動的に生成されるコメント用ポップアップ・ウィンドウを利用できます
つまり、デフォルトテンプレートあるいはデフォルトの設定で再構築した状態ではメインページやカテゴリー・アーカイブページ・月別アーカイブページ等からのコメント投稿(あるいは参照)では個別エントリーアーカイブページにジャンプしますが、ページ遷移せずにコメント投稿(あるいは参照)できることがポップアップの目的と考えられます。トラックバックリスト表示も同様です。
次に図を用いてポップアップを利用したメインページからのページ遷移について示します。図および説明はデフォルトテンプレートおよびデフォルト設定を前提にしています。またポップアップを利用する場合でも個別エントリーアーカイブからのコメント投稿は有効という前提です。
通常のコメント投稿は、メインページや各アーカイブページからエントリー下に表示される時間のリンクをクリックすると、個別エントリーアーカイブ(図の左側)にジャンプします。そこでコメントを入力し「確認」をクリックすればコメント・プレビュー画面(図の左下)に遷移します。コメント・プレビュー画面で「投稿」をクリックするとコメントが反映された個別エントリーアーカイブにリダイレクトします。個別エントリーアーカイブで「投稿」をクリックすれば、同じようにコメントが反映された個別エントリーアーカイブにリダイレクトします。
ポップアップを利用したコメント投稿の場合、メインページや各アーカイブページのエントリー下にある"Comments"のリンクをクリックするとポップアップするように予め設定することを前提とします(設定方法は別途)。ポップアップしたコメント・リスト上でコメントを入力し、「確認」をクリックすればコメント・プレビュー画面(ポップアップ:図の右側)に遷移します。その画面で「投稿」をクリックするとコメントが反映されたコメント・リスト(図の右下)にリダイレクトします。コメント・リストで「投稿」をクリックすれば、同じようにコメントが反映されたコメント・リストにリダイレクトします。
![]() |
上記の動作を実現するためには、個別エントリーアーカイブからのリダイレクト先とポップアップ画面からのリダイレクト先をダイナミックに変更させる仕組みが必要になります。なぜなら「コメント・リスト」テンプレートはどちらも同じものが使われているためです。
当初このサイトではポップアップ画面を利用していたのですが、ポップアップ画面からの投稿後のリダイレクト先が図のような遷移にならずメインページになる、つまり狭いポップアップ画面に3カラムのページが表示されてしまうため途中からポップアップしない設定に変更しました。
当時は設定方法に問題があったためそうなっていました。今回はリダイレクト先の設定方法を含めてテンプレートおよびカスタマイズ方法を次回以降にご説明する予定です。
ポップアップ画面利用についてはひとつ制約があります。前述の通りコメント・プレビュー画面は個別エントリーアーカイブおよびコメント・リスト、いずれからの遷移においても同一のテンプレートを使用します。つまりポップアップの利便性を考慮すると、コメント・プレビュー画面は必然的に1カラムになります。ポップアップは画面サイズを任意に指定できますので情報量をコントロールする(例えばマルチカラム化等)ことも可能ですが、使用目的から考えると必要最低限の情報を表示することが好ましいでしょう。
検索画面テンプレート追加
検索画面テンプレートを下記のエントリーに追加しました。
検索画面テンプレートはサイドメニューの Search this site による検索結果を表示する際に用いられます。以前公開したものと機能的な差分はありませんが日本語表示に対応できるように変更しました(それを機能的な差分というのかも知れません)。下記は公開テンプレートに本テンプレートを適用した場合の検索結果表示イメージです。
また検索が実行された場合、管理画面(メインメニュー)右下にある「Movable Type のログの確認」をクリックすると
2004.12.17 15:23:56 192.168.0.111 Search: query for 'hogehoge'
という具合に表示されますので、簡単な検索文字列解析に使えます。
2004.12.21 追記
検索結果の右側に表示される Edit という編集画面へのリンクを削除したい場合は、下記の赤色部分を削除するか、
<div class="blogbody">
<h3 class="title"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
<p class="posted"><MT_TRANS phrase="Posted in "><$MTBlogName$><MT_TRANS phrase=" on "><$MTEntryDate$></p>
</div>
青色のコメントマークをつけてコメントアウトしてください。
<div class="blogbody">
<h3 class="title"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
<p><$MTEntryExcerpt$> <!--<$MTEntryEditLink$>--></p>
<p class="posted"><MT_TRANS phrase="Posted in "><$MTBlogName$><MT_TRANS phrase=" on "><$MTEntryDate$></p>
</div>
Movable Type ユーザー・マニュアルをサイドメニューに追加
メニューは、せっかくなのでトップページへのリンクだけでなく、サブメニューの中から頻度の高そうなものをピックアップして加えました。またテンプレート系のマニュアルは見る機会が多いので、さらにサブカテゴリー化("▽"マークで折りたたみ)して直接参照したい項目にジャンプできるようにしています。サブメニュー全体はトップのサブカテゴリーにするのが本来ですが、テキストの折り返しが煩わしいのでトップと同じレベルに配しました。 |
リストはサブカテゴリー表示を流用しています。ただし「id 属性は文書内で一意でなければならない」という制約があるため、サブカテゴリーリストの
<div id="categories">
が使えません。したがってサブカテゴリー表示用のスタイルシート categories の内容に別名の id 属性を付与して使用しています。
サブカテゴリーリストの折りたたみ
サイドメニューのサブカテゴリーリストの折りたたみカスタマイズをご紹介致します。
仕様
- サブカテゴリーが存在する親カテゴリーの右側に折りたたみマークを表示します
- 折りたたみマークは任意の文字を指定できます
- カテゴリーのエントリーの有無には依存しません
- 折りたたみ状態をcookieで保持します
- カテゴリー名が折り返されても(多分)大丈夫です。
また、サイドメニューのツリー化スクリプトとの併用が可能です。以下設定方法です。
なおV3.0にサブカテゴリー折りたたみ機能を盛り込み済ですので、サイドメニューの折りたたみを既にご利用くださっている方につきましては下記の1項および6項をスキップしてください。
1.menufolder.js ダウンロード
下記のリンクをクリックするとスクリプトのページへジャンプします。そこで menufolder.js をクリックし、同じファイル名でご自身のPCに保存してください。
ファイルは UTF-8 で作成していますのでブログと同じ文字コードに合わせてください(よく分からない方はそのままで結構です)。
2.menufolder.js 設定変更
menufolder.js をテキストエディタ等を用いて、下記の青色行の赤色部分を本リストの通り(折りたたみマークは任意)に変更してください。
// カテゴリーリスト数計算方法
// サブカテゴリーのカテゴリー数を適正に計数する
// サブカテゴリーに対応:true
// 従来のカテゴリーに対応:false
var subCategoryCount = true;
:
// サブカテゴリーフラグ
// サブカテゴリーの折りたたみを有効にする(テンプレート要設定)
// 有効にする:true
// 無効にする:false
var subCategory = true;
// サブカテゴリー用折りたたみマーク
var openMarkForSubCategories = '▽';
var closeMarkForSubCategories = '△';
設定内容の詳細は下記の通りです。
subCategoryCount
- 名称:カテゴリーリスト数計算方法
- 用途:カテゴリーリスト数計算方法を li タグ(サブカテゴリー表示)で計数するか、a タグ(従来の一括表示)で計数するかを指定します。
- 設定値: true:li タグで計数/false:a タグで計数
subCategory
- 名称:サブカテゴリーの折りたたみ有効フラグ
- 用途:サブカテゴリーの折りたたみの有効/無効を設定します。ここでは有効にします。
- 設定値: true:有効/false:無効
openMarkForSubCategories/closeMarkForSubCategories
- 名称:サブカテゴリーの折りたたみマーク
- 用途:サブカテゴリー名横に表示する折りたたみ用リンクのマーク
- 設定値:任意の文字(設定したマークを''で括るように)
3.menufolder.js 配置
menufolder.js の修正が終わったら保存し、ローカル・サイト・パスに配置してください。「配置」とはレンタルサーバの場合はFTPツール等によるアップロード、自宅サーバの場合は単なるコピーを示します。
4.カテゴリーリスト表示用タグ修正
折りたたみを利用する各テンプレートの、カテゴリーリストを表示するタグを変更します。上は3.1x用の公開テンプレートからの抜粋ですので、この赤色部分を下のリストの青色部分と入れ替えてください。
<div class="sidetitle">
Categories
</div>
<!-- 全カテゴリー用 -->
<div class="side">
<MTCategories>
<a href="<$MTCategoryArchiveLink$>">
<$MTCategoryLabel$></a> [<$MTCategoryCount$>]<br />
</MTCategories>
</div>
<!-- 全カテゴリー用 -->
<!-- サブカテゴリー用
<div class="side">
<div id="categories">
<MTSubCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>]
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories>
</div>
</div>
サブカテゴリー用 -->
<div class="sidetitle">
Categories
</div>
<!-- サブカテゴリー用 -->
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><MTHasParentCategory><div id="subcategories<MTParentCategory><$MTCategoryID$></MTParentCategory>list"></MTHasParentCategory><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>] <MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
<!-- サブカテゴリー用 -->
緑色は公開テンプレートからの変更または追加部分を示しています。また
<div class="side">
の部分に折りたたみ用の id 属性を設定されている場合は、現在の設定を反映させてください。
5.JavaScript起動用スクリプト設定
折りたたみを利用する各テンプレートに、menufoleder.js の FoldNavigation を起動するスクリプトを設定します。この設定方法には 起動スクリプトの自動生成と手動設定の2通りがあります。
menufolder.js を起動する単位は親カテゴリーです。つまり、折りたたむ親カテゴリーの増減が発生するとこの起動部分も増減、つまり変更の必要が生じます。自動生成ではMTタグを用いており、折りたたみが必要な親カテゴリーの id 属性を取得し、起動スクリプトを再構築時に自動生成ます。手動設定の場合は親カテゴリー分の起動スクリプトを文字通り手動で挿入します。
普通に考えれば前者しかありえませんが、自動生成では折りたたみの初期状態を「全て開く」または「全て閉じる」のいずれかのみしか選択できない、また子カテゴリーを持つ全ての親カテゴリーに折りたたみマークが付与されるのがデメリットです。手動設定は面倒な反面、初期状態を親カテゴリー別にきめ細かく設定できます。また折りたたむ親カテゴリーを任意に選択することができます。
という訳で自動生成を行う場合は5.1を、手動設定の場合は5.2の作業を行ってください。
5.1 自動生成の場合
折りたたみを利用する各テンプレートに下記のタグを、4項で設定したタグの直下に挿入します。
<script type="text/javascript">
<!--
<MTTopLevelCategories>
<MTHasSubCategories>FoldNavigation('subcategories<$MTCategoryID$>','off',false);</MTHasSubCategories><MTHasSubCategories></MTHasSubCategories>
<MTSubCatsRecurse>
</MTTopLevelCategories>
//-->
</script>
赤色部分は5.2(2)項の initState を参照して適宜変更してください。
5.2 手動設定の場合
(1)MTCategoryID取得
まず折りたたみマークが付与される各親カテゴリーのMTCategoryIDを取得(単なるメモ)します。繰り返しになりますが5.2項を選択された場合は、サブカテゴリーをもつ親カテゴリーが増減する度に修正が必要になります。
管理メニューの「カテゴリー」をクリックしてカテゴリー名をマウスオン(またはクリック)するとステータスバー(あるいはアドレス)に
- http://~/mt.cgi?__mode=view&_type=category&blog_id=1&id=n
が表示されます。このURLの最後の n がMTCategoryIDですので、カテゴリー名とMTCategoryIDの対応を(メモする等で)記録してください。
とりあえず5.1(1)をテンプレートに設定・再構築して、そのソースを取得して5.2(2)に反映させるという手もあります。
(2)JavaScript起動用スクリプト設定
折りたたみを利用する各テンプレートで、menufolder.js を起動するためのスクリプトを4項で設定したタグの直下に挿入します。まずはサンプルをご覧ください。
<script type="text/javascript">
<!--
FoldNavigation('subcategories18','on',false);
FoldNavigation('subcategories22','on',false);
FoldNavigation('subcategories24','on',false);
FoldNavigation('subcategories31','off',false);
//-->
</script>
青色は挿入部分、赤色は適宜修正します。それぞれのフォーマット、意味および設定値は下記の通りです。
FoldNavigation('idName','initState',viewListNumber);
idName
- 名称:id属性名
- 用途:折りたたむメニューのid属性を指定します。
- 設定値:このスクリプトの直前のメニューのid属性名("name"または"list"を除去した形)
initState
- 名称:初期状態
- 用途:ページを最初に表示した時の折りたたみ状態を指定します
- 設定値: on:開いた状態/off:閉じた状態
- 名称:リスト数表示
- 用途:メニュータイトル横にリスト数の表示・非表示を設定します
- 設定値: true:表示/false:非表示(本カスタマイズでは false 固定)
この例ではMTCategoryIDが18、22、24、31を折りたたむ親カテゴリーとして4行記述しています。18、22、24の3つは開いた状態、31は閉じた状態で表示されます。
折りたたむカテゴリー数は各サイトで異なりますので折りたたみが必要なカテゴリー数分を上記の例にならって記述し、5.2(1)で記録したMTCategoryIDは赤色部分に
- subcategories + MTCategoryID
という文字列で設定してください(「複数形になっている」とかいうツッコミはなし)。スクリプトはこの文字列「subcategories」を判別してサブカテゴリーの折りたたみ処理を実行していますのでお間違えのないように気をつけてください。
6.menufolder.js インクルード文挿入
折りたたみを利用する各テンプレートの <head>~</head> の間に下記のタグを追加してください。charset 属性は menufolder.js の文字コードを指定してください。
<script type="text/javascript" src="<$MTBlogURL$>menufolder.js" charset="utf-8"></script>
7.スタイルシート設定
スタイルシート(styles-site.css)に下記の位置(.side #categories li の下)に、折りたたみマーク装飾用のスタイル(青色部分)を追加してください。
.side #categories li {
margin-top: 0px;
margin-bottom: 0px;
list-style-type: circle;
.subcategories a.foldmark {
font-size:9px; /* マークのフォントサイズ */
text-decoration: none; /* マークの文字装飾(何も表示しない) */
}
設定はデザインに応じて適宜変更ください。
8.注意事項
・本カスタマイズを行う場合、他の折りたたみメニューで "subcategories" という id 属性は使用しないで下さい。
・カテゴリーリスト自体を折りたたむ場合、リスト数の計数を適正に行うためにカテゴリーリストの id 属性名を「category」にしてください。id 属性名を変更したい場合は、menufolder.js の下記の赤色部分を使用する id 属性名に修正してください。
if (subCategoryCount) {
if (idName == 'category') {
objItems = objLists.getElementsByTagName('li');
} else {
objItems = objLists.getElementsByTagName('a');
}
} else {
objItems = objLists.getElementsByTagName('a');
}
9.FAQ
Q:折りたたみマークが表示されません
A:menufolder.js 起動スクリプトの設定(5.2(2)項)が誤っている、6項が設定されていない、6項で設定したパスに menufolder.js がない、2項のサブカテゴリーフラグが true になっていない、ブログと menufolder.js の文字コードが一致していない等が考えられます。
Q:カテゴリーリストのリスト数が表示されているカテゴリー数と一致しません
A:2項の subCategoryCount および8項の2番目の内容を再度ご確認ください。
Q:折りたたみマークをクリックするとマークが変わってしまいます
A:テンプレート内のどこかで不要な menufolder.js をインクルードしています。私はこれで2日ほど悩みました(バカ)
Q:他のアーカイブページにジャンプすると折りたたみマークや表示位置が変わってしまいます
A:ジャンプしたアーカイブのテンプレートで誤った menufolder.js をインクルードしている可能性があります(これも私)。
2004.12.13 追記
カテゴリーリスト数表示の注意事項がもれてましたので、記事引用くださっている方は8項の記述も追加してやってください。また5.2(2)のリストに冗長な部分がありましたので削除致しました。
2005.03.31 追記
サイドメニューツリー化スクリプトへのリンクを文中に追加しました。
2006.04.04 追記
リストから language 属性を削除しました(HTML4.01/XHTMLで非推奨あるいは廃止されているため)。
Trackbackのタイムアウトについて
Magic White さんより当サイトへの「Trackbackがタイムアウトになる」というご連絡を頂きました。テストしたところ、(自PCからの送信で) Trackback処理が完了するまでに約100秒かかりました(かかり過ぎ…)。したがいましてタイムアウト値をそれ以下に設定されている場合はタイムアウトが発生する可能性があります。
タイムアウトになってもTrackback Pingを正常に受け付けた時点で送信先の処理は正常に行われるはずなのですが、今回頂いたご連絡では処理自体行われてませんでした。なお確認試験ではタイムアウトは発生したもののTrackback自体は受けつけられましたので、原因は不明のままです。
そういう訳で受け付けられない場合はこちらのエントリーまでご一報ください(何かできるという訳ではありませんが…)。とりあえずサーバは再起動致しました。
ShrinkFinfo Plugin 0.04公開
ShrinkFInfo Plugin で fileinfo.db サイズを表示するでサイズ表示を付与しましたが Ogawa::Memoranda さんよりファイルサイズ表示を盛り込んだ ShrinkFInfo Plugin 0.04 が公開されました。ファイルサイズ表示以外に、ウェルカム画面にもファイル縮小を促す表示(イメージ下)機能が追加されています。また表示する閾(しきい)値となるファイルサイズも適宜変更できるようになっています。デフォルトは1MBに設定されています。 ということで 0.04 へバージョンアップしました。 |
ShrinkFInfo Plugin で fileinfo.db サイズを表示する
2004.12.11 追記
本アイデアが盛り込まれた ShrinkFInfo Plugin 0.04 が公開されましたのでそちらを参照ください。
Movable Type を BerkeleyDB で利用する場合、再構築を繰り返す毎に db/fileinfo.db が肥大化する(その結果、再構築時間に影響が出ます)という問題があり、現在 fileinfo.db のサイズを縮小する ShrinkFInfo Plugin を利用させて頂いてます。
これは管理メニューに表示される "ShrinkFInfo Plugin, v?" のリンクをクリックすればサイズ縮小スクリプトが実行されるという仕組みになっていますが、クリック契機を簡単に知りたいと思い、画像のように fileinfo.db のサイズを表示するようにしてみました。Plugin 作成者のOgawa::Memorandaさんより快諾頂けましたので変更箇所をお知らせ致します。
ShrinkFInfo 配下の plugin.pl に青色部分を追加します。
use strict;
my $size;
$main::size = (-s '/path/db/fileinfo.db')/1000;
if (MT->can('add_plugin')) {
require MT::Plugin;
my $plugin = new MT::Plugin();
$plugin->name("ShrinkFInfo Plugin, v.0.03");
$plugin->description("Shrink enlarged db/fileinfo.db. Current size: $main::size Kbyte");
$plugin->doc_link("http://as-is.net/hacks/2004/11/mt_shrinkfinfo.html");
$plugin->config_link("mt-shrinkfinfo.cgi");
MT->add_plugin($plugin);
}
path の部分は db/fileinfo.db までのフルパスを適宜記述してください。
小数点以下を四捨五入して表示しない場合は下記のようにしてください。
$main::size = int(((-s '/path/db/fileinfo.db')/1000) + 0.5);
2004.12.10 追記
スクリプトを byte 表示から Kbyte 表示に修正しました。
2004.12.11 追記
小数点以下を四捨五入して表示しないパターンも追加しました(たびたびすいません…)。
Edit リンクを “Edit This” Bookmarklet に変更する
以前のカスタマイズで個別エントリーアーカイブの右下に「Edit」リンク、つまりエントリー編集画面へのリンクを設定していた(記事)のですが、
に乗り換えてみることにしました(これを投稿している時点ではまだ混在しています)。ありがとうございました。
動作的には、(IEの場合)個別アーカイブページやコメントプレビュー画面を表示している状態で、「お気に入り」に追加した"Edit This" を選択(または「リンク」に追加した "Edit This" をクリック)すると編集画面にジャンプすることができます。自力で Bookmarklet を作れない方も上記のリンクに Bookmarklet生成サービスを配してくださってますので面倒な作業は一切ありません。
ちなみにそこで設定する Blog ID はメインメニューのウェブログ名のURLの
- http:://?mt.cgi?__mode=menu&blog_id=1
の値を設定します。blog_id は管理メニューのURLの至るところに登場します(他に簡単に調べる方法ありましたらご容赦ください)。
サブカテゴリーと副カテゴリーでカテゴライズ
[旧カテゴリー]
![]() | サブカテゴリー機能を用いて、手始めに Movable Type 関連のエントリーをカテゴライズしました。 これまで Movable Type に関するエントリーについては使用中のバージョンに属する形で書いていたのですが、これを大幅に見直しました。文章で書くより左の新旧画像を見て頂ければお分かりになると思います。 例えばカテゴリーリストを用いて検索を行う場合、バージョンよりも機能や操作・概念等で分類した方が明らかに都合がいいです。テンプレートを公開している割に「テンプレート」というカテゴリーがないのも何なので独立したカテゴリーにしました。まだ全部ではありませんがカスタマイズについてはカテゴリーリストから視覚的に検索できるように分類してみました。時間をかけて他のエントリーについても適正なカテゴリーに配したいと考えてます。 訪問される方にとってはテンプレート等の一部のカテゴリーを除いて、バージョンがいくつであるかはたいした問題ではないのですが、個人的には日付アーカイブとは別にどのバージョンでどのような作業を行っていたかを記録したいと考えました。 この両者の要求を実現するにはエントリータイトルにバージョンを付与する等といった力任せの作戦もありますが、今回は「副カテゴリー」を用いることにしました。 |
[新カテゴリー]
![]() |
Movable Type ユーザー・マニュアル:カテゴリーに書かれている通り、各エントリーは、1つの主カテゴリーと1つ以上の副カテゴリーに割り当てることができます。主カテゴリーと副カテゴリーの間に優劣はなく、アーカイブリンクに主カテゴリーが便宜上用いられます。この機能を用いることで異なるカテゴリーに同一エントリーを配することができます。
副カテゴリーの設定方法は、図のようにエントリー編集画面の「主カテゴリー」の下に
- 複数のカテゴリーを設定する
というリンクをクリックします。クリックすると副カテゴリー設定画面がポップアップします。左の「ウェブログのカテゴリー」から新たに加えたいカテゴリーを選択し、>> ボタンで右の「副カテゴリー」に移動させ「保存」をクリックします。保存後、さらにエントリー編集画面の「保存」をクリックすれば作業完了です。
ということで、これまでのバージョン別のカテゴリーもそのまま残すことにしました。このカテゴリーには今までと同じエントリーが含まれています。が作業をやっている途中で気がついたので、一部該当カテゴリーから削除されているものもあります(バカ)。予めご了承ください。
Movable Type 3.121-ja アップグレード
3.11-ja から 3.121-ja にアップグレードしました。
ここでの内容は自宅サーバ用のアップグレード手順です。基本的な手順は3.11-jaアップグレードと同様です。文章も激しく同じです。
1.ダウンロード
Six Apart.よりアップグレード用のパッケージ(ダウンロード画面直前でフルインストールかアップグレードかを決めます)をダウンロードし、解凍します。
2.アップグレード前処理
解凍した中の下記のディレクトリをそれぞれ対応するディレクトリに、ファイルをローカル・サイト・パスにコピーします。大半が上書きされます(mt-upgrade31.cgi は環境によって配置先が異なります)。なお赤字のものはコピー対象外にしました(配下のファイルを変更または追加しており元の情報が上書きされてしまうため)。
- docs/
- extlib/
- images/
- lib/
- php/
- plugins/
- schemas/
- search_templates/
- tmpl/
- tools/
- mt.js
- styles.css
- mt-upgrade31.cgi
他にごちゃごちゃある .cgi ファイル等はコピーする必要はありません。plugins はプラグインを何も加えていない場合、また search_templates は配下のファイルを変更していなければコピーに加えてください。上書きにならないファイルは、
- mt-upgrade31.cgi
のみです。なお正規のアップグレード手順は docs 配下の mtupgrade.html に記載されています。ちなみにここには「extlibディレクトリ内のファイルをアップロードするときは、以前Movable Typeをインストールしたときにインストールしたライブラリをどれも上書きしないよう注意してください。」と書かれてますが、今回も思いきり上書きしてしまいました。
3.アップグレード実行
ブラウザより
- http://Blog-URL/mt-upgrade31.cgi
を実行します。
パソコンがガリガリとしばらく動作して、成功すれば下記の画面が表示されます(前回と表示内容が違ってました)。
4.不要ファイル削除
mt-upgrade31.cgiを削除します。
5.再構築
各アーカイブページを再構築します。これで各ページのバージョン表示が更新されます。
6.編集画面の拡張
直接アップグレードとは関係ありませんが、テンプレート編集画面やエントリー投稿画面のテキストエリアが狭く感じるので個人的に毎回広げてます。テンプレート編集画面は縦および横幅、エントリー入力画面は縦幅を修正しました。各ファイルの修正行は
- /tmpl/cms/edit_template.tmpl:128行
- /tmpl/cms/edit_entry.tmpl:200行
です。修正方法は上記のエントリーを参照ください。
以上です。
Movable Type 3.121の提供を開始
Movable Type 3.11のマイナーバージョンアップ版の3.121が提供されました。更新履歴はこちらです。個人的には
- MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう不具合を修正した。(ogawa)
がポイント大きいです。日本語化も進んでいるみたいですが コメント・プレビュー画面の"HTLM" は修正されていませんでした。
なおMagic WhiteさんのMovable Type 3.121になりました。より、公開中の3.11用テンプレートでの動作は問題ないことが確認されています(早々のご連絡ありがとうございました)。ただしアップグレードではカテゴリーの構成が崩れてしまうようですので予めカテゴリー構成のバックアップをとる等の対処が必要みたいです。ご注意ください。
ダウンロードして試しに新規インストールしてみました。日本語化された mt-check.cgi、mt-load.cgi は下記の通りです。

Movable Type ユーザー・マニュアル、いつもトップページURLの後ろに "docs" と打ち込んでジャンプしていたのですが、だんだん面倒になってきたのでサイドバーのメニューとして追加してみました。今のところ

