エスケープ
エスケープとは?
モジュールや変数、ブロックはエスケープすることが可能です。 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#...}
は通常の変数として解決され、動作します。
このようにエスケープをうまく使うことにより、カスタムフィールドの項目を動的に表示することが可能になります。