Movable Type 3.11 日本語版・修正案
このエントリでは、Movable Type 3.11 日本語版の修正案と未解決の問題点をリストアップしていきます。
今のところ、以下の点に気が付いています。他にも気が付いた問題点やその解決法があったらコメントやトラックバックしていただけると幸いです。
ユーザーインタフェース関連の問題
- 管理画面の左上のロゴのリンク先がAdminScriptの指定に関わらず、mt.cgiに固定されている。
- 管理画面のMovable Typeニュースのリンクが「http:///?v=3.11-ja」となる(CHOU-FLEURさんからTrackbackいただきました)。
スタティック・ページ(Perl)関連の問題
- MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう。
- mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。
ダイナミック・パブリッシング(PHP)関連の問題
- コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても有効にならない。
- CGIPathの末尾に「/」がない場合、MTRemoteSignInLink、MTRemoteSignOutLinkが不正なものになる。
- MTIncludeを使ってファイルをインクルードする場合、フルパスを指定する必要がある。
- MTArchiveLinkでarchive_typeオプションが無視される
- MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す
- MTCalendarIfTodayが機能しない。
- コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。
- 日付アーカイブでMTEntryCategoryが不正なものになる。
- 「改行を変換する」がエントリやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。
仕様・振る舞いの改善に関する提案
- 前々から気が付いてはいたが、dirifyの振る舞いが日本語環境に適していない。
- 子カテゴリーにエントリーを追加しても親カテゴリーアーカイブが再構築されない。親カテゴリーにエントリーが一個もないと親カテゴリーアーカイブが生成されない。
以下はそれぞれの問題の説明と(可能であれば)修正方法を述べます。
ユーザーインタフェース関連の問題
管理画面の左上のロゴのリンク先がAdminScriptの指定に関わらず、mt.cgiに固定されている
これは本家のバグトラックシステムで何度か指摘していますが、直してもらえない問題の一つです。lib/MT/App.pmのsub mt_uriがリンク先のURLを生成していますが、「mt.cgi」という名前がhard-codedされています。そのため、mt.cgiの名前を変更すると、mt.cfgでAdminScriptにそのファイル名を指定してあっても、管理画面の左上のロゴのリンク先がmt.cgiのままになります。
以下のように修正すれば、AdminScriptで指定した名前が使われます。
--- lib/MT/App.pm.bak 2004-10-13 18:00:46.000000000 +0900
+++ lib/MT/App.pm 2004-10-20 18:20:30.977192296 +0900
@@ -543,7 +543,7 @@
sub uri { $_[0]->path . $_[0]->script }
-sub mt_uri { $_[0]->path . 'mt.cgi' }
+sub mt_uri { $_[0]->path . MT::ConfigMgr->instance->AdminScript }
# mt_uri refers to mt's script even if we're in a plugin.
sub path_info {
管理画面のMovable Typeニュースのリンクが「http:///?v=3.11-ja」となる
CHOU-FLEUR-DESIGN BLOG : MT3.11のバグ?で解決方法が示されています。
スタティック・ページ(Perl)関連の問題
以下ではスタティック・ページに限らず、Movable TypeのPerlモジュールが引き起こす問題について述べます。
MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう
静的に生成されるアーカイブにおいて、MTCategoryCountをMTSubCategoriesの中で用いると、「公開」状態でない「下書き」、「指定日」のエントリーも含めた値を返してしまいます。以下のように修正することで公開状態のエントリーのみの個数を正しく返すようになります。
--- lib/MT/Template/Context.pm.bak 2004-10-18 14:50:43.000000000 +0900
+++ lib/MT/Template/Context.pm 2004-10-24 13:12:40.075911264 +0900
@@ -2284,8 +2284,11 @@
'<$MTCategoryCount$>' ));
my($count);
unless ($count = $ctx->stash('category_count')) {
- require MT::Placement;
- $count = MT::Placement->count({ category_id => $cat->id });
+ my @args = ({ blog_id => $ctx->stash ('blog_id'),
+ status => MT::Entry::RELEASE() },
+ { 'join' => [ 'MT::Placement', 'entry_id',
+ { category_id => $cat->id } ] });
+ $count = scalar MT::Entry->count(@args);
}
$count;
}
mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。
コメント・プレビュー画面などmt-comments.cgiが生成するページでMTIfAllowCommentHTMLがコメントの設定に関わらず常に真になります。コメント・プレビュー、コメント・エラーなどのテンプレートでMTCommentFieldsタグを使っている場合には顕在化しません。
以下の修正を行うとこの不具合が直ります。
--- lib/MT/App/Comments.pm.bak 2004-10-19 17:36:02.000000000 +0900
+++ lib/MT/App/Comments.pm 2004-11-24 18:43:21.756357136 +0900
@@ -924,7 +924,8 @@
}
require MT::Blog;
my $blog = MT::Blog->load($entry->blog_id);
- my %cond = (IfRegistrationRequired => !$blog->allow_unreg_comments,
+ my %cond = (IfAllowCommentHTML => $blog->allow_comment_html,
+ IfRegistrationRequired => !$blog->allow_unreg_comments,
IfCommentsAllowed => $blog->allow_reg_comments
|| $blog->allow_unreg_comments,
IfNeedEmail => $blog->require_comment_emails);
ダイナミック・パブリッシング(PHP)関連の問題
以下ではダイナミック・パブリッシング時に発生する問題を述べています。機能の不具合やスタティック・ページとの動作の(不適切な)相違を取り上げています。
コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても有効にならない
コメントの設定で「TypeKeyからメールアドレスを取得する」にチェックを入れても、ダイナミック・パブリッシング時にはRemoteSignInLinkの生成するTypeKeyサインイン用のURLに「&need_email=1」が追加されません。このため、「TypeKeyからメールアドレスを取得する」ことができません。
以下のように修正するとよいでしょう。
--- php/lib/function.MTRemoteSignInLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignInLink.php 2004-10-20 18:25:29.976737456 +0900
@@ -25,7 +25,7 @@
($args['static'] ? 'static=1' : 'static=0') .
'%26entry_id=' . $entry['entry_id'];
return $ctx->mt->config['SignOnURL'] .
- ((isset($blog['require_comment_emails']) && $blog['require_comment_emails']) ? '&need_email=1' : '') .
+ ((isset($blog['blog_require_comment_emails']) && $blog['blog_require_comment_emails']) ? '&need_email=1' : '') .
'&t=' . $token .
'&v=' . $ctx->mt->config['TypeKeyVersion'] .
'&_return=' . $return;
CGIPathの末尾に「/」がない場合、MTRemoteSignInLink、MTRemoteSignOutLinkが不正なものになる
mt.cfgで設定しているCGIPathの末尾に「/」がない場合、ほとんどのMTタグでは「/」を補って処理してくれます。しかし、例外的にダイナミック・パブリッシング時のMTRemoteSignInLinkとMTRemoteSignOutLinkでは補ってくれません。以下のように修正するとよいでしょう。
--- php/lib/function.MTRemoteSignInLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignInLink.php 2004-10-24 00:47:48.954994344 +0900
@@ -20,7 +20,11 @@
}
}
$entry = $ctx->stash('entry');
- $return = $ctx->mt->config['CGIPath'] . $ctx->mt->config['CommentScript'] .
+ $path = $ctx->mt->config['CGIPath'];
+ if (!preg_match('!/$!', $path)) {
+ $path .= '/';
+ }
+ $return = $path . $ctx->mt->config['CommentScript'] .
'%3f__mode=handle_sign_in%26' .
($args['static'] ? 'static=1' : 'static=0') .
'%26entry_id=' . $entry['entry_id'];
--- php/lib/function.MTRemoteSignOutLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTRemoteSignOutLink.php 2004-10-24 00:47:47.094277216 +0900
@@ -3,7 +3,11 @@
// status: complete
// parameters: none
$entry = $ctx->stash('entry');
- return $ctx->mt->config['CGIPath'] . $ctx->mt->config['CommentScript'] .
+ $path = $ctx->mt->config['CGIPath'];
+ if (!preg_match('!/$!', $path)) {
+ $path .= '/';
+ }
+ return $path . $ctx->mt->config['CommentScript'] .
'?__mode=handle_sign_in&' .
($args['static'] ? 'static=1' : 'static=0') .
'&entry_id=' . $entry['entry_id'] . '&logout=1';
MTIncludeを使ってファイルをインクルードする場合、フルパスを指定する必要がある
テンプレートの中で<$MTInclude file="filename"$>のように書いていたとします。
スタティック・ページの場合、(1) 絶対パスで指定されたfilename、(2) ローカル・サイト・パス/filename、(3) ローカル・アーカイブ・パス/filename、の順に探して最初に見つかったものをインクルードします。一方、ダイナミック・パブリッシングの場合には(1)しか探しません。したがって、(2)や(3)のファイルがインクルードされることを期待してもうまくいきません。
以下のように変更すると、ダイナミック・パブリッシング時にまず(1)を探し、なければ(2)を探すようになります。ダイナミック・パブリッシングでは現状ローカル・アーカイブ・パスの情報を内部的に保持していないので、スタティック・ページとまったく同じ機能にすることはできません。おそらくその必要もないでしょう。
--- php/lib/function.MTInclude.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTInclude.php 2004-10-22 16:30:38.303009000 +0900
@@ -25,7 +25,18 @@
$contents = @file($file);
$tmpl = implode('', $contents);
} else {
- return $ctx->error("Could not open file '$file'");
+ $blog = $ctx->stash('blog');
+ $path = $blog['blog_site_path'];
+ if (!preg_match('!/$!', $path))
+ $path .= '/';
+ $path .= $file;
+ if (is_file($path) && is_readable($path)) {
+ $contents = @file($path);
+ $tmpl = implode('', $contents);
+ }
+ else {
+ return $ctx->error("Could not open file '$file'");
+ }
}
if ($ctx->_compile_source('evaluated template', $tmpl, $_var_compiled)) {
$_include_cache['file:'.$file] = $_var_compiled;
MTArchiveLinkでarchive_typeオプションが無視される
スタティック・ページでは、MTArchiveLinkは、archive_typeオプションがあればその指定に従ったアーカイブのURL、なければカレントコンテキストのarchive_typeに従ったアーカイブのURLを生成します。一方、ダイナミック・パブリッシングでは、archive_typeオプションが無視され、カレントコンテキストのarchive_typeに従ったアーカイブのURLしか生成されません。
以下のように修正することで正常に動作するようになります。
--- php/lib/function.MTArchiveLink.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTArchiveLink.php 2004-11-02 21:35:17.260184600 +0900
@@ -6,7 +6,7 @@
}
$blog = $ctx->stash('blog');
- $at = $ctx->stash('current_archive_type');
+ $at = isset($args['archive_type']) ? $args['archive_type'] : $ctx->stash('current_archive_type');
$ts = $ctx->stash('current_timestamp');
if ($at == 'Monthly') {
$ts = substr($ts, 0, 6) . '01000000';
MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す
(1) archive_typeオプションにIndividual, Category以外が指定されている場合、または (2) archive_typeオプションを設定せず、かつアーカイブの設定の「優先するアーカイブのタイプ」でIndividual、Category以外を選択している場合にMTEntryLink、MTEntryPermaLinkが誤ったURLを返す可能性があります。php/lib/mtdb_base.phpのentry_linkという関数がまともに実装されていないのが原因です。
以下のように変更すれば、期待される動作になります。
--- php/lib/mtdb_base.php.bak 2004-10-12 18:57:57.000000000 +0900
+++ php/lib/mtdb_base.php 2004-11-03 06:06:32.474843144 +0900
@@ -177,9 +177,23 @@
and templatemap_archive_type='Category'
and templatemap_is_preferred = 1";
} else {
+ $entry = $this->fetch_entry($eid);
+ $ts = $entry['entry_created_on'];
+ if ($at == 'Monthly') {
+ $ts = substr($ts, 0, 6) . '01000000';
+ } elseif ($at == 'Daily') {
+ $ts = substr($ts, 0, 8) . '000000';
+ } elseif ($at == 'Weekly') {
+ require_once("MTUtil.php");
+ list($ws, $we) = start_end_week($ts);
+ $ts = $ws;
+ } elseif ($at == 'Yearly') {
+ $ts = substr($ts, 0, 4) . '0101000000';
+ }
$sql = "select fileinfo_url, fileinfo_blog_id
from mt_fileinfo, mt_templatemap
where fileinfo_templatemap_id = templatemap_id
+ and fileinfo_startdate = '$ts'
and templatemap_archive_type='".$this->escape($at)."'
and templatemap_is_preferred = 1";
}
MTCalendarIfTodayが機能しない
ダイナミック・パブリッシング時に、MTCalendar内で使用できるはずのMTCalendarIfTodayが正常に機能しません。また、カレンダーのパディング部分(MTCalendarIfBlankがTrueになる)で必ずMTIfCalendarTodayがTrueになるという現象が起きます。
以下のように修正するとよいでしょう。
--- php/lib/block.MTCalendar.php.bak 2004-09-22 15:40:54.000000000 +0900
+++ php/lib/block.MTCalendar.php 2004-11-02 15:30:13.888003304 +0900
@@ -49,6 +49,7 @@
$ctx->stash('cal_pad_end', $pad_end);
$ctx->stash('cal_days_in_month', $days_in_month);
$ctx->stash('cal_prefix', $prefix);
+ $ctx->stash('cal_today', $today);
} else {
# subseqent iterations:
$prefix = $ctx->stash('cal_prefix');
@@ -58,6 +59,7 @@
$days_in_month = $ctx->stash('cal_days_in_month');
$iter = $ctx->stash('cal_entries');
$left = $ctx->stash('cal_left');
+ $today = $ctx->stash('cal_today');
}
$left or $left = array();
if ($day <= $pad_start + $days_in_month + $pad_end) {
コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。
コメントの設定で「URLを自動的にリンクにする」にチェックを入れても、ダイナミック・パブリッシング時にはMTCommentBodyの生成するコメント本体に含まれるURLをリンクに変換してくれません。
以下のように修正するとよいでしょう。
--- php/lib/function.MTCommentBody.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTCommentBody.php 2004-11-20 23:34:04.530682576 +0900
@@ -4,6 +4,12 @@
$text = $comment['comment_text'];
$blog = $ctx->stash('blog');
+ if (!$blog['blog_allow_comment_html']) {
+ $text = strip_tags($text);
+ if ($blog['blog_autolink_urls']) {
+ $text = preg_replace('!(http://\S+)!', '<a href="$1">$1</a>', $text);
+ }
+ }
$cb = $blog['blog_convert_paras_comments'];
if ($cb == '1' || $cb == '__default__') {
$cb = 'convert_breaks';
日付アーカイブでMTEntryCategoryが不正なものになる。
日付アーカイブでMTEntryCategoryタグ(エントリのプライマリカテゴリーの名前を返す)を使用すると、すべてのエントリのカテゴリーが同一のものになるという不具合があります。典型的にはテンプレートに以下のように書いていると不具合が確認できます。
<a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a>
修正方法を見つけていません。が、上記のような記述の代わりに下記のように記述すれば問題を回避できます。当然のことですが、この場合はエントリーに付与されているプライマリカテゴリー以外のカテゴリーも列挙されますから、上記とまったく同じ出力結果が得られるわけではありません。
<MTEntryCategories glue=", "> <a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a> </MTEntryCategories>
「改行を変換する」がエントリやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。
以下をエントリ本文に保存したとします。
<dl> <dt>DDBJ</dt> <dd>DNA Data Bank of Japan</dd> </dl>
スタティック・ページではこのまま表示されますが、ダイナミック・パブリッシング時には以下のようにマークアップされるため余分な改行が入ります。
<p><dl><br /> <dt>DDBJ</dt><br /> <dd>DNA Data Bank of Japan</dd><br /> </dl></p>
以下の修正でスタティック・ページと同様のマークアップがなされるようになります。
--- php/lib/MTUtil.php.bak 2004-10-13 14:27:46.000000000 +0900
+++ php/lib/MTUtil.php 2004-11-29 11:41:25.099006392 +0900
@@ -513,7 +513,7 @@
return '';
}
foreach ($paras as $k => $p) {
- if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
+ if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
$p = preg_replace('/\r?\n/', "<br />\n", $p);
$p = "<p>$p</p>";
$paras[$k] = $p;
仕様・振る舞いの改善に関する提案
前々から気が付いてはいたが、dirifyの振る舞いが日本語環境に適していない。
dirifyについて考えてみた。に分離して書きました。
子カテゴリーにエントリーを追加しても親カテゴリーアーカイブが再構築されない。親カテゴリーにエントリーが一個もないと親カテゴリーアーカイブが生成されない。
サブカテゴリー機能について考えてみた。に分離して書きました。
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/192
相変わらずのSix Apart Japanよりも素早い対応さすがです。
(O)さんのパッチを待って入れようかなと思っていたりもするんですが、新し物好きなもんでアップグレードしたくてウズウズしてます。唯一の抑えが「失敗したら面倒だな」という点だけですW。
パッチは作るかどうか分かりません、よー。
新し物好きならアップグレードしちゃってください。
こんにちは。遊びに来ました(笑)。
修正案ですが:
エントリがひとつもないカテゴリを作り、そのサブカテゴリにエントリを複数記載する。例えば child の下に goods、toys というのを作り、child に含まれるエントリはなし、goods と toys にはそれぞれエントリを作る。こうすると、現在は category archive のテンプレートを使って child 以下のみをリストして表示することはムリ(child の index ページが作られない)だと思うのですが…いかがでしょ?
おー!確かに作られませんね。
MTEntriesの代わりにMTEntriesWithSubCategoriesを使っても駄目です。
いいネタ、ありがとうございます。時間ができたら追っかけてみます。
てーわけでちょっと調べてみたところ、あるサブカテゴリーのrebuildをするときに一緒に上位に向かって順にrebuildをかけるのは割と容易にできました。これでV.J.Catkickさんのrequirementは満たせるのかな?
でもこれは仕様のような気もするので、このエントリで公開するか別エントリで公開するか思案中です。
カテゴリがらみでもうひとつ。
サイドバーに階層化カテゴリを再帰で表示する時、top レベルのみ padding を 0 にするっていうのが欲しいですね。
現状では ul タグに padding 15px とかセットされているので、トップレベルだろうがサブカテゴリだろうが 15px インデントしてくれます。サイドバーを左にそろえている時に、ツライチにならなくて気分悪い(笑)です。サンプルはコチラ。
www.vjcatkick.com/spt/
ul, ul ul, ul ul ulにそれぞれpaddingを設定するのではいけないんでしょうか。
>それぞれpadding
やはり、ソレですか…。CSS ファイルが乱雑になりそうで…と思ったんですが、これが最も簡単な解決方法ですよね(汗)。
こんにちは。
バグなのか、仕様なのか判断に難しいところですが…またカテゴリがらみで見つけちゃいました。
・日本語版はカテゴリ名に日本語が使える。
とのことでしたので、これを最大限に活用しようと思い、次のようなカテゴリを作りました。
★★★★★ ←これがカテゴリ名
★★★★☆ ←これがカテゴリ名
例によってこちらのサイトをご覧下さい。
http://www.vjcatkick.com/spt/
そです。レイティング別に並べるってヤツですね。コイツを
<$MTArchiveCategory dirify="1"$>
これを使ってアーカイブにすると…。
全部 aaaaaa.php に展開されちゃいます。ある意味当たり前なんだろうけど…。
ワークアラウンドとして、カテゴリ名は '2 stars' とか '1 star' とかやっているんですが、なんかちょっとヘンな気分です。
一応、ご報告までと。
「★★★★★」はdirifyで空文字列に変換されるはずです。したがって、既定ではカテゴリーアーカイブのディレクトリの名前はcat1, cat2, ...のようになります。「aaaaa」という文字列に変換されているのは、ほぼ間違いなくDefaultLanguageをja以外に設定、もしくは未設定にしているためです。
Hitori-gotoかきのNoelです。
Trackbackの件ではお騒がせしました。
そしていろいろありがとうございます。
これからも、記事を参考にさせていただきたいと思っています。
よろしくお願いしますね。
>DefaultLanguageをja以外に設定
なるほど、そういうことでしたか…(汗)。お騒がせしました。
いつも勝手にお世話になっております(ぺこ
この度3.11Jaにアップグレードしましたので足を運ばせていただきました。
(何時もこっそりきてるやん!とか言わないように…)
無事に修正できました、感謝感激です。有り難う御座います。
Sibilliaさん、パッチ当てお疲れ様でした。
もう少し簡単にパッチ当てできるようにしたいところなのですが、少しずつ少しずつバグを見つけては直しているところなので…。お手数かけます。
確かにクリック1発で修正が可能なら簡単に多数の方が恩恵を受ける事が可能なのでしょうが
時間や手間を考えさせていただくと、今のままでも私には十分すぎます。
今後も参考にさせていただく事と思いますので、よろしくお願いいたします。