印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType 長年日記のコードを修正

長年日記のためのテンプレートのコードを修正する。

■ ■ ■

先日,日別アーカイブを「長年日記」風にした(nlog(n): Movable Type で長年日記)。管理画面から再構築すると気がつかないのだが,mt-rebuild で再構築するとエラーが表示されることが分かった。次のようなメッセージが山ほど出るのである。

Error output from PerlScript tag: Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Use of uninitialized value in concatenation (.) or string at (eval 5893) line 14.
Error output from PerlScript tag: Use of uninitialized value in concatenation (.) or string at (eval 116970) line 14.

初期化されていない変数が使われているという,PerlScript プラグインのエラーである。テンプレートのコードを次のように修正したところ,エラーが出なくなった。

<div class="date"><a href="<$MTArchiveLink$>" title="<$MTArchiveDate$>"><$MTArchiveDate format="%B %e"$></a></div>
<MTTagInvoke tag_name="MTSetVar" name="thisday">
<MTTagAttribute name="value"><$MTArchiveDate format="%m%d"$></MTTagAttribute>
</MTTagInvoke>
<MTTagInvoke tag_name="MTSetVar" name="thisdate">
<MTTagAttribute name="value"><$MTArchiveDate format="%Y%m%d"$></MTTagAttribute>
</MTTagInvoke>
<MTArchiveList>
<MTEntries>
<MTPerlScript>
  $a = '<$MTGetVar name="thisday"$>';
  $b = '<$MTArchiveDate format="%m%d"$>';
  $aa = '<$MTGetVar name="thisdate"$>';
  $bb = '<$MTArchiveDate format="%Y%m%d"$>';
  $blogbodystyle = $aa eq $bb ? ' thisyear' : '';
  if ($a eq $b) {
    print <<'HERE_DOCUMENT';
<MTDateHeader>
<div class="date">
<a href="<$MTEntryPermalink archive_type="Daily"$>" title="<$MTEntryDate format="format="%a %Y"$>"><$MTEntryDate format="%a %Y"$></a>
</div>
</MTDateHeader>
<div id="a<$MTEntryID pad="1"$>" class="title">
<a href="<$MTEntryLink$>" title="<$MTEntryTitle$>"><$MTEntryTitle$></a>
</div>
HERE_DOCUMENT
    print qq|<div class="blogbody$blogbodystyle">|;
    print <<'HERE_DOCUMENT';

<$MTEntryBody$>
... (追記,Permalink,コメント,トラックバックなどの記述をそのまま)
</div>
HERE_DOCUMENT
  }
</MTPerlScript>
</MTEntries>
</MTArchiveList>

ポイントは,ヒア・ドキュメントの変数展開を抑止したことである。修正前は「print <<HERE_DOCUMENT;」となっており,この指定ではヒア・ドキュメント内のPerl の変数が展開される。展開しないようにするには,「print <<'HERE_DOCUMENT';」としてシングルクォートで囲めばよい。変数展開をさせたい部分が1か所あるので,そこだけを「print qq|<div class="blogbody$blogbodystyle">|;」とした。

エラーの原因は,PerlScript プラグインが Movable Type のテンプレートタグを変数として解釈していたらしいということが分かる。例えば,ヒア・ドキュメント内のテンプレートタグ「<$MTEntryBody$>」の「$」から始まる文字列を Perl の変数「$MTEntryBody」と「$>」として解釈していたということである。確かにどちらも Perl の変数として定義していないものである。

しかし,これは結構不思議なことである。「$b = '<$MTArchiveDate format="%m%d"$>';」が上手く動作しているので,Perl 変数の評価よりもテンプレートタグが先に展開されていると考えられる。一方で,ヒア・ドキュメント内のテンプレートタグは後に展開されていることになる。上手くできている。

Posted by n at 2006-08-08 22:45 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?