エスケープ

エスケープとは?

モジュールや変数、ブロックはエスケープすることが可能です。 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回 -->

ブロックのエスケープをする方法

BEGINENDの後にバックスラッシュを挿入し、ブロックのエスケープができます。※ブロックのエスケープは変数のエスケープと挿入位置が異なるのでご注意ください。

<!-- 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#...}は通常の変数として解決され、動作します。

このようにエスケープをうまく使うことにより、カスタムフィールドの項目を動的に表示することが可能になります。