45式::雑記
45式::雑記は、日々の事を記してないから日記ではなく雑記です。

グローバルテンプレートを確実に読み込むMTIncludeタグのglobalモディファイア

コメント
0件
トラックバック
0件

MTIncludeタグにglobalモディファイアという、グローバルテンプレートを読み込む上で便利なものが存在する事を知りました。

と、その前に、グローバルテンプレートを読み込む上で知っておかなくてはならない事を一つ。
それはMTIncludeタグでテンプレートを読み込む際の優先順位です。

テンプレートを読み込む優先順位

グローバルテンプレートを使っていなかった私は、テンプレートを読み込む優先順があると知りませんでした。
MovalbeType.jpの情報によれば、グローバルテンプレートよりブログのテンプレートを優先して読み込むようです。

グローバルテンプレートを、ブログのテンプレート内で利用するには、通常のテンプレートのインクルードと同じく、MTInclude という MT タグを利用します。

MTInclude タグを利用してテンプレートをインクルードする際に、Movable Type は以下の順番で、インクルードするテンプレートを決定します。

  • タグで指定した名前のテンプレートが、そのブログのテンプレート・セット内に存在する場合は、そのテンプレートをインクルード
  • そのブログのテンプレート・セット内に存在しない場合は、グローバルテンプレートから該当する名前のテンプレートをインクルード
  • 両方に無い場合は、テンプレートが見つかりません というエラーを表示

これを見る限り、読み込みたいグローバルテンプレートと同名のテンプレートがブログに存在する場合、グローバルテンプレートを読み込む事はできません。

それを回避するのが、MTIncludeタグのglobalモディファイアです。

globalモディファイア

globalモディファイアはMTIncludeタグで使う事ができます。

global="0|1"

グローバルテンプレートに属するテンプレートモジュールと同じ名前のテンプレートモジュールがブログのテンプレートにもある場合、Movable Type はブログのテンプレートの方を優先して読み込みます。このモディファイアを付与し値に 1 を設定すると、グローバルテンプレートにあるテンプレートモジュールを優先して読み込みます。初期値はグローバルテンプレートを優先しない 0 です。

使い方は簡単で、下の例ではナビゲーションというグローバルテンプレートを読み込みます。

<$MTInclude module="ナビゲーション" global="1"$>

この場合、globalを使っているのでブログにナビゲーションという名前のテンプレートが存在しても、グローバルテンプレートのナビゲーションを優先して読み込みます。

注意

globalモディファイアに1を設定する時には若干の注意が必要です。
globalモディファイアを使ったMTIncludeタグはグローバルテンプレートを優先しますが、もしもグローバルテンプレートが見つからなかった時はどうなるのでしょうか。

私は「ブログのテンプレートを探す」のだと思いましたが、実際にはエラーが表示されます。
globalモディファイアを使う時は下のように、ブログのテンプレートを探すステップがなくなるのです。

  1. グローバルテンプレートを探す
  2. グローバルテンプレートが見つかった場合、それを読み込む
  3. グローバルテンプレートが見つからなかった場合、エラーを表示する

つまりglobalモディファイアはテンプレートの優先順位を逆転させるものではないのです。

グローバルテンプレートを優先するからといって、ブログのテンプレートが後回しになるわけではないのです。
なので、まず先にグローバルテンプレートを探し、見つからなければブログのテンプレートを読み込む、という逆の動作を狙う事はできないのです。

うーん、どうもこの動作に納得がいかない。
一方が優先されるなら、もう一方は劣後されるのが妥当な気がする。
単にMovableType.jpの言い回しが

補足

ウィジェットの場合

記事中ではテンプレートモジュールについてのみ取り上げましたが、MTIncludeタグではウィジェットを読み込む事もできます。
そのウィジェットにもグローバルウィジェットと呼ぶべきものが存在します。

そしてお察しの通り、globalモディファイアはウィジェットに対しても有効です。

<$MTInclude widget="ウィジェット名" global="1"$>

identifierモディファイアの場合

identifierモディファイアを使った場合でもグローバルテンプレートを読み込む事は可能です。

<$MTInclude identifier="識別子" global="1"$>

しかし、グローバルテンプレートとブログのテンプレートの名前もidentifierも一致している事はとても珍しい気がします。
だとすれば、名前かidentifierを異なるようにテンプレートセットを作成し、一方を読み込むには名前で、もう一方を読み込むにはidentifierで、という使い分けを行えばglobalモディファイアは必要ないですね。

MTIncludeBlockの場合

MTIncludeタグには似た機能を持つMTIncludeBlockが存在します。
テンプレートタグリファレンスには載っていませんが、こちらでもglobalモディファイアが使える事を確認しました。

そしてお察しの通り、ウィジェットに対しても有効です。

<MTIncludeBlock module="テンプレート名" global="1">
moduleモディファイアを
widgetモディファイアにしても大丈夫です
</MTIncludeBlock>

コメント[0]

コメントはまだありません。

コメント投稿フォーム

コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。

コメント投稿フォーム

トラックバック[0]

トラックバックはまだありません。

カテゴリ
アーカイブ
ヘルプ
Feed

フィードとは