May 31, 2004

Movable Type 3.0DEのバグフィックス

ここで書いている内容はすでにobsoleteです。Movable Type 3.0 Developer Edition日本語版では、すでにここに記載しているほぼすべての問題が解決しています。2004.07.15記。

このエントリでは、Movable Type 3.0の以下のバージョンに関する既知のバグについてまとめています。また、可能な限りその修正方法についても付記するようにしています。

  • Movable Type 3.0 Developer Edition(英語版)
  • Movable Type 3.0 Developer Edition(日本語版ベータ)
  • Movable Type 3.0 Limited Free Version(英語版)

なお、6月8日までこのエントリでバグ修正を行うためのdefault-templates.plを配布しておりましたが、これはMovableType 3.0の配布に含まれる特定のファイルを改変して(つまり派生物を)再配布していると判断されかねません。したがってこの方法での公開は取りやめ、差分パッチパッケージで改めて公開することにしました。パッチパッケージはOgawa::Buzz: Movable Type 3.0DE修正パッチ(パッケージ配布)から取得できるようになっています。また、このパッチパッケージによって修正されるテンプレートの一覧に関しては、Ogawa::Buzz: Movable Type 3.0DE修正パッチ(テンプレート一覧)で公開しています。内容が重複してしまいますので、このエントリの修正テンプレート一覧は削除してありますのでご了承ください。

このエントリは、Ogawa::Buzz: Movable Type 3.0 DE release 個人的修正の内容を皆様のご意見を参考に更新したものです。皆様のご協力に感謝いたします。引き続き、「こんな問題がある」「ここに解決方法が載ってる」などの情報をお持ちでしたら遠慮なくコメント欄にお書き込みください。
2004年6月8日以前にこのエントリからdefault-templates.zipをダウンロードしてくださった皆様、Comment Listing Templateに誤りがありました。Ogawa::Buzz: Movable Type 3.0DE修正パッチ(テンプレート一覧)を参照して修正していただく必要があります。Comment Listing Templateはコメントポップアップ画面の生成に使われるテンプレートでMT3では通常は使用されません。しかし、Main IndexなどのテンプレートをMT2.Xから引き継いでいてコメントポップアップ機能を使っている場合に使用されます。

以下では、今のところ私が把握してバグとその修正方法について述べます。

TIPS:
このエントリのURLに「#BUGXX」(XXはバグ情報を指す二桁の数字)を付記すると、このエントリ内の特定のバグ情報をポイントできます。
例: http://blog.as-is.net/2004/05/movable-type-30de.html#BUG08
  1. lib/MT/L10N/ja.pmのtypo。日本語版ベータでは修正済みです。

    詳しくはMT-3.0D の英語版をつかうときの注意 ;-) [dh's memoranda]参照。

  2. tmpl/cms/cfg_prefs.tmplのtypo。312行目あたり。

    <p><MT_TRANS phrase="To enable comment registration, enter your TypeKey
     site token."> <MT_TRANS phrase="To sign up for a TypeKey token,
     visit the "><a href="http://www.typekey.com/t/typekey/">TypeKey</a>
     <MT_TRANS phrase="website">.</p>
    
  3. 日本語版ベータのTypo。lib/MT/App/Comments.pmの693行目あたり。コメントしようとすると「An error occurred: Global symbol "$cookie" requires explicit package name at lib/MT/App/Comments.pm line 693. Compilation failed in require at mt-comments.cgi line 21.」と怒られるはずです。

        if ($cookies && $cookies->{commenter_name} &&
            $cookies->{commenter_name}->value()) {
    
  4. JavaScriptのsetCookieのバグ。Individual Entry Archiveのテンプレートとコメント関係の動的テンプレート(Comment Previewなど)にこのバグが含まれています。

    function setCookie (name, value, expires, path, domain, secure) {
        var curCookie = name + "=" + escape(value) + 
                      (expires ? "; expires=" + expires.toGMTString() : "") +
                      (path ? "; path=" + path : "") + 
                      (domain ? "; domain=" + domain : "") + 
                      (secure ? "secure" : "");
        document.cookie = curCookie;
    }
    
  5. TypeKeyでニックネームに日本語などを使用すると文字化けします。これはクッキーに格納されているニックネームを取り出すのにJavascriptのunescapeメソッドを使用しているためです。一般的に非ASCII文字はUTF-8に変換した後URIエンコーディングした状態でクッキーに格納されることになっています。これを正しくデコードするにはunescapeメソッドの代わりにdecodeURIComponentメソッドを使う必要があります。同様にescapeメソッドの代わりにencodeURIComponentメソッドを使うことを強く薦めます。

    詳しくはOgawa::Buzz: Movable Type 3.0のCookie参照。

  6. コメント関係の動的テンプレートで使われているMTCommentFieldsタグが生成するHTMLは、コメントの中身(本文、Author、Email、URL)を出力してくれません。MTCommentFieldsの仕様が変更される可能性はありますが、このままだとすれば、JavaScriptなどで出力を補ってやる必要があります。

    詳しくはOgawa::Buzz: Movable Type 3.0のMTCommentFields tag参照。

  7. MTCommentFieldsタグが生成するHTMLはAuthor、Email、URLをクッキーに保存・クッキーから削除するために(onclick, onsubmitイベント経由で)rememberMe, forgetMeメソッドを呼び出します。しかし、これらのメソッドが定義本体が存在しないために正常に動作しません。Individual Entry Archiveと同様にメソッドの定義を追加する必要があります。

  8. MTCommentFieldsタグが生成するHTMLコードには誤りがあるような気がします。Individual Entry Archiveでは「Remember me?」ラジオボタンの「Yes」を選択するだけでクッキーに保存されますが、Comment Previewなどでは「Yes」を選択した状態で「Preview」ないし「Post」をクリックすると保存されます。MT 2.Xの時には後者に統一されていたのですが…。

    前者の動作に統一するのなら、lib/MT/Template/Context.pmの1126行目と1196行目を以下の通り修正する必要があります。後者に動作を合わせるのならIndividual Entry Archiveのテンプレートを修正することで済みますが、前者の方が好ましい動作ではないかと個人的には考えています。

    <input type="radio" id="remember" name="bakecookie"
        onclick="rememberMe(this.form)" />
    <label for="bakecookie">
    <label for="remember"><MT_TRANS phrase="Yes"></label>
    <input type="radio" id="forget" name="bakecookie" onclick="forgetMe(this.form)"
        value="Forget Info" style="margin-left: 15px;" />
    <label for="forget"><MT_TRANS phrase="No"></label>
    <br style="clear: both;" /></p>
    
  9. Microsoft Internet Explorerでしばしば観測される「TypeKeyにサインインしてもサインインできない(?)」問題。問題の詳細と私がベータサイトで述べた解決策(案)をtugaaさんがまとめてくださっています。また、「TypeKeyでサインインしたら直前コメントした人の名前が表示された(?)」問題も同じ理由で生じているのではないかと思われます。

    簡単に書くと以下のようにIndividual Entry Archiveのテンプレートを書き換える(ちなみに二箇所あります)と期待した動作をします。

    <script type="text/javascript" src="<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js"></script>
    <script type="text/javascript"><!--
    var commenter_name = getCookie("commenter_name");
    //--></script>
    

    この修正はテンプレートに対する修正で済みますが、修正方法が場当たり的ですし、本質的にはソースコードの改変によって解決すべき問題ではないかと思います

  10. QuickPostのAllow Comments(コメントを受け入れる)の設定値が読み込まれません。ここは本来checkboxではなくselection listになっているべきです。tmpl/cms/bm_entry.tmplの160行目あたりを以下のように修正することで正常に機能します(HTMLのタグの対応が取れていない点も含めて修正しています)。

    <p>
    <TMPL_IF NAME=SHOW_ALLOW_COMMENTS>
    <label><input type="checkbox" name="allow_comments" value="1" /><MT_TRANS phrase="Allow Comments"></label><br />
    <p>
    <label for="allow_comments"><MT_TRANS phrase="Allow Comments"></label><br />
    <select name="allow_comments" id="allow_comments">
    <option value="0"<TMPL_IF NAME=ALLOW_COMMENTS_0> selected</TMPL_IF>><MT_TRANS phrase="None"></option>
    <option value="1"<TMPL_IF NAME=ALLOW_COMMENTS_1> selected</TMPL_IF>><MT_TRANS phrase="Open"></option>
    <option value="2"<TMPL_IF NAME=ALLOW_COMMENTS_2> selected</TMPL_IF>><MT_TRANS phrase="Closed"></option>
    </select>
    </p>
    <TMPL_ELSE>
    <input type="hidden" name="allow_comments" value="0" />
    </TMPL_IF>
    
    <TMPL_IF NAME=SHOW_ALLOW_PINGS>
    <p>
    <label><input type="checkbox" name="allow_pings" value="1" /><MT_TRANS phrase="Allow TrackBack Pings"></label><br />
    </p>
    <TMPL_ELSE>
    <input type="hidden" name="allow_pings" value="0" />
    </TMPL_IF>
    </p>
    
  11. Bookmarkletにはそもそも長さ制限があるため、QuickPostが動かない場合があります。lib/MT/App/CMS.pmの380行目近辺の_bm_jsの定義を読むと「scrollbars=yes」が無駄に二回指定されています。これを削るだけで15文字余裕ができる計算になり、すべてのオプションを付けた場合でも「http://.../mt.cgi」が35文字以内であれば動作するようです。

    sub _bm_js {
        my($uri, $show, $height) = @_;
        qq!javascript:d=document;w=window;t='';if(d.selection){t=d.selection.createRange().text}else%20if(d.getSelection){t=d.getSelection()}else%20if(w.getSelection){t=w.getSelection();}void(w.open('$uri?is_bm=1&bm_show=$show&__mode=view&_type=entry&link_title='+escape(d.title)+'&link_href='+escape(d.location.href)+'&text='+escape(t),'_blank','scrollbars=yes,width=400,height=$height,status=yes,resizable=yes,scrollbars=yes'))!;
    }
    

    さらに細かい話をすれば、Apache httpdサーバを使用している多くの場合、mt.cfgで以下のように設定しておけば「mt.cgi」の「.cgi」は省略できます。つまり、最悪でもCGIPathが33文字以内に収まれば問題ないことになります。現実的にはすべてのオプションを付けることは稀でしょうが、長めのURLにならざるを得ない場合にはご参考になさってください。

    AdminScript mt
    
  12. Windowsの右クリックメニューにQuickPostを追加しても正しく機能しません。この機能を使うためには、lib/MT/App/CMS.pmの4324行あたりのreg_bm_jsを以下のように変更する必要があります。
    sub reg_bm_js {
        my $app = shift;
        my $q = $app->{query};
        my $js = _bm_js($app->base . $app->uri, scalar $q->param('bm_show'),
                        scalar $q->param('bm_height'));
        $js =~ s!d=document!d=external.menuArguments.document!;
        $js =~ s!d\.location\.href!external.menuArguments.location.href!;
        $js =~ s!^javascript:!!;
        $js =~ s!\%20! !g;
        $app->{no_print_body} = 1;
        $app->send_http_header('text/plain');
        $app->print('<script language="javascript">' . $js . '</script>');
        1;
    }
    
  13. コメンター情報としてURLを入力した場合、MTCommentAuthorLinkは通常そのURLへのリダイレクトページ(http://.../mt-comments.cgi?__mode=red;id=XXX)へのリンクを生成します。ちなみにMTCommentAuthorLinkにno_direct="1"というオプションを付けた場合には直接リンクになるため、以下で述べる問題は生じません。

    このリダイレクトページの生成に問題がある場合があります。具体的にはリダイレクトページは以下のようになっています。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html><head><title>Redirecting...</title>
    <meta name="robots" content="noindex, nofollow">
    <script type="text/javascript">
    window.onload = function() { document.location = document.links[0].href; };
    </script></head>
    <body>
    <p><a href="http://...">Click here</a> if you are not redirected</p>
    </body>
    </html>
    

    このページは、ページ内に存在する最初のリンクにリダイレクトします。通常は「<a href="http://...">Click here</a>」がその該当リンクとなりますが、一部の広告リンクなどを自動的に挿入するサイトではこのリンクの前に広告リンクが挿入され、リダイレクトはそのページに対して行われることになります。これは期待した動作ではないでしょう。

    この問題を解決するには、lib/MT/App/Comments.pmの97行目あたりを以下のように修正する必要があります。また、この修正を行っても広告が挿入されないサイトも通常通り動作します。

    window.onload = function()
    { document.location = document.links[0].href'$uri'; };
    

    参考: Question Board [Past Log]

  14. MySQLを使っている場合に、Draftとして保存したエントリがMonthly Archive Listing(↓)のMTArchiveCountに数え上げられてしまいます。

    <ul>
    <MTArchiveList archive_type="Monthly">
    <li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> (<$MTArchiveCount$>)</li>
    </MTArchiveList>
    </ul>
    

    正確にはDaily、WeeklyなどのすべてのDate-based Archiveに対するMTArchiveCountが誤った値になるという現象が起きます。ちなみにarchive_type="Category"とした場合やMySQLではなく既定のBerkeleyDBを使っている場合には、正しくPublishしたエントリだけが数え上げられます。

    参考: movabletype.org : Support Forum

関連リンク

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com