<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>MovableType Tips by Sonots</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/" />
<modified>2005-05-29T22:14:15Z</modified>
<tagline>たぶんダイナミックパブリッシングの可能性を追求するページ</tagline>
<id>tag:www.sonots.com,2008:/mttips//2</id>
<generator url="http://www.movabletype.org/" version="3.11">Movable Type</generator>
<copyright>Copyright (c) 2005, sonots</copyright>
<entry>
<title>MTInclude とダイナミックパブリッシング</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/mtinclude_and_dynamicpublishing.html" />
<modified>2005-05-29T22:14:15Z</modified>
<issued>2005-05-19T21:20:51Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.792</id>
<created>2005-05-19T21:20:51Z</created>
<summary type="text/plain">テンプレートをモジュール化し、MTInclude テンプレートタグでとりこむことで、
テンプレートの編集が楽になります。
ダイナミックパブリッシング時には、MTInclude file の挙動が変わり、テンプレートタグが変換されるようになります。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>まずダイナミックパブリッシングでない場合を説明します。参考</p>

<ol>
<li><a href='http://www.elise.com/mt/archives/000484using_php_and_mt_includes.php' >Learning Movable Type: Using PHP and MT Includes</a></li>
<li><a href='http://hxxk.jp/mt/2005/02/04/0232.php'>MT hxxks - カテゴリアーカイブとナビゲーションリスト</a></li>
</ol>

<p>テンプレートをモジュール化し、MTInclude テンプレートタグでとりこむことで、
テンプレートの編集が楽になります。
例えば、Main Index テンプレートでも Archive テンプレートでもサイドバーを表示させておきたい場合、
共通の Sidebar テンプレートモジュールを作っておけば、それ１つ編集するだけで両方に反映されます。</p>

<p>別ファイルを「取り込む」、ということに関して言えばおおまかに３つ方法があります。</p>

<ol>
<li>MTInclude module テンプレートタグを使用する</li>
<li>MTInclude file テンプレートタグを使用する</li>
<li>PHP の include を使用する</li>
</ol>
]]>
<![CDATA[<h4>1. MTInclude module</h4>

<p>&lt;$MTInclude module="テンプレートモジュール"$&gt; では
テンプレートモジュールを指定します。
テンプレートモジュール内のテンプレートタグも変換されます。例</p>

<p>Main Index</p>

<pre><code>&lt;MTBlogURL&gt;
&lt;$MTInclude module="Test"$&gt;
</code></pre>

<p>Test</p>

<pre><code>&lt;MTBlogName&gt;
</code></pre>

<p>Main Index の結果。このブログでは</p>

<pre><code>http://www.sonots.com/mttips/
MovableType Tips by Sonots
</code></pre>

<p>のようになります。</p>

<h4>2. MTInclude file</h4>

<p>&lt;$MTInclude file="foo.html"$&gt; では
指定したファイル内のテンプレートタグは変換されません。
よって通常は Index Templates として新しいテンプレートを作成し、
そのテンプレートによって出力された html ファイルを指定します。
もしくは単純に外部で作成したファイルを指定します。
例</p>

<p>Main Index</p>

<pre><code>&lt;MTBlogURL&gt;
&lt;$MTInclude file="test.html"$&gt;
&lt;$MTInclude file="test.tmpl"$&gt;
&lt;$MTInclude file="hoge.txt"$&gt;
</code></pre>

<p>Test Index<br />
Output File：test.html<br />
Link this template to a file: test.tmpl<br /></p>

<pre><code>&lt;MTBlogName&gt;
</code></pre>

<p>hoge.txt</p>

<pre><code>HOGEHOGE
</code></pre>

<p>Main Index の結果。</p>

<pre><code>http://www.sonots.com/mttips/
MovableType Tips by Sonots
&lt;MTBlogName&gt;
HOGEHOGE
</code></pre>

<h4>3. PHP include</h4>

<p>これを利用するには、php 拡張子かダイナミックパブリッシングに移行する必要があります。別に php でなくても他の言語でもよいですが。</p>

<p>PHP の include でももちろん指定したファイル内のテンプレートタグは変換されません。
また、MTInclude file と違い、リビルド時に include されるのではなく、
ユーザによってphpがロードされたときに include されることになります。</p>

<p>Main Index (index.php)</p>

<pre><code>&lt;MTBlogURL&gt;
&lt;?php
     include "test.html";
     include "test.tmpl";
?&gt;
</code></pre>

<p>Test Index<br />
Output File：test.html<br />
Link this template to a file: test.tmpl<br /></p>

<pre><code>&lt;MTBlogName&gt;
</code></pre>

<p>hoge.txt</p>

<pre><code>HOGEHOGE
</code></pre>

<p>Main Index の結果。</p>

<pre><code> http://www.sonots.com/mttips/
 &lt;?php
      include "test.html";
      include "test.tmpl";
      include "hoge.txt";
 ?&gt;
</code></pre>

<p>phpロード時</p>

<pre><code> http://www.sonots.com/mttips/
 MovableType Tips by Sonots
 &lt;MTBlogName&gt;
</code></pre>

<p>MTInclude file の場合は、すでに Main Index の出力内容が固定化されていたため、例え test.html の内容が変わったとしても Main Index をリビルドするまでは出力ファイルの内容は変わりません。</p>

<p>それに対し、php による include の場合はロード時にとりこむので、test.html の内容さえ変わってしまえば、Main Index をリビルドする必要はありません。</p>

<h4>4. MTInclude とダイナミックパブリッシング</h4>

<p><em>本題：ダイナミックパブリッシング時には、MTInclude file の挙動が変わり、テンプレートタグが変換されるようになります。</em></p>

<p>また、ダイナミックパブリッシングなのでもちろんファイルロード時に include されることになります。MTInclude module と動作的には変わらなくなったと思ってください。</p>

<p>応用としては、複数のブログを同一MTシステム上で管理している場合に、
１つのブログでテンプレートを作成しファイルシステムに出力させておき、
他のブログからそのテンプレートを参照するといった、
ブログ間のテンプレート共有などが考えられます。
各ブログ特有のものは MTInclude module で指定しておけば、固有化も図れるでしょう。</p>

<p>ちなみに、通常時でも <a href="http://www.sixapart.com/pronet/plugins/plugin/includeplus.html">IncludePlus</a> 
というプラグインを用いると、テンプレートタグが変換される MTInclude file を使用できるようです。</p>
]]>
</content>
</entry>
<entry>
<title>アーカイブファイルのアドレス変更</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/permalink.html" />
<modified>2005-05-29T22:11:06Z</modified>
<issued>2005-05-13T03:04:47Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.791</id>
<created>2005-05-13T03:04:47Z</created>
<summary type="text/plain">アーカイブに作られるファイルのアドレス、いわゆる Permalink の規則を変更します(Permalink = Permanent(永続的) に利用できるリンク）。 デフォルトではエントリタイトルの文字列を利用するわけですが、 日本語をしようしていると、aaaaaaaaaab.html となるなど全くもって意味がないです。 また、インポート時にずれてしまったりもして、なんとも中途半端な Permalink です。 ARTIFACT ―人工事実― | MovableTypeのページ分割/Permalinkの変更 アーカイブのURLが変わらないように Chitatopops: Permalinkを変更 HINAGATA:各種アーカイブファイルを効率的に構築する (画像もあるのでわかりやすいかも) Permalink は「WEBLOG CONFIG」&gt;「Archive Files」から「Archive File Template」の項目から設定することができます。 Individual Entry Archive を例に説明します。 Individual Entry Archive おおまかに言って２つのスタイルがあるかと思います。 時刻だけを使用 キーワードを使用 ...</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>アーカイブに作られるファイルのアドレス、いわゆる Permalink の規則を変更します(Permalink = Permanent(永続的) に利用できるリンク）。
デフォルトではエントリタイトルの文字列を利用するわけですが、
日本語をしようしていると、aaaaaaaaaab.html となるなど全くもって意味がないです。
また、インポート時にずれてしまったりもして、なんとも中途半端な Permalink です。</p>

<ul>
<li><a href="http://artifact-jp.com/mt/archives/200306/mtpaginate.html">ARTIFACT ―人工事実― | MovableTypeのページ分割/Permalinkの変更</a></li>
<li><a href="http://wandering-wind.jp/archives/2003/1113131950.php">アーカイブのURLが変わらないように</a></li>
<li><a href="http://chitatopops.net/archives/2003/02/18/permalink_changed.php">Chitatopops: Permalinkを変更</a></li>
<li><a href="http://hinagata.biz/log/2004/07/29/1839.html">HINAGATA:各種アーカイブファイルを効率的に構築する</a> (画像もあるのでわかりやすいかも)</li>
</ul>

<p>Permalink は「WEBLOG CONFIG」>「Archive Files」から「Archive File Template」の項目から設定することができます。
Individual Entry Archive を例に説明します。</p>

<h4>Individual Entry Archive</h4>

<p>おおまかに言って２つのスタイルがあるかと思います。</p>

<ol>
<li>時刻だけを使用</li>
<li>キーワードを使用</li>
</ol>
]]>
<![CDATA[<h5>時刻だけを使用</h5>

<pre><code>&lt;$MTEntryDate format="%Y%m/%d%H%M"$&gt;.html
</code></pre>

<p>年月/ となるディレクトリが作成され、日時分.html となるファイルが作成されます。%S で秒もできます。分まであれば確実かと思います。時、分はお好みで。
自分としては 年/月/ と 年/ でディレクトリを作らず、
年月/ とまとめてしまうぐらいで十分だと思ったのですがどうでしょうか？</p>

<p>また、</p>

<pre><code>&lt;$MTEntryDate format="%Y%m%d%H%M"$&gt;.html
</code></pre>

<p>のようにディレクトリをなくしてしまえば、ページ間相対リンクが貼りやすくなるかもしれません（トップページやカテゴリアーカイブなどからのリンクも考慮しなければいけませんが）。特にダイナミックパブリッシングの場合はそもそもファイルが作られないので、ディレクトリに格納する意味もないかな、と。</p>

<p>MTEntryData テンプレートタグに関してより詳しくは「<a href="http://www.movabletype.jp/manual/mtmanual_tags.html#date_tag_formats">日付タグのフォーマット</a>」を参照するとよいかと思います。</p>

<h5>キーワードを利用する</h5>

<p>キーワードを利用すれば自分でファイルを名を指定できます。</p>

<pre><code>&lt;$MTEntryKeywords$&gt;.html
</code></pre>

<p>キーワードを入力するには、まずエントリー画面の設定をしなければいけません。</p>

<p>エントリー編集画面を開いて、下部の「Customize the display of this page.（この画面の表示をカスタマイズする）」をクリックするとエントリーページで表示される項目を設定できます。 Custom（カスタム）: で Keyword（キーワード） にチェックすると Keyword 項目も入力できるようになります。全部チェックしておけば損はないかと思います。</p>

<p>「<a href="./excerpt_for_trackback.html">トラックバック時には Excerpt を使おう</a>」で説明しているのと同じものです。</p>

<p>この方法ではキーワードを指定しなければいけなくなります。
なので、このページのような日記的ではないページの場合用いるのが得策かと思います。
このようなページでは時刻は特に問題ではないので、年月/ ディレクトリすら作りませんでしたが、</p>

<pre><code>&lt;$MTEntryDate format="%Y%m"&gt;/&lt;$MTEntryKeywords$&gt;.html
</code></pre>

<p>と 年月/ ディレクトリを作るのもありかもしれません。</p>

<h4>Category Archive</h4>

<p>Category Archive でも日本語問題が発生します。
MTCategoryID を利用するといいかもしれません。</p>

<pre><code>&lt;$MTCategoryID$&gt;/index.html
&lt;$MTCategoryID$&gt;.html
</code></pre>

<h4>移行</h4>

<p>URL が変わってしまうので困りますよね。
.htaccess が使えるサーバーならば MT 上から .htaccess を作ることで
自動的に旧URLから新URLに飛んでもらえるようにできます。</p>

<p>とりあえず今は
「<a href="http://artifact-jp.com/mt/archives/200306/mtpaginate.html">ARTIFACT ―人工事実― | MovableTypeのページ分割/Permalinkの変更</a>」
さんのほうを参考にしてください。下のほうにあります。</p>

<h4>デフォルト</h4>

<p>ちなみにデフォルトは</p>

<p>Individual</p>

<pre><code>&lt;$MTArchiveDate format="%Y/%m/%d"$&gt;/&lt;$MTEntryTitle dirify="1"$&gt;.html
</code></pre>

<p>Monthly</p>

<pre><code>&lt;$MTEntryDate format="%Y/%m"$&gt;/index.html
</code></pre>

<p>Category</p>

<pre><code>&lt;$MTCategoryLabel$&gt;/index.html
</code></pre>

<p>と同義。</p>
]]>
</content>
</entry>
<entry>
<title>トラックバック時には Excerpt を使おう</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/excerpt_for_trackback.html" />
<modified>2005-05-15T06:29:24Z</modified>
<issued>2005-05-13T02:50:42Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.790</id>
<created>2005-05-13T02:50:42Z</created>
<summary type="text/plain">エントリー編集ページを開いて、下部の「Customize the display of this page.（この画面の表示をカスタマイズする）」 をクリックするとエントリーページで表示される項目を設定できます。 Custom（カスタム）: で Exceprt（概要） にチェックすると Exceprt 項目も入力できるようになります。 全部チェックしておけば損はないかと思います。 Exceprt には概要を入力します。 トラックバックを出すと相手のブログにはここに書かれたテキストが表示されます。 Exceprt 項目を利用していない場合はエントリ中の先頭テキストが表示されます。 先頭に概要を記述している場合はいいですが、そうでない場合は Excerpt 項目を使用したほうが親切です。...</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>エントリー編集ページを開いて、下部の「Customize the display of this page.（この画面の表示をカスタマイズする）」
をクリックするとエントリーページで表示される項目を設定できます。</p>

<p>Custom（カスタム）: で Exceprt（概要） にチェックすると Exceprt 項目も入力できるようになります。
全部チェックしておけば損はないかと思います。</p>

<p>Exceprt には概要を入力します。
トラックバックを出すと相手のブログにはここに書かれたテキストが表示されます。
Exceprt 項目を利用していない場合はエントリ中の先頭テキストが表示されます。
先頭に概要を記述している場合はいいですが、そうでない場合は Excerpt 項目を使用したほうが親切です。</p>
]]>


</content>
</entry>
<entry>
<title>Main Index  の記事が消えることないですか？</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/mtentries_lastn.html" />
<modified>2005-05-15T12:33:19Z</modified>
<issued>2005-04-03T16:52:44Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.775</id>
<created>2005-04-03T16:52:44Z</created>
<summary type="text/plain">Movable Type はデフォルトでは過去７日間のエントリが Main Index(index.html) に表示されます。最新７件ではなく、７日間です。よって、１週間投稿しない状態で Rebuild すると Main Index で何も記事が見えなくなってしまいます。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>Movable Type はデフォルトでは過去７日間のエントリが Main Index(index.html) に表示されます。
最新７件ではなく、７日間です。
よって、１週間投稿しない状態で Rebuild すると Main Index で何も記事が見えなくなってしまいます。
特に Main Index も<em>ダイナミックパブリッシングの場合は Rebuild もいらないので痛い。</em>
最新７件に変更します。</p>

<p>Main Index テンプレートの</p>

<pre><code>&lt;MTEntries&gt;
</code></pre>

<p>を</p>

<pre><code>&lt;MTEntries lastn="7"&gt;
</code></pre>

<p>のように変更しましょう。ちなみにデフォルト動作である７日間は</p>

<pre><code>&lt;MTEntries days="7"&gt;
</code></pre>

<p>と記述することもできます。７は WEBLOG CONFIG → Preferences のほうで設定されています。</p>
]]>


</content>
</entry>
<entry>
<title>MTを利用した独立ページの作り方</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/standalonepage_usingmt.html" />
<modified>2005-05-19T21:16:15Z</modified>
<issued>2005-04-02T01:01:33Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.16</id>
<created>2005-04-02T01:01:33Z</created>
<summary type="text/plain">たまに見かける、独立ページなのに MT ページと見た目が同じなページの作り方です。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>
たまに見かける、独立ページなのに MT ページと見た目が同じなページの作り方です。例: <a href="http://www.sonots.com/mttips/links.html">links.html</a>
</p>

<p>
<a href="http://www.elise.com/mt/archives/000314creating_an_about_page.php">Learning Movable Type: Creating an About Page</a> へどうぞ。
</p>

<p>
つまりは、Main Index または Individual Entry Archive テンプレートから &lt;MTEntries&gt;&lt;/MTEntries&gt; 間を削ったインデックステンプレート（テンプレートモジュールの所ではなく）を作り、出力ファイルを about.html や links.html のように設定する、と。
</p>
]]>
<![CDATA[<p>
ちなみに、それらのページへ Main Index などからリンクを貼る際はURL直書きでもよいですが、
</p>

<pre><code>&lt;a href="&lt;$MTLink template="About Me Index"$&gt;"&gt;About&lt;/a&gt;
</code></pre>

<p>
のようにすることで、About Me Index の出力ファイル名が変わっても変更しないですむようにできます。
もちろん例のような、出力ファイルを設定できるインデックステンプレートに対してのみ MTLink template は有効です。
</p>
]]>
</content>
</entry>
<entry>
<title>デフォルトスタイルシートの機能的改善</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/customize_defaultstylesheet.html" />
<modified>2005-05-15T05:05:27Z</modified>
<issued>2005-04-01T08:22:18Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.11</id>
<created>2005-04-01T08:22:18Z</created>
<summary type="text/plain">Movable Type のデフォルトスタイルシートは機能的にデフォルトらしからぬ不満があります。スタンダードになれるように見た目はできるだけ維持しつつ改善していきます。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>
Movable Type のデフォルトスタイルシートは機能的にデフォルトらしからぬ不満があります。
スタンダードになれるように見た目はできるだけ維持しつつ改善していきます。
</p>
]]>
<![CDATA[<h4>文字が小さい</h4>

<p>
デフォルトでは文字の大きさがほぼ x-small になっています。
x-small は小さすぎだとみなさん共感してくれると思うのですが、どうでしょうか？
x-small をすべて small に置換します。
メモ張でもいいので外部エディタにコピーアンドペーストして置換機能を利用するといいでしょう。
</p>

<h4>pre タグの自動折り返し</h4>

<p>
通常 pre タグでは画面の幅を超えるテキストを入力するとはみだして横スクロールができてしまいます。
幅を超えるテキストは自動で折り返すようにします。
これらはまだ W3C 標準ではなく、ブラウザ互換なので知らない人も多いようです。
</p>

<p><xmp>pre,xmp
{
    white-space:-pre-wrap;　/<em>Opera</em>/
    white-space: -o-pre-wrap; /<em>Opera7</em>/
    white-space:-moz-pre-wrap; /<em>Firefox</em>/
    white-space: pre-wrap; /<em>W3C.Future？</em>/
    line-break:strict;/<em>IE</em>/
    word-break:break-all;/<em>IE</em>/
    word-wrap:break-word;/<em>IE</em>/
    font-family: Verdana, Arial, sans-serif;
}
</xmp></p>

<p>
ついでにフォントも content と合わせたほうが見やすいと思い、記入してあります。
枠どりなどは各自でお好きなように。
</p>

<h4>IE5対策</h4>

<h5>containerのサイズ</h5>

<p><xmp>#container {
    width: 700px;
    border: 1px solid #FFFFFF;
}
</xmp>
<xmp>#center {
    width: 500px;
}
</xmp>
<xmp>#right {
    width: 200px;
}
</xmp></p>

<p>
となっていますが、IE5はボーダーの大きさもwidthの大きさにカウントしてしまうので、<br />
container(700px)-border(1px)×2=698px<br />
center(500px)+right(200px)=700px<br />
と計算があわなくなります。#right を 198px にして回避しましょう。
</p>

<p><xmp>#right {
    float: left;
    width: 198px;
    background-color: #FFFFFF;
    overflow: hidden;
    }
</xmp></p>

<p>
未完
</p>
]]>
</content>
</entry>
<entry>
<title>着せ替えMovable Type</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/switchable_movabletype.html" />
<modified>2005-06-17T08:07:03Z</modified>
<issued>2005-03-30T19:56:39Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.4</id>
<created>2005-03-30T19:56:39Z</created>
<summary type="text/plain">出力ファイルをphpにする、またはダイナミックパブリッシングを利用すれば
動的ページが作れるので、訪問者がテンプレートを着せ替えられるシステムを導入できます。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<p>
出力ファイルをphpにする、またはダイナミックパブリッシングを利用すれば
動的ページが作れるので、
訪問者がテンプレートを着せ替えられるシステムを導入できます。
</p>

<p>
<em>css の着せ替えではなく、テンプレートの着せ替えです。</em>
</p>

<p>
プラグインを使用しているわけではないので、面倒くさいかもしれませんし、楽かもしれません。
サンプルはこの blog のトップへ。
</p>
]]>
<![CDATA[<p>
基本となるアイデアは
<a href="dynamicpublishing_and_php.html">ダイナミックパブリッシングとphp拡張子の差異</a>
で得ることができます。
</p>

<h4>1. phpへ移行しよう</h4>

<p>
phpへの移行がすんでいない方は
<a href="dynamicpublishing_and_php.html">ダイナミックパブリッシングとphp拡張子の差異</a>
のまえがきを見て、
Main Index, Individual Entry Archive, Date-Based Archive, Category Archive テンプレートを移行してください。<br />
<br />
php拡張子移行の場合は、Main Index はテンプレート管理画面で、他の３つのArchive テンプレートが吐き出すファイルはウェブログ設定のほうで変更します。<br />
<br />
ダイナミックパブリッシング移行の場合はテンプレート管理画面で、「テンプレート毎に個別に選択」をチェックし、それぞれのテンプレートで、ダイナミックパブリッシングをするように選択してください。<br />
<br />
ここではそれらの事前準備が済んでいるものとして話を進めるので php への移行に関してこれ以上の説明はしません。
</p>

<h4>2. テンプレートモジュールを使おう</h4>

<p>
現存のテンプレートをテンプレートモジュールに移しておきます。メインのテンプレートにはただの切り替え処理を行わせ、本処理はテンプレートモジュールでさせるとクールかと思います。
</p>

<p>
Template 管理ページの下のほうにあるテンプレートモジュール(Template Modules) で新しいモジュールを例えば、「DefaultMainIndex」とでも名づけて Main Index テンプレートの内容をコピーしてください。
</p>

<p>
他のテンプレートも同様に移行します。
</p>

<p>
Main Index → DefaultMainIndex<br />
Category Archive → DefaultCategoryArchive<br />
Date-Based Archive →  DefaultDate-BasedArchive<br />
Individual Entry Archive → DefaultIndividualEntryArchive
</p>

<p>
と移行したとします。
</p>

<h4>3. 切り替えPHPテンプレートを作ろう</h4>

<p>
<em>php 拡張子</em>の場合は、Main Index の内容を
</p>

<pre><code>&lt;?php
$MTBlogURL = "&lt;MTBlogURL&gt;";
$url = parse_url($MTBlogURL);
$path = $url['path'];
if($theme = $_GET['theme']) {setcookie('theme', $theme, 0, $path);} 
else if($theme = $_COOKIE['theme']) {} 
else {$theme = "Default";}
?&gt;
&lt;?php if($theme == "Default") { ?&gt;
&lt;$MTInclude module="DefaultMainIndex"$&gt;
&lt;?php } else if($theme == "Hogehoge") {?&gt;
&lt;$MTInclude module="HogehogeMainIndex"$&gt;
&lt;?php } ?&gt;
</code></pre>

<p>
のようにします。これによって
</p>

<p><xmp>http://あなたのサイト名/?theme=Default
http://あなたのサイト名/?theme=Hogehoge
</xmp></p>

<p>
とすることでテンプレートを選べるようになります。
Default の場合は「DefaultMainIndex」を、Hogehoge の場合は 「HogehogeMainIndex」を読み込むことになります。用意してない場合は真っ白になると思います。
</p>

<p>
Category Archive、Date-Based Archive、Individual Entry Archive などに関しても同様のことを行います。この切り替えテンプレートの「MainIndex」の部分を「CategoryArchive」のように置き換えます。
</p>

<p>
<em>ダイナミックパブリッシングの場合</em>、もう少し工夫して、次のようにできます。
</p>

<pre><code>&lt;?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' =&gt; array(array('function', 'MTInclude', 'mt:24', 9, false),array('function', 'MTBlogURL', 'mt:24', 10, false),)), $this);?&gt;
&lt;?php
$MTBlogURL = smarty_function_MTBlogURL(array(), $this);
$url = parse_url($MTBlogURL);
$path = $url['path'];
if($theme = $_GET['theme']) {setcookie('theme', $theme, 0, $path);}
else if($theme = $_COOKIE['theme']) {} 
else {$theme = "Default";}
echo smarty_function_MTInclude(array('module' =&gt; ($theme)."MainIndex"), $this);
?&gt;
</code></pre>

<p>
動作的な違いは、if 文がなくなったことです。
こちらのほうが編集しなおさずにすむためテーマの追加が楽ですね。
</p>

<h4>4. 切り替えメニューを作ろう</h4>

<p>
簡単に切り替えられるようにするため、メニューを作りましょう。
</p>

<pre><code>&lt;form action="" method="get"&gt;
&lt;select name="theme" onchange="submit();" size="3"&gt;
&lt;option value="Default"&gt;Default&lt;/option&gt;
&lt;option value="Hogehoge"&gt;Hogehoge&lt;/option&gt;
&lt;/select&gt;
&lt;/form&gt;
</code></pre>

<p>
を「Default Main Index」など Main Index 系テンプレートモジュールの適当なところ(sidebar など)に配置します。<br />
余談ですが、これ自体もテンプレートモジュール化してそれぞの Main Index 中で
</p>

<p><xmp><$MTInclude modules="TemplateMenu"$>
</xmp></p>

<p>
のように呼び出すのもまたありです。
</p>

<h4>5. あとがき</h4>

<h4>5.1 スタイルシート</h4>

<p>
スタイルシートも同様に切り替えることは理論上可能ですが、やめたほうがよさそうです。
ファイル名が同じなためか、IE が変化していない同じスタイルシートだと誤認してしまいます。
よって、単純に default.css, hogehoge.css のように別々のファイルにしてしまい、「DefaultMainIndex」で default.css を 「HogehogeMainIndex」では hogehoge.css を読み込む、のようにテンプレートを編集したほうがよいです。
</p>

<h4>5.2 php 拡張子の場合はファイルサイズが肥大化する</h4>

<p>php 拡張子の場合、生成される php ファイルには MTInclude module で指定
したテンプレートがすべて展開されています。
それを php の if 文で無視させているだけです。
なので３つのテンプレートがあれば、通常の３倍の容量の php ファイルになるでしょう。
ユーザーに転送されるデータ量は if 文のおかげで通常と同じだけですが、
ハードディスクが圧迫されます。
php 拡張子時は、可能ではありますが、おすすめしません。</p>

<h4>5.2 ダイナミックパブリッシング用テンプレート</h4>

<p><p>
ダイナミックパブリッシング用にできあがったものをおいておきます。
Stylesheet, Master Archive Index も一応作っておきました。</p>

<ul>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchMainIndex.txt">Main Index</a></li>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchMasterArchiveIndex.txt">Master Archive Index</a></li>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchCategoryArchive.txt">Category Archive</a></li>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchDate-BasedArchive.txt">Date-Based Archive</a></li>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchIndividualEntryArchive.txt">Individual Entry Archive</a></li>
<li><a href="http://www.sonots.com/mttips/mytmpl/SwitchStylesheet.txt">Stylesheet</a></li>
</ul>
]]>
</content>
</entry>
<entry>
<title>ダイナミックパブリッシングとphp拡張子</title>
<link rel="alternate" type="text/html" href="http://www.sonots.com/mttips/dynamicpublishing_and_php.html" />
<modified>2005-05-15T05:05:49Z</modified>
<issued>2005-03-30T07:27:09Z</issued>
<id>tag:www.sonots.com,2005:/mttips//2.10</id>
<created>2005-03-30T07:27:09Z</created>
<summary type="text/plain">ダイナミックパブリッシングでもテンプレート中に php スクリプトを記述することができます。ダイナミックパブリッシングでは Rebuild をしなくてもよい、よってファイル容量が少なくてすむ、URLではhtmlファイルに見えるのでSEO的によいという利点があります。しかし既存 perl プラグインを使えないという大きな欠点もあります。</summary>
<author>
<name>sonots</name>
<email>sonots@sonots.com</email></author>
<dc:subject>SubtleTips</dc:subject><content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sonots.com/mttips/">
<![CDATA[<h4>1. まえがき</h4>

<h4>1.1. php拡張子</h4>

<p>
Movable Type が吐き出すファイルは html ファイルだけとは限りません。
.cgi だろうが .txt だろうがなんでもありです。
とはいえ、php にするのが現実的かと思います。
php スクリプトなら今まで html であった内容を変更する手間がいりません。
</p>

<p>
テンプレート管理画面で出力ファイルを <b>.php</b> に、またウェブログ設定で
アーカイブファイルの拡張子を <b>.php</b> に変えることですべてのファイルを
php スクリプトに変換することができます。
</p>

<h4>1.2. ダイナミックパブリッシング</h4>

<p>
Movable Type 3.11 からダイナミックパブリッシングという機能がつきました。
ダイナミックパブリッシングとは動的にページを生成する機能です。
つまり Rebuild する必要がありません。
<em>実はこちらでもテンプレート中に php スクリプトを記述することができます。</em>
</p>

<p>ダイナミックパブリッシングには php 拡張子に比べて、Rebuild をしなくてもよい、よってファイル容量が少なくてすむ、URLではhtmlファイルに見えるのでSEO的によいという利点があります。
しかし既存 perl プラグインを使えないという大きな欠点もあります。
</p></p>

<p>処理量に関してはダイナミックパブリッシングではエントリを動的にとりこむ処理が加わるわけですが、結局どちらも php スクリプトですので、html のときと比べるとさほど気にするほどではないかと推測します
</p>

<p>
移行方法参考:<br />
<a href="http://hinagata.biz/log/2004/09/01/0650.html">HINAGATA: MT3.11-jaとダイナミック・パブリッシング</a><br />
<a href="http://www.elise.com/mt/archives/000733htaccess_and_dynamic_publishing.php">Learning Movable Type :: Htaccess and Dynamic Publishing</a>
</p>
]]>
<![CDATA[<h4>2. ダイナミックパブリッシングとphp拡張子の処理の差異</h4>

<p>
本題です。テンプレートファイルの内容が以下のようだったとします。
</p>

<p><xmp><?php
$i++;
$MTBlogURL = "<MTBlogURL>";
?>
<MTBlogURL>
</xmp></p>

<h4>2.1. php拡張子の場合に吐き出されるコード</h4>

<p><xmp><?php
$i++;
$MTBlogURL = "http://www.sonots.com/mttips";
?>
http://www.sonots.com/mttips
</xmp></p>

<p>
MTテンプレートタグが変換された php コードが作成されています。
</p>

<p>
<em>処理の順序:Build時(テンプレートタグ変換) → php実行時(php変換)</em>
</p>

<h4>2.2. ダイナミックパブリッシングの場合に吐き出されるコード</h4>

<p>
ちなみに、アクセス後に templates_c 配下に作成されます。
</p>

<p><xmp><?php /* Smarty version 2.6.3, created on 2005-04-08 13:04:46
         compiled from mt:113 */ ?>
<?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'MTBlogURL', 'mt:113', 5, false),)), $this); ?>
<?php 
$i++;
$MTBlogURL = "{{MTBlogURL}}";
  echo smarty_function_MTBlogURL(array(), $this);?>
</xmp></p>

<p>
テンプレートタグが Smarty PHP コードに変換されているのがわかると思います。
これによってニュアンス的に php 実行時にテンプレートタグが変換されることになります。
</p>

<p>また php 中のテンプレートタグ &lt;MTBlogURL&gt; が {{MTBlogURL}} と意味のない文字列になってしまっています。
つまり、表向き php 中でテンプレートタグの使用が禁じられています。
が、なんとか使用する方法もあります。そこについては道すがら触れます。（４月７日追加ポイント）
</p></p>

<p>
<em>処理の順序: php実行時(php変換とそれによるテンプレートタグ変換)</em>
</p>

<h4>3. 何が言えるか</h4>

<p>
ダイナミックパブリッシングのほうが、ちょっと工夫が必要になりますが、できることは多いです。
</p>

<p>
例えば <em>php 拡張子</em> の場合には
</p>

<p><xmp><?php if($include == 'Test') { ?>
<$MTInclude module="Test"$>
<?php } else if($include == 'Normal') { ?>
<$MTInclude module="Normal"$>
<?php } ?>
</xmp></p>

<p>
のように MTInclude テンプレートタグで取り込むテンプレートモジュールが
変数 $include の値と同じだったとしても、それを使用することはできません。
if 文でなんとかごまかすしかありません。
</p>

<p>なぜなら、処理の順序として、まずテンプレートタグ変換をしようとするので、
</p></p>

<p><xmp><$MTInclude module="$include"$>
</xmp></p>

<p>
とあった場合に、"$include" という名前のモジュールを探そうとします。
変数 $include にはなりません。
</p>

<p>
<em>ダイナミックパブリッシング</em>の場合も基本は同じですが、裏技的なことができます。
</p>

<p><xmp><?php $this->_tpl_vars['include'] = $include;?>
<$MTInclude module="$include"$>
</xmp></p>

<p>
実はこのコードは
</p>

<p><xmp><?php /* Smarty version 2.6.3, created on 2005-04-01 17:05:23
         compiled from mt:113 */ ?>
<?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'MTInclude', 'mt:113', 2, false),)), $this); ?>
<?php  $this->_tpl_vars['include'] = $include;<br />
echo smarty_function_MTInclude(array('module' => ($this->_tpl_vars['include'])), $this);?>
</xmp></p>

<p>
と変換されています。 smarty_function_MTInclude が MTInclude テンプレートタグの実態なわけですが、$include が $this->_tpl_vars['include'] に変換されているのがわかると思います。それ故の
</p>

<p><xmp><?php $this->_tpl_vars['include'] = $include;?>
</xmp></p>

<p>
だったわけです。また、いっそのことテンプレートの内容を Smarty 変換後のコードをそのまま取り込み、
</p>

<p><xmp><?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'MTInclude', 'mt:113', 2, false),)), $this); ?>
<?php 
smarty_function_MTInclude(array('module' => ($include)), $this);
?>
</xmp></p>

<p>
のようにしてしまうこともできます。
他のテンプレートタグがどのような smarty コードに変換されるのかは、
今回のように一度通常通りためしてみて、templates_c 配下の php ファイルを覗けばわかります。
</p>

<p>
さて、表向き php 中でテンプレートタグの使用が禁じられていると言いましたが、
表向きといったのは同様の方法で利用できるからです。
<xmp><?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'MTBlogURL', 'mt:113', 5, false),)), $this); ?>

<? $MTBlogURL = smarty_function_MTBlogURL(array(), $this);?>
</xmp>
<p>
このようにすれば、テンプレートタグを意味的に php コード中で記述することができます。
</p>

<p>
<em>結論: ダイナミックパブリッシングのほうが工夫が必要になるができることは多い。</em>
</p>

<h4>4. エントリにおける差異</h4>

<p>
「ダイナミックパブリッシングでもテンプレート中に php スクリプトを記述することができる」ということでテンプレート中での修理の差異について述べましたが、
エントリ中ではどうでしょうか？（４月７日追加ポイント）
</p>

<p>
最初に結論を述べますと、php 拡張子の場合はエントリ中にも php スクリプトをかけます。しかし、ダイナミックパブリッシングでは書けません。
</p>

<p>
テンプレートの内容が次のようだとします。
</p>

<p><xmp><MTEntries lastn="1">
<$MTEntryBody$>
</MTEntries>
</xmp></p>

<p>
<em>php 拡張子</em>の場合は、Rebuild 時にテンプレートタグが変換されるため、
</p>

<p><xmp>[最新のエントリの内容]
</xmp></p>

<p>
とエントリの内容がそのまま反映された php ファイルができます。
よって、エントリ中で php スクリプトを記述しておけば php 実行時（ページアクセス時）にそのコードを実行させることができます。
</p>

<p>
しかし、<em>ダイナミックパブリッシング</em>の場合は、
<p>
<xmp><xmp><?php /* Smarty version 2.6.3, created on 2005-04-06 06:03:19
         compiled from mt:221 */ ?>
<?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.load_plugins.php');
smarty_core_load_plugins(array('plugins' => array(array('function', 'MTBlogURL', 'mt:221', 4, false),array('function', 'MTEntryBody', 'mt:221', 6, false),array('block', 'MTEntries', 'mt:221', 5, false),)), $this); ?>

<?php $this->_tag_stack[] = array('MTEntries', array('lastn' => '1')); smarty_block_MTEntries($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat=true);while ($_block_repeat) { ob_start(); ?>

<?php echo smarty_function_MTEntryBody(array(), $this);?>

<?php $this->_block_content = ob_get_contents(); ob_end_clean(); echo smarty_block_MTEntries($this->_tag_stack[count($this->_tag_stack)-1][1], $this->_block_content, $this, $_block_repeat=false); }  array_pop($this->_tag_stack); ?>
</xmp>
<p>
と Smarty PHP コードに変換されます。
よって、 php 実行時にエントリの内容がとりこまれるので、
エントリの内容を php として実行することはできません。ただの文字列です。
</p>

<p>
さて、<em>php 拡張子</em>の場合はエントリ中にも php スクリプトが書けるわけですので、テンプレート中で
</p>

<p><xmp><?php $MTBlogURL = "<MTBlogURL>"; ?>
</xmp></p>

<p>
のようにテンプレートタグが返す値を変数に格納しておけば、エントリ中でその値を利用することができるでしょう。
これはなかなか便利そうな気配がします。
</p>

<p>
<em>結論：php 拡張子の場合はエントリで php スクリプトを記述することができる。テンプレートタグが返す値も利用できるかもね。</em>
</p>

<h4>5. あとがき</h4>

<p>
結局、どちらがよいのかと言われると、まだ言えません。
そもそもの差異である、Rebuild が必要ない、しかし既存 perl プラグインが使用できなくなる、なども考えなければいけませんし、
他にもまだまだ差異はありそうです。
唯一現在言える事は<em>一長一短である</em>ということだけです。
</p>
]]>
</content>
</entry>
</feed>