Home> Internet >  MovableType >  DynamicMTMLは魔法の杖ではない

DynamicMTMLは魔法の杖ではない

これはDynamicMTMLの間違った覚えさせ方だと思う説明の仕方の話。

動的に出したい部分を<MTDynamicMTML>と</MTDynamicMTML>でタグを囲む。

コレが有効のは、実際はものすごく限られた条件下です。
機能説明として使うのは構わないけど、実際にはもっと周到に頭を使う必要があります。

それって「スマートフォンオプション入れれば、既存のサイトが勝手にスマートフォン対応になるんでしょ。」とか「jQueryMobile読みこめば、既存のサイトが勝手にスマートフォン対応になるんでしょ。」と同じレベルです。

DynamicMTMLを利用すると、一部分をMTMLで記述されたままのHTMLを出力できます。
このMTMLを含むHTML全体を、DynamicMTMLブートストラップが読み込み、MTML部分のみ、MTのダイナミックパブリッシングエンジンに渡し、結果を元のHTMLにマージして出力する。それがDynamicMTMLです。

さて、DynamicMTMLを使う上で気を付けなくてはいけないのは、変数の扱いです。
変数は、HTMLを書き出す時に処理されてしまい、実際にDynamicMTMLブートストラップが読みこむのは、元の変数などないただのHTMLになってしまっています。

そう、実はチョット乱暴だけれど、DynamicMTMLの動作結果は、書きだされたHTMLを再度丸ごとテンプレートに貼り付けて、再構築した場合を想定する事が理解する早道です。2段階に分けて、再構築が行われる事をが理解できれば、正しく結果が予測できます。
また、コンテクストに関しては、どうやらファイルの出力パス(Fileinfo)から、コンテクスト情報を取得して、適切にセットが行われているようです。例えばカテゴリーアーカイブ内で処理するDynamicMTMLコードは、カテゴリーのコンテクストに制限されるようです。

問題の変数ですが、うまくスタティック部分とDynamicMTMLの両方に変数を渡すためには、それぞれに変数を書いてやる(渡してやる)必要があります。

<MTSetVar name="blog_id" value="9">
<MTDynamicMTML>
<MTEntries include_blogs="$blog_id">
<$MTEntryTitle$>
</MTEntries>
</MTDynamicMTML>

では、書き出されたHTML内の記述は以下のようになります。

<MTDynamicMTML>
<MTEntries include_blogs="$blog_id">
<$MTEntryTitle$>
</MTEntries>
</MTDynamicMTML>

このHTML内のMTMLが処理される時に、変数「blog_id」は、どこにも書かれていないので「$blog_id」の部分が空になり、思うような結果が取得できません。
この場合は、以下のようにDynamicMTMLの処理部分に、変数も含めて記述する必要があります。

<MTDynamicMTML>
<MTSetVar name="blog_id" value="9">
<MTEntries include_blogs="$blog_id">
<$MTEntryTitle$>
</MTEntries>
</MTDynamicMTML>

この同じ変数をスタティック側でも使用しているなら、両方で定義する必要があるわけです。

<MTSetVar name="blog_id" value="9">
<MTDynamicMTML><MTSetVar name="blog_id" value="9"></MTDynamicMTML>
<MTDynamicMTML>
<MTEntries include_blogs="$blog_id">
<$MTEntryTitle$>
</MTEntries>
</MTDynamicMTML>

まぁでも「チョットコレは冗長だなぁ」と考えてみたりとか、実は変数の設定がものすごく重い処理だったりする場合などなんかは、まぁその処理をスタティック側で全部済ませたかったりしますよね。
そういう時には、以下のような書き方をする事で、モディファイア部分の変数を先に展開してしまって渡すことが出来ます。

<MTSetVar name="blog_id" value="9">
<<MTRawMTML>MTEntries</MTRawMTML> include_blogs="<$MTVar name="blog_id"$>">
<MTRawMTML><$MTEntryTitle$></MTRawMTML>
<MTMTML tag="/MTEntries">

MTRawMTMLブロックタグは、その内部をそのままHTML内に書きだすタグです。MTDynamicMTMLタグとの大きな違いは、HTMLへの書き出し時にMTDynamicMTMLタグが書き出されないことです。つまりHTML内にはMTRawMTMLタグ自体は出力されません。(HTML内のMTDynamicMTMLタグは、DB処理のエラー時などに関係があります。処理内容によってこのタグを使うべきかを考える必要があります。)
書き出されない結果、上のMTMLは以下の様にHTMLファイルに出力が行われます。

<MTEntries include_blogs="9">
<$MTEntryTitle$>
</MTEntries>

MTRawMTMLを「<」と「MTEntries」の間に書いているのは、テンプレートの構文チェックで引っかからないようにするためです。その位置に書くことで、MTEntriesがテンプレート上でタグとして認識されなくなるため、閉じタグとの関係が正しくない場合のエラーが発生し無くなります。MTMTMLも構文チェックに対して有効なタグです。こちらは「tag」モディファイアの値のMTタグを出力します。

DynamicMTMLは、ただ振ればいいだけの魔法の杖(MagicWand)ではありません。
正しい使い方を憶えて、初めて意味を持つとても便利な道具なのだと思います。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2267

Home> Internet >  MovableType >  DynamicMTMLは魔法の杖ではない

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top