実行順序
テンプレートファイル上での実行順序
テンプレートエンジンの実行順序は以下のようになります。
- グローバル変数を解決
- インクルード処理を解決
- setTemplateを処理(テンプレートの変数化)
- getTemplateを解決(変数の挿入)
- タッチモジュールを解決(デフォルトON)
- モジュール類を内側から解決(同じ階層の場合は下から)
- IFブロックを解決
- setRenderedを処理(解決済テンプレートを変数化)
- getRenderedを解決(変数の挿入)
テンプレートの実行順序を頭に入れておく事はテンプレートを作成していく上で非常に重要になってきます。
例えば、インクルード文を書くときに、グローバル変数を使ったパスで指定するテクニックがあります。
今 @include("/admin/entry/category-%{CCD}.html")
旧 <!--#include file='/admin/entry/category-%{CCD}.html'-->上のコードは、グローバル変数が解決された後にインクルードが動くため、正常に動きます。
ただし、テンプレートキャッシュが有効なとき(config.system.yaml の template_cache が on で、DEBUG_MODE がオフのとき。3系の config.system.yaml の既定は on です)は、インクルードのパスに使えるグローバル変数が %{BCD}・%{CCD}・%{ECD} などに限られます。%{CID} や %{EID} などは使えません。使える変数の一覧は「テンプレートキャッシュについて」を参照してください。
下のコードをご覧ください。
<!-- BEGIN_MODULE Blog_ChildList -->
<ul><!-- BEGIN blog:loop -->
<li><a href="{url}">{name}</a></li>
@include("/admin/entry/categoryblog_{bid}.html")<!-- END blog:loop -->
</ul>
<!-- END_MODULE Blog_ChildList -->ここでは、ブログリストでブログ毎にインクルードをしてこようとしていますが、{bid} はモジュールの変数なのでインクルード文より後で解決されます。
つまり、インクルード文が実行される段階では"blog_{bid}"というファイルを探しにいってしまい、うまく動作しません。