Movable Type 4 の再構築で「Can't call method "id" on unblessed reference」が発生する問題について
Tag:[MovableType, MTEntriesWithSubCategories, MTTopLevelCategories, TroubleShooting]
Movable Type 4 の月別カテゴリーアーカイブの再構築時に、次のようなエラーが発生する場合があります。
これは、「『新着エントリーの New マークを親カテゴリーに表示する』で再構築エラーになります」というご質問を頂いたのが発端です。
以下、本エントリーにて解消方法を展開します。なおこの問題は、バージョン 4.23 で確認しています。
1.問題
切り分けを行なったところ、月別カテゴリーアーカイブが再構築エラーになるのは、MTTopLevelCategories タグと MTEntriesWithSubCategories タグを次のように組み合わせた場合のようです。
<MTTopLevelCategories>
<MTEntriesWithSubCategories>
</MTEntriesWithSubCategories>
</MTTopLevelCategories>
MTSubCatsRecurse タグの有無は関係ありません。
2.解決策
とりあえず、MTEntriesWithSubCategories タグの振る舞いに問題がありそうなので、MTEntriesWithSubCategories タグの代わりに、MTEntries タグを使い、さらに category モディファイアとinclude_subcategories モディファイアを組み合わせます。
「新着エントリーの New マークを親カテゴリーに表示する」のサブテンプレートを例に、修正内容を示します。
変更前
<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$>] <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</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$>] <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
ピンポイントで抜き出すと以下のようになります。
変更前
<MTEntriesWithSubCategories lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntriesWithSubCategories>
変更後
<MTCategoryLabel setvar="cat">
<MTEntries category="$cat" include_subcategories="1" lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntries>
変更後のサブテンプレートですが、まず、MTCategoryLabel タグに setvar モディファイアを与えて、変数 cat に処理中のカテゴリー名を設定します。
その後、MTEntries タグの category モディファイアに変数 cat を与えることで、処理中のカテゴリだけを対象にします。
さらに include_subcategories モディファイアに 1 を与えることで、category モディファイアで指定したカテゴリー配下のサブカテゴリーも処理対象にします。
- MovableTypeプラグインの独自CGIをNginxに対応させる方法
- Movable Type 5で「Got an error: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)」というエラーになる場合の対処
- 旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法
- MT6.2のファイルアップロードで「Undefined subroutine &POSIX::strftime」になる問題の対処
- Movable Typeのファイルアップロードで「アップロードしたファイルは大きすぎます。」というエラーになる場合の対処
- Movable Typeのパスワード変更で「URLが不正です。」というエラーなる件についての対処
- Movable Typeで「Cannot find column 'blogs' for class 'MT::Blog'」となる場合の対処
- Movable TypeでMTPageNextタグが効かなくなる不具合について
- Movable Typeの復元で「Request-URI Too Large」になるときの対処
- サーバ故障と「Connection error: Too many connections」エラーおよびMySQLテーブル破損について
- Movable Typeでエラー発生箇所を特定する方法
- IE9でMovable Typeを利用する方法
- MTIfタグにtagモディファイアを利用する場合の注意事項
- Movable Type 5のブログの設定で「Can't call method &quot;label&quot; on unblessed reference」が発生する問題について
- Movable Type 5.03へのアップグレードで再構築時に「Script Error」が発生する件について(つづき)