2009年4月28日

Movable Type 4.25 における MTEntries タグの category モディファイアの不具合について

April 28,2009 12:17 AM
Tag:[, ]
Permalink

キャッチアップが遅れましたが、Movable Type 4.25 で MTEntries タグに category モディファイアを利用している状態で、カテゴリー名に次の文字が含まれる場合、

  • 半角丸カッコ(の閉じカッコ):")"
  • 半角アンパサンド:"&"

再構築時に次のようなエラーが発生します。

再構築エラー

上記の事象については、すでに下記の記事で公開されています。

Movable Type 備忘録 - Movable Type 4.25 リリース

ここでは、半角丸カッコや半角アンパサンドをカテゴリー名に利用している場合の暫定対処案を示します。

2013/02/06追記:この問題はMT5.2.2以降のバージョンで解消されています。

1.半角丸カッコを利用している場合

とりあえず、カテゴリ名に含まれる全角丸カッコに変更します。例えば、「(X)HTML」というカテゴリー名は、「(X)HTML」に変更します。

変更前
カテゴリー名(変更前)

変更後
カテゴリー名(変更後)

次にテンプレートを変更します。category モディファイアにカテゴリー名を直接記述している場合は、単にその部分を書き換えます。

変更前

<mt:Entries category="(X)HTML">
...中略...
</mt:Entries>

変更後

<mt:Entries category="(X)HTML">
...中略...
</mt:Entries>

カテゴリ名を出力する時に、全角の丸カッコを半角の丸カッコに変更して出力したい場合は、次のように MTSetVar タグと MTCategory タグに regex_replace モディファイアを利用すると良いでしょう。

<mt:setvar name="foo" value="/(.*)((.*))(.*)/" />
<mt:categoryLabel regex_replace="$foo","$1($2)$3" />

カテゴリアーカイブウィジェットに適用する場合は、次の青色部分を追加します。

<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
    <h3 class="widget-header>カテゴリ</h3>
    <div class="widget-content">
    <mt:TopLevelCategories>
        <mt:SubCatIsFirst>
        <ul>
        </mt:SubCatIsFirst>
        <mt:If tag="CategoryCount">
            <li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><mt:setvar name="foo" value="/(.*)((.*))(.*)/" /><mt:categoryLabel regex_replace="$foo","$1($2)$3" /> (<$mt:CategoryCount$>)</a>
        <mt:Else>
            <li><$mt:CategoryLabel$>
        </mt:If>
        <$mt:SubCatsRecurse$>
            </li>
        <mt:SubCatIsLast>
        </ul>
        </mt:SubCatIsLast>
    </mt:TopLevelCategories>
    </div>
</div>
</mt:IfArchiveTypeEnabled>

適用前
カテゴリアーカイブ(適用前)

適用後
カテゴリアーカイブ(適用後)

2.半角アンパサンドを利用している場合

とりあえず、カテゴリ名に含まれる全角アンパサンドに変更します。例えば、「foo & bar」というカテゴリー名は、「foo & bar」に変更します。

変更前
カテゴリー名(変更前)

変更後
カテゴリー名(変更後)

次にテンプレートを変更します。category モディファイアにカテゴリー名を直接記述している場合は、単にその部分を書き換えます。

変更前

<mt:Entries category="foo & bar">
...中略...
</mt:Entries>

変更後

<mt:Entries category="foo & bar">
...中略...
</mt:Entries>

カテゴリ名を出力する時に、全角のアンパサンドを半角のアンパサンドに変更して出力したい場合は、先ほどと同様、MTSetVar タグと MTCategory タグに regex_replace モディファイアを利用します。

<mt:setvar name="foo" value="/(.*)&(.*)/" />
<mt:CategoryLabel regex_replace="$foo","$1&amp;$2" />

カテゴリアーカイブウィジェットに適用する場合は、次の青色部分を追加します。

<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
    <h3 class="widget-header>カテゴリ</h3>
    <div class="widget-content">
    <mt:TopLevelCategories>
        <mt:SubCatIsFirst>
        <ul>
        </mt:SubCatIsFirst>
        <mt:If tag="CategoryCount">
            <li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><mt:setvar name="foo" value="/(.*)&(.*)/" /><mt:CategoryLabel regex_replace="$foo","$1&amp;$2" /> (<$mt:CategoryCount$>)</a>
        <mt:Else>
            <li><$mt:CategoryLabel$>
        </mt:If>
        <$mt:SubCatsRecurse$>
            </li>
        <mt:SubCatIsLast>
        </ul>
        </mt:SubCatIsLast>
    </mt:TopLevelCategories>
    </div>
</div>
</mt:IfArchiveTypeEnabled>

適用前
カテゴリアーカイブ(適用前)

適用後
カテゴリアーカイブ(適用後)

なお、半角のアンパサンドは、出力時に実体参照しておかないと valid な(X)HTML文書にならないので注意しましょう。

2013.02.06
本文に解消バージョンを追記しました。

Comments [0] | Trackbacks [0]
2009年4月17日

Movable Type の再構築エラー(コンテキスト外での利用)を解析方法

当サイトへのコメント欄に、

再構築をすると、「日付アーカイブ「Monthly2009xxxxxxxxxx」の再構築中にエラーが発生しました: テンプレート「月別ブログ記事リスト」の再構築中にエラーが発生しました: <mtEntryXXXX>タグでエラーがありました: mtEntryXXXXをコンテキスト外で利用しようとしています。MTEntriesコンテナタグの外部で使っていませんか? 」というエラーが出るのですが、どうすればよいでしょうか?

という手の質問をときどき頂くので、このエントリーでまとめておきます。

1.コンテキストについて

多分、質問されてくる方の大半が「コンテキスト」の意味が分からないものと推測しています。

コンテキストとは人によって解釈が異なりますが、ここでは、「Movable Type のテンプレートの、ある場所における、特定の情報を扱える状態」と定義します。

簡単に言い換えると、MTEntries タグの中は、ブログ記事系のテンプレートタグが扱えるコンテキストになります。

<mt:Entries>
[ブログ記事用のテンプレートタグが扱えるコンテキスト]
</mt:Entries>

また、MTCategories タグの中は、カテゴリ系のテンプレートタグが扱えるコンテキストになります。

<mt:Categories>
[カテゴリ用のテンプレートタグが扱えるコンテキスト]
</mt:Categories>

また、テンプレートタグ内部だけでなく、例えばブログ記事テンプレートであれば、ブログ記事テンプレート内全体がブログ記事用のテンプレートタグが扱えるコンテキストになります。

2.再構築エラーの解析方法について

下記のような再構築エラーを例に解説します。

再構築エラー

Movable Type の再構築時のエラーメッセージは、先頭から順番にメッセージ内容を辿っていけば、原因が分かるようになっています。

まず、再構築でエラーが発生したページは、日付アーカイブ「Monthly20090401000000」ですが、「テンプレート「月別ブログ記事リスト」の再構築中にエラーが発生しました」とあるので、その元になるテンプレートが「月別ブログ記事リスト」であることが分かります。

次に、「<mtEntryDate>タグでエラーがありました」とあり、ここから「月別ブログ記事リスト」に記述された <mtEntryDate>タグが再構築エラーの原因であることが分かるので、テンプレート内に記述した、<mtEntryDate>タグを探してください。

エラーメッセージの最後に、「mtEntryDateをコンテキスト外で利用しようとしています。MTEntriesコンテナタグの外部で使っていませんか? 」とあります。<mtEntryDate>タグが使えるコンテキストは、

  • MTEntries タグ内
  • ブログ記事テンプレート

のいずれかなので、上記以外の場所で使われていることが再構築エラーの原因であることが分かります。

ちなみにこのエラーは、「月別ブログ記事リスト」の枠線で示した部分に、<mtEntryDate>タグを埋め込んだことが原因です。

月別ブログ記事リスト

3.エラーの解析のポイント

テンプレートモジュールやウィジェットを使っていると、エラーメッセージが長くなる場合がありますが、エラーメッセージの長さによらず、

  • 元のテンプレート(モジュールやウィジェットではなく、インデックステンプレートやアーカイブテンプレート)
  • エラーになっているテンプレートタグ(モジュールやウィジェットに記述されている場合もある)
  • エラー種別(コンテキスト外での利用など)

の3つをエラーメッセージから抽出できれば、大体解決できると思います。

1つめの「元のテンプレート」は、テンプレート種別によってコンテキストが異なるので、コンテキスト関連のエラーであれば解析するために重要な情報となります。

なお、2つめの新しいブログを作った直後は、ブログ記事がひとつも存在しないので、テンプレートタグの使い方に誤りがあっても、出力すべきページがないため、テンプレートタグが評価されず、再構築エラーは発生しません(多分)。

4.参考図書

コンテキストはテンプレートタグを扱う場合に重要な概念と思っているのですが、このことについて扱っている Movable Type 関連書籍は下記の2冊のみです(認識が間違っていたらすいません)。

Movable Type 4.2 パーフェクトガイドMovable Type 4.2 パーフェクトガイド
荒木 勇次郎

毎日コミュニケーションズ 2008-07-31
売り上げランキング : 1457

Amazonで詳しく見る
by G-Tools
Movable Type プロフェッショナル・スタイル MT4.1対応Movable Type プロフェッショナル・スタイル MT4.1対応
CSS Nite

毎日コミュニケーションズ 2008-04-08
売り上げランキング : 2676

Amazonで詳しく見る
by G-Tools

Movable Type 4.2 パーフェクトガイド」では、252~256ページで解説しています。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3