実行順序

テンプレートファイル上での実行順序

テンプレートエンジンの実行順序は以下のようになります。

  1. グローバル変数を解決
  2. インクルード処理を解決
  3. setTemplateを処理(テンプレートの変数化)
  4. getTemplateを解決(変数の挿入)
  5. タッチモジュールを解決(デフォルトON)
  6. モジュール類を内側から解決(同じ階層の場合は下から)
  7. IFブロックを解決
  8. setRenderedを処理(解決済テンプレートを変数化)
  9. getRenderedを解決(変数の挿入)

テンプレートの実行順序を頭に入れておく事はテンプレートを作成していく上で非常に重要になってきます。
例えば、インクルード文を書くときに、グローバル変数を使ったパスで指定するテクニックがあります。

今 @include("/admin/entry/category%{CID}.html")
旧 <!--#include file='/admin/entry/category%{CID}.html'-->

上のコードは、正常に動きますが、これはグロバール変数が解決された後にインクルードが動くためです。
下のコードをご覧ください。

<!-- 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}"というファイルを探しにいってしまい、うまく動作しません。

グローバル変数の作り方

※この記事の内容は2015年11月に開催された a-blog cms Training Camp 2015 Autumn の中で行われたグローバル変数の作り方講座の内容です。

グローバル変数

グローバル変数は、テンプレートに記述することで、表示中のページが持つ情報を出力します。テンプレート上、モジュールやインクルードよりも先に処理されます。
利用できるグローバル変数の一覧

パスの書き換え

a-blog cmsでは /themes/テーマ/ が ドキュメントルート的な扱いになります。 しかし、このままではパスがおかしくなるので、パスの書き換えを行っています。 a-blog cmsでは、この機能により静的なサイトをそのまま themes に入れても動くようになっております。

書き換えるもの

パスの書き換えには2種類あります。 ファイル指定するものと、アンカー類です。

ファイル指定するもの

  • <!-- include file="" -->
  • src属性をもつHTML要素 ( img|input|script|frame|iframe )
  • srcset属性
  • link要素
  • object, applet要素
  • background属性

パス書き換え仕様(ファイル指定)

  • 何らかのスキーマ(http://等)から始まっているものは書き換えない
  • "/"のみの場合は書き換えない
  • "/"から始まるパスはドキュメントルートから探索しみつかった場合は書き換えない
  • "/"から始まるパスでa-blog cms設置ディレクトリから探索しみつかった場合は書き換え
  • "/”から始まらない場合はそのテンプレートからの相対パスで検索しみつかった場合は書き換え
  • 上記のどれにも当てはまらない場合は継承テーマから探索しみつかった場合は書き換え

上から優先度が高くなります

アンカー類

  • a要素のhref属性
  • form要素のaction属性

パス書き換え仕様(アンカー類)

  • 空の場合は書き換えない
  • 何らかのスキーマ(http://等)から始まっているものは書き換えない
  • "#"から始まるパスは書き換えない
  • "/"から始まらないパスは書き換えない
  • ディレクトリをほってa-blog cmsが設置してある場合、そのディレクトリのパスから始まっている場合は書き換えない
  • 上記のどれにも当てはまらない場合は、ブログコードからのパスに書き換える

上から優先度が高くなります

書き換えをしたくない場合

このパスの書き換えは便利な機能なのですが、時に書き換えを行ってほしくない場合があります。 例えば、すべてのブログで共通するグローバルナビゲーションなどです。

注意 このオプションはアンカー類のパス書き換えのみになります。

<a href="/">HOME</a>

上の例ではトップページへのリンクのつもりで書いてますが、子ブログにこのコードがあると、 http://ドメイン/子ブログのコード/ のように、そのブログのトップページへのリンクに書き変わってしまいます。

書き換えを行わないようにするには

パスを書き換えたくない場合は、その要素に"acms_no_rewrite"という属性を追加すると書き換えを行わなくなります。

<a href="/" class="acms_no_rewrite">HOME</a>

上の例では classの値で設定をしておりますが、他の指定方法でも動作します。(独自データ属性など) また、"acms_no_rewrite"の識別子を変更したい場合は、config.system.yaml

acms_no_rewrite : 変更後識別子

として頂ければ変更できるようになっています。