Movable Typeのテンプレートでphp化のときのXML宣言とSetVarテンプレートタグ群による出力結果の解決をメモしておきます。
MTのヘッダ部の出力問題
この問題は、既に解決されていたりするのですが、Movable Type 5の声が聞こえてからMovabe Typeに入られている方もいらっしゃると思いますので、ざーとおさらいしておきます。MT4から使われている方には聞いたような話なので軽く聞きながしていただけたらと思います。
簡単に説明しますと、Movable Typeのテンプレートタグのmt:setvarを使って変数を或るテンプレートの上部にまとめて定義したとします。その下にDOCTYPE宣言やXML宣言の記述があるときに、DOCTYPE宣言やXML宣言の上に連続改行が出力されてしまうという問題です。
この辺のお話は、すでにWolaWolaさまにて、言及がなされています。特に問題となっているのは、XML宣言の上に改行文字がある事により、InvalidなXHTMLとなる点かと思います。
- 参考 1.
解決方法として、一行書きにしたりするなどが提案されたわけですが、これをうけて、The blog of H.Fujimotoさまにて、ApplyModifierプラグインが提供され以上の問題の解決がおこなわれました。
その後、MT4.2以降(? 改修されたMTのヴァージョンの正確な記憶がありませんorz。違っているようでしたらコメントお願いします)において、ページ上部に、mtsetvar群を改行した状態で並べても連続改行が出力されないようになりました。
以上が、この問題についての経緯です。
PHPのコードが絡むと問題が解決されていなかった
とまあ、今更な話をしてきましたがここからが本題です。
PHPでEtagを出力するコードの記述位置を入れ替えたときのことです。このときにプチハマりました。
Etagとは?のかたは以下をどぞ。なお、MT4.2以降には、「条件付取得」の設定があるのですが、ダイナミック・パブリッシングでの話として理解してます。当記事で言っているのは、スタティック・パブリッシングでのPHPのページということです。
それで、これまでは以下のような記述をしていました。
<MTSetVar name="body_class" value="archiveIndex">
<MTSetVar name="foo" value="1">
<MTSetVar name="fugafuga" value="1">
<MTSetVar name="tempName" value="hogetempl">
<MTSetVarBlock name="page_title">Hoge Hoge</MTSetVarBlock>
<?php
...略... (ETag出力のコード)
header( 'ETag: ' . $etag );
?></MTApplyModifier><?php echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<$MTDefaultLanguage$>" xml:lang="<$MTDefaultLanguage$>">
...略...
PHPのheader()関数が出力の前にほかの出力があるとマズいそうなので、直すことにしたわけです。
- 参考 3.
これまでこの書き方でMTSetVarの部分は出力されていなかったのでこれといって問題なかったのですが、テンプレートの書き換えをこなったようなときに不備があった場合にエラーの原因となる可能性はあります。
そこで、以下のようにPHPコードを上に記述したわけです。
<?php
...略... (ETag出力のコード)
header( 'ETag: ' . $etag );
?>
<MTSetVar name="body_class" value="archiveIndex">
<MTSetVar name="foo" value="1">
<MTSetVar name="fugafuga" value="1">
<MTSetVar name="tempName" value="hogetempl">
<MTSetVarBlock name="page_title">Hoge Hoge</MTSetVarBlock>
<?php echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
これがどのような出力になるかといいますと、このような状態です。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
この状態はMovable Type4.261で確認しています。
仕方がないのでこの場合は、ApplyModifierプラグインをつかわせていただくことにしました。
タグ挿入の位置ですが、phpの終了コードと同じ行にApplyModifierの開始コードを、phpで出力するXML宣言の行のはじめにApplyModifierの終了コードをという具合です。具体的には以下のような感じに。
header( 'ETag: ' . $etag ); ?><MTApplyModifier ltrim="1"> ...MTSetVar 略...> </MTApplyModifier><?php echo...
メモのようなもの
補足として、上記現象が再現されるコードを置いておきます。*出力はPHPのファイルです。
<?php
// test
?>
<MTSetVar name="content_class" value="archiveIndex">
<MTSetVar name="foo" value="1">
<MTSetVar name="fugafuga" value="1">
<MTSetVar name="tmpl_name" value="hoge1">
<MTSetVarBlock name="page_title">Hoge Hoge</MTSetVarBlock>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<$MTDefaultLanguage$>" xml:lang="<$MTDefaultLanguage$>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<$MTPublishCharset$>" />
<title><$mt:var name="page_title"$></title>
</head>
<body><p>test template</p></body>
</html>
Movable Type5.0ベータ1、Movable Type5.0ベータ2でも再現されたことは確認しています。動作的には仕様っぽいのかも。。(現時点ではベータ版につき動作については参考情報程度ということで)