グローバルテンプレートを確実に読み込むMTIncludeタグのglobalモディファイア
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モディファイアを使う時は下のように、ブログのテンプレートを探すステップがなくなるのです。
- グローバルテンプレートを探す
- グローバルテンプレートが見つかった場合、それを読み込む
- グローバルテンプレートが見つからなかった場合、エラーを表示する
つまり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を有効にしてください。
コメントはまだありません。