エスケープ
エスケープとは?
モジュールや変数、ブロックはエスケープすることが可能です。 a-blog cms の「エスケープ」とは、モジュールや変数、ブロックを一時的に動かないようにして、処理を遅らせることを指します。 エスケープする際に、処理を遅らせる単位はモジュール1回分になります。(モジュールの入れ子1回分)
これによりカスタムフィールドを動的に生成できたり、柔軟なテンプレートを作成できるようになります。
それでは、モジュール・変数・ブロックのエスケープの仕方を確認し、最後に利用方法の例とともに解説します。
モジュールのエスケープをする方法
通常は内側から実行されますが、モジュールを入れ子する場合は「モジュールのエスケープ」を使うことにより、外側のモジュールから実行できるようになります。
この「モジュールのエスケープ」と「モジュールのコンテキスト指定」を組み合わせることで、例えば Blog_ChildList と Entry_List を組み合わせて、 ブログ毎にエントリー一覧を出力するようなことが出来ます。サイトマップの動的作成などに便利です。
<!-- BEGIN_MODULE Blog_ChildList -->
<ul class="acms-list-group">
<!-- BEGIN blog:loop -->
<li>
<a href="{url}" class="acms-list-group-item">ブログ: {name}</a>
<!-- BEGIN_MODULE\ Entry_List ctx="bid/{id}" -->
<div class="acms-margin-bottom-medium">
<ul class="acms-list-group">
<!-- BEGIN\ entry:loop -->
<li><a href="\{url\}" class="acms-list-group-item">\{title\}</a></li>
<!-- END\ entry:loop -->
</ul>
</div>
<!-- END_MODULE\ Entry_List -->
</li>
<!-- END blog:loop -->
</ul>
<!-- END_MODULE Blog_ChildList -->上記ソースコードの実装の解説
通常であればEntry_Listが実行されてからBlog_ChildListが実行されますが、モジュールのエスケープを使うことでBlog_ChildListが実行された後、Entry_Listが実行されます。Entry__Listを呼び出すモジュールの記述ではbid/{id}と外部コンテキストが指定されていますが、Entry_Listの実行順序をBlog_ChildListの後に実行することにより、Blog_ChildListの{id}が使用可能になることで、Blog_ChildListで一覧になっているブログの数の分だけEntry_Listが作成できます。
変数のエスケープをする方法
中かっこの前にバックスラッシュを挿入し、変数のエスケープができます。
実際の書き方は以下のソースコードを参考にしてください。
\{hoge\}またバックスラッシュの数により、エスケープする数を指定できます。
\\{hoge\\} <!-- エスケープ 2回 -->ブロックのエスケープをする方法
BEGINやENDの後にバックスラッシュを挿入し、ブロックのエスケープができます。※ブロックのエスケープは変数のエスケープと挿入位置が異なるのでご注意ください。
<!-- BEGIN\ hoge --> ... <!-- END\ hoge -->
またバックスラッシュの数により、エスケープする数を指定できます。
<!-- BEGIN\\hoge --> ... <!-- END\\ hoge --> <!-- エスケープ 2回 -->
エスケープを使った利用方法の解説
エスケープを使った利用方法をご紹介します。ここでは、エントリーのカスタムフィールド のセレクトメニューの選択肢をブログのカスタムフィールドグループを使って動的に出力しています。
<!-- BEGIN_MODULE Entry_Body -->
... (ソースコード省略) ...
<td><!-- BEGIN_MODULE Blog_Field -->
<select name="label">
<option value="">ラベルを選択</option><!-- BEGIN item_label:loop -->
<option value="{item_label}"\{label:selected#{item_label}\}>{item_label}</option><!-- END item_label:loop -->
</select>
<input type="hidden" name="field[]" value="label" />
<!-- END_MODULE Blog_Field -->
</td>
... (ソースコード省略) ...
<!-- END_MODULE Entry_Body -->コードを見ていきましょう。モジュールは内側から実行されるので、まずBlog_Fieldが動きます。
そこで、{item_label}が解決されてラベルが設定されていきます。では{label:selected#...}はどうでしょうか?
Blog_Fieldが動いた直後のテンプレートは以下になります。
<select name="label">
<option value="">ラベルを選択</option>
<option value="新製品"{label:selected#新製品}>新製品</option>
<option vlaue="完売"{label:selected#完売}>完売</option>
<option value="在庫限り"{label:selected#在庫限り}>在庫限り</option>
<option value="取寄品"{label:selected#取寄品}>取寄品</option>
<option value="限定品"{label:selected#限定品}>限定品</option>
<option value="季節商品"{label:selected#季節商品}>季節商品</option>
</select>普段書いているようなセレクトメニューのカスタムフィールドのテンプレートになりました。
{label:selected#...}はエスケープされているので、Blog_Fieldが動いた直後はまだ解決されません。バックスラッシュは1個なので、Blog_Fieldが動いた後に{label:selected#...}は通常の変数として解決され、動作します。
このようにエスケープをうまく使うことにより、カスタムフィールドの項目を動的に表示することが可能になります。