2007年9月29日

ダイナミックパブリッシングで静的ファイルを読み込む(smarty fetch)


2007/10/01 追記
本エントリーの内容には多少問題があります。以下のエントリーを参照ください。

-------------------------

 MovableTypeでダイナミックパブリッシングを稼働させることで最初にぶち当たったのが、今まで使っていた「各ページで共通部分などをPHPモジュール化(静的ファイル)にして、それぞれのページではPHP includeするだけ」という技が出来なくなったのでは?と思ったことです。

 上記のやり方については、すでにスタティックなMovableTypeでは確立している感があります。
 このPHPモジュール化については、下記の記事で詳しく解説しておられて大変役に立ちます。


 で、ダイナミックパブリッシングではどうなの?と検索してみると、ダイナミックパブリッシングは以前のMT3.xから導入されており、考えておられる方はやはり考えておられるのですね~(^^;)


 なるほど!!と感嘆しました(^^;)

 で、上記URLの方法を参考にして、ダイナミックパブリッシングでのPHPモジュール(スタティックファイル)の読み込みを以下のようにしてみました。


 まず、従来通り、インデックステンプレートに共通化したい部分をPHPファイルとして保存、再構築します。

 例えば、検索窓などは一回モジュール化してしまえば、あとは再構築のチェックボックスすらOFFにしておいてもいいくらいです。

 簡単に、以下のような検索フォームの部分があり、これを「search-form.php」というインデックステンプレートで保存したとします。

<h3 class="widget-header">検索</h3>
<form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
<input type="submit" value="検索" />
</form>


 そして、これを各テンプレートでは、

<!-- 検索窓 -->
<? include("<$MTBlogURL$>search-form.php"); ?>


という風に書けばいいわけです。

 ところが、このやり方はダイナミックパブリッシングでは通用せず、上記のコードがそのまま出力されます。

 で、MovableTypeのダイナミックパブリッシングは、Smartyテンプレートエンジンを使用しているので、Smartyのタグを使用すれば結構なんでも出来ちゃうらしいです。(上記参考URLのブログで有益な考察がたくさんあります。)

 前置きが長かったですが、ダイナミックパブリッシングにて、上記と同じ手法を取り入れるには下記のように設定します。

1. 共通部分のPHPモジュール化は上記方法と一緒です。インデックステンプレートとして作成します。
2. そして、そのPHPモジュールたちを読み込むページの最初あたりに下記コードを追加します。

{{capture assign="sitepath"}}<$MTBlogSitePath$>{{/capture}}

3. 上記検索窓の場合以下のように読み込みます。

{{fetch file="`$smarty.capture.sitepath`search-form.php"}}


 この方法の利点は、スタティックなPHPモジュールの読み込み同様、インデックステンプレートにいくつもPHPモジュールを作って同一ページ内でいくつも読み込めると言うことです。

 つまりは、

{{capture assign="sitepath"}}<$MTBlogSitePath$>{{/capture}}

<!-- 検索窓 -->
{{fetch file="`$smarty.capture.sitepath`search-form.php"}}

<!-- 最近のコメント -->
{{fetch file="`$smarty.capture.sitepath`recent-comments.php"}}

<!-- 最近のトラックバック -->
{{fetch file="`$smarty.capture.sitepath`recent-trachbacks.php"}}



という感じになります。


 Smartyをもっと駆使すれば、色々出来そうなのでどんどん考察してみます。

 とりあえずは、アーカイブのページ分割でしょうか。。。


関連商品

トラックバックURL

このエントリーのトラックバックURL:
http://www.multiburst.net/cgi-bin/mt-cgi/mt-tb.cgi/8487

コメント

こんにちは。
先ほどはコメントありがとうございました。

インデックステンプレートで作った静的ファイルなら、ファイル名に変数は入っていませんから、Smarty使わなくても<$MTInclude$>だけでいけますよ。この例でしたら、以下の書き方だけでOKです。

<$MTInclude file="search-form.php"$>
<$MTInclude file="recent-comments.php"$>
<$MTInclude file="recent-trachbacks.php"$>

時々勘違いされる方がおられるのですが、<$MTInclude file="○○"$>で読み込むファイルパスはブログのサイトパスに指定した場所が起点になりますので、index.html(index.php)と同階層にあるファイルは単純にファイル名だけでいいんです。

ダイナミックの場合はこれだけで
<? include("<$MTBlogURL$>search-form.php"); ?>
と全く同じ動きになります。お試し下さい。

な、なるほど!
同階層ならそのままでもいいわけですね(^^;)

ためになります!!
ありがとうございました!!

コメントする