Movable Type 4 の PHP 化で XML 宣言を自動的に切り替える
PHP化を行う時にいつも面倒に思うのは、1行目の XML 宣言を PHP スクリプトに変更するか、削除しなければならいという手間が発生することです。
Movable Type 4 では MTIf タグで色々制御できるようになったので、PHP化、つまり拡張子を .html から .php に切り替えた時(あるいはその逆)に、XML 宣言を書き換えなくて良い MT タグ構成を考えてみました。
注:デフォルトテンプレートには XML 宣言は記述されていないので、XML 宣言を記述した状態を前提にしています。
1.カスタマイズ
テンプレートモジュールの「ヘッダー」の先頭に下記の青色部分を追加すればOKです。
注:分かりやすいように改行していますが、使用時は青色部分の改行・空白を削除して1行に丸めてください。
<MTIf name="entry_template">
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
<MTElse>
<MTIf name="main_index">
<MTSetVarBlock name="extension"><$MTIndexBasename extension="1"$></MTSetVarBlock>
<MTElse>
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
</MTIf>
</MTIf>
<MTIf name="system_template">
<MTSetVarBlock name="extension">html</MTSetVarBlock>
</MTIf>
<MTIf name="extension" like=".php"><?php echo('<?xml version="1.0" encoding="utf-8"?>'); ?><MTElse><?xml version="1.0" encoding="utf-8"?></MTIf>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
<head>
ウェブページにも対応させるのであれば、ウェブページテンプレートに
<MTSetVar name="page_template" value="1">
を追加して、ヘッダに下記の青色部分を追加すればOKです。
<MTIf name="entry_template">
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
<MTElse>
<MTIf name="main_index">
<MTSetVarBlock name="extension"><$MTIndexBasename extension="1"$></MTSetVarBlock>
<MTElse>
<MTIf name="page_index">
<MTSetVarBlock name="extension"><$MTPageBasename extension="1"$></MTSetVarBlock>
<MTElse>
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
</MTIf>
</MTIf>
</MTIf>
<MTIf name="system_template">
<MTSetVarBlock name="extension">html</MTSetVarBlock>
</MTIf>
<MTIf name="extension" like=".php"><?php echo('<?xml version="1.0" encoding="utf-8"?>'); ?><MTElse><?xml version="1.0" encoding="utf-8"?></MTIf>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
<head>
2.テンプレート修正
「追加部分を1行に丸めてください」と書きましたが、理由は、XML宣言が文書の1行目になければならないためです。
が現状のデフォルトテンプレート(XML宣言なし)では DOCTYPE 宣言が文書の1行目に表示されません(数行空きます)。
例えば、インデックスページではヘッダ情報を取得 MTInclude タグの前に MTSetVar タグが記述されており(下記赤色)、タグの末尾にある改行がそのままページに反映されてしまうためです。
<MTSetVar name="body_class" value="mt-main-index">
<MTSetVar name="main_template" value="1">
<MTSetVar name="main_index" value="1">
<MTSetVar name="sidebar" value="1">
<MTSetVar name="module_recent_entries" value="1">
<MTSetVar name="module_category_archives" value="1">
<MTSetVar name="module_author_archives" value="1">
<MTSetVar name="module_monthly_archives" value="1">
<$MTInclude module="ヘッダー"$>
かといって、MTSetVar を MTInclude の後に移動すると、ヘッダで MTIf を用いた判定処理ができなくなります。
ということで、先程と同様、これらも MTSetVar タグの改行を取り除き、MTInclude タグを含めて1行に丸めてください(視認性は落ちます)。他のアーカイブテンプレートも同様です。
3.注意事項
アーカイブインデックス(archievs.html/archives.php)の判断はできていません。インデックステンプレートの拡張子の判断には MTIndexBasename を用いていますが、これはメインページのファイル名しか取得されないためです。
4.その他
アーカイブの拡張子を php にすると、ウェブページは .html と .php の両方が選択できるようです。が、ウェブページ新規作成画面の出力ファイル名には php しか表示されません(フィードバック済)。
2007.09.18
リストに extension="1" を追加しました。
2007.10.28
システムテンプレートに対する考慮漏れを対処しました。
- Movable Type 4 の PHP化
- Movable Type 4 で PHP 化する時の注意事項
- Movable Type の PHP化(その2:.html のままPHPを有効にする)
- Movable Type の PHP化(その1)
≫ ページ先頭の改行を削除する from The blog of H.Fujimoto
Movable Type 4の各ページの先頭には改行が多数出力されますが、それを削除する方法を紹介します。 [続きを読む]
≫ 気になる文字列 from BCLラジオ/BCL RADIO.com
上部に並ぶこの文字列は一体なんだろうと思った。何だろうと思ったけど答えはすぐに見... [続きを読む]
≫ お詫びです:気になる文字列 part2 from BCL RADIO.com/BCLラジオ
昨年12月28日に、上部左に文字列があることを記事にしてしまったんだけど、どうや... [続きを読む]
こんにちは、yujiro さん。
なるほど、これは良いですね。
私はダイナミック・パブリッシング併用なので、MTIfDynamicで似たような切り替えを組み込んでます。
うまくマージ出来るかしら・・・
>oscarさん
こんにちは。
コメントありがとうございます。ヘッダ空行の件、参考になりました。
MTタグを組み合わせればいろいろプログラミングできそうですね。
今回の変更をしたところ、メインページのXML 宣言がどうしても上手く行きませんでした。
MTIf name="extension" like=".php"
と言うところを
MTIf name="extension" like=".php|index"
としたところ問題なく動作しましたがこれでよいのでしょうか?
3.注意事項にアーカイブインデックス(archievs.html/archives.php)の判断はできていません。
とありますが、アーカイブインデックスは問題なく動作していました。
MTIFを確認したところ、MTIndexBasenameを使用しているのは
name="main_index"
のところのようなので、本当はindex.html/index.phpの判断が付かないということなのでしょうか?
ちなみに、トラックバックにあるH.FujimotoさんのMTApplyModifierプラグインで空白行を削除しましたが、上手く動作しました。
>虎さん
こんにちは。
ご返事遅くなり申し訳ございません。
ご質問の件ですが、動作を確認したところ、MTIndexBasename タグのバグのようです(拡張子は「アーカイブの拡張子」から取得している模様)。
なお、like=".php|index" では、index.html の場合もマッチしてしまうので正しい判定ではありません。
それではよろしくお願い致します。
返答ありがとうございます。
>なお、like=".php|index" では、index.html の場合もマッチしてしまうので正しい判定ではありません。
おっしゃるとおりでした;;
ちなみにそこに至った経緯ですが、
like=".php"
だけだった場合、
Parse error: syntax error, unexpected T_STRING in xxx/xxx
というエラーが発生してしまいました。
エディタで確認すると、index.phpの場合でも.htmlの時の条件文が適応されていました。。。
で、調べていたのですが、
MTPageBasename
をそのまま表示すると、
index
と表示されていた為に、おかしいな?と思い、単純に条件にindexを追加していました。
本来であれば、拡張子の部分だけを判断するはずだけど、拡張子がないなぁ、、、と思い、
MTPageBasename extension="1"
に変更し、確認したところ、
like=".php"
のままでもエラーの発生はなくなりました。
extension="1"
を付加するとエラーなし、削除するとエラーありという動作をします。
この違いは環境によるものなのでしょうか???
※ちなみに当方はsakuraインターネットのスタンダードプランでMysql使用です。
ただし、これらの対策をしても、
>MTIndexBasename タグのバグのようです(拡張子は「アーカイブの拡張子」から取得している模様)。
という問題からか、やはりindex.phpとindex.htmlの区別は付いていないようです。この部分は修正されることを待つしかなさそうですね。。。
気長に待ってみます。
ありがとうございました!
>虎!さん
こんにちは。
extension="1" は仰るとおり、設定もれでした。
ご指摘ありがとうございます。
yujiroさんこんにちは、スタイルシート保存ではお世話になりました。
無事にテンプレートの入れ替えも終わりPHP化をやったのですが、
コメントプレビュー・コメント完了・検索結果の画面最上部中央に
'); ?>
と表示されてしまいます。
Movable Type の PHP化(その1)のコメントで全ページに表示されるとの書き込みも見ましたが、
インデックス・アーカイブ等のページは正常に表示されます。
「1.カスタマイズ」での改行・空白は削除
「2.テンプレート修正」の改行も削除してあります
何かシステムテンプレートの設定がおかしいのでしょうか?
XML宣言を削除しようとも思いましたが、折角なのでこの記事のカスタマイズをやりたいのですが…;
>カヒロさん
こんばんは。
ご質問の件ですが、本カスタマイズはシステムテンプレートの考慮がもれてました。システムテンプレートで表示されるページはPHPではないので、タグにその処理を追加してください。
試しに、1項について、下記のタグ(青色部分が追加)に入れ替えてみて頂けますでしょうか。
<MTIf name="entry_template">
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
<MTElse>
<MTIf name="main_index">
<MTSetVarBlock name="extension"><$MTIndexBasename extension="1"$></MTSetVarBlock>
<MTElse>
<MTSetVarBlock name="extension"><$MTBlogFileExtension$></MTSetVarBlock>
</MTIf>
</MTIf>
<MTIf name="system_template">
<MTSetVarBlock name="extension">html</MTSetVarBlock>
</MTIf>
<MTIf name="extension" like=".php"><?php echo('<?xml version="1.0" encoding="utf-8"?>'); ?><MTElse><?xml version="1.0" encoding="utf-8"?></MTIf>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
<head>
改行・空白は削除してください。
うまくいかない場合、申し訳ありませんが再度ご連絡頂けますでしょうか。
それではよろしくお願い致します。
>yujiroさん
こんにちは。
レスの青色部分をヘッダーに追加したら「'); ?>」の表示も消えて
レイアウトがちゃんと表示されるようになりました!
ありがとうございます。
>カヒロさん
こんにちは。
ご連絡ありがとうございました。
無事に直ったようでよかったです。
ではでは!
MTのPHP化について、質問させていただきたく存じます。よろしくお願いします。
OSはWindowsVista、IEは7.0です。
いつもPHP化について参考にさせていただいております、お世話になります。
Movable Type の PHP化をMT3.35のときより行なっており、今回4.1にバージョンアップしました。
このときに、テンプレートのバックアップなのか、古いテンプレートと新しいテンプレートが混在するという点がありました。
不要なテンプレートは少しずつ消していってますが古いシステムテンプレートが消せずに残ってる状況です。
お伺いしたい点は個別エントリーの記事(例:http://mizu.littlestar.jp/blog/2008/02/post-397.php)と、コメントやトラックバックのリンクをクリックすると構文のエラーが出ることです。
Parse error: syntax error, unexpected T_STRING (略)php on line 1
月間アーカイブやカテゴリアーカイブは大丈夫なようです。
こちらのMovable Type の PHP化(その2:.html のままPHPを有効にする)を参考に
1.AddType ディレクティブによる設定を行ない(DBはSQLite、レンタル・ロリポップサーバー)
5.テストのHTMLファイル(test.html)を作成、成功しました。
Movable Type 4 で PHP 化する時の注意事項、も拝見して
ヘッダー部分に
Movable Type 4 の PHP 化で XML 宣言を自動的に切り替える、の
1.カスタマイズ、の青字を1行にまとめ、XML 宣言も記述しました。
2.テンプレート修正、をしてあるつもりですが、やはり私の構文の置き方が間違ってるのでしょうか。
お忙しいとは思いますが、何卒ご教授願えたらと思います。
>mizuさん
こんにちは。
ご質問の件ですが、まずはテンプレートからXML宣言を外して、ページが正常に表示されるかどうか確認して頂けますでしょうか。
正常に動作する場合は、XML宣言を切り替える部分のテンプレートに問題がありますので、どのような設定になっているか、タグを抜粋してそのままコメント欄に貼り付けてお知らせください(タグはコメントフォームの注意事項にしたがって変換してください)。
正常に動作しない場合は、他のPHP処理にエラーがあると思われます。
なお、当方で公開しているサンプルに問題があるかもしれませんので、予めご容赦ください。
それではよろしくお願い致します。
yujiroさま
リプライありがとうございます。遅くなり申し訳ありません。
XML宣言を外しましたが、エラーの画面はエラーのままで表示されませんでした。
ですので同じヘッダーを使っているメインや月間アーカイブは表示されていますしテンプレートには問題はないと思われます。
それどころかインデックスプレートに古いhtmlファイルが残ってたので削除すると
コメントやトラックバックに404エラーがでるようになってしまい、4.1にアップデートしてからの投稿まで404エラーのため、DL時にファイルが壊れた可能性がでてきましたので、そちらからやりなおしてみます。
お手間を取らせまして申し訳ありませんでした。
>mizuさん
こんばんは。
ご連絡ありがとうございました。
お分かりにならない場合はまたご連絡ください。
ではでは!
本当に助かりました。悲願のxml宣言をすることができました。
>winout555さん
こんばんは。
コメントありがとうございました。
お役に立てたようでよかったです。
ではでは!