playframework1‎ > ‎template‎ > ‎

includeタグで一回だけ読み込む

C言語でヘッダファイルを何度も読み込まないためのテクニック。あれの Play!テンプレート版です。
C言語の場合は下記のように記述しますよね。
 
#ifndef _mylib_h_
#define _mylib_h_
 
    /* 本文 */
 
#endif
 
"_mylib_h_" が未定義ならヘッダの /* 本文 */ を読み込み、定義済なら無視するという仕組みです。
これをPlay!のテンプレートエンジンで実現しようとすると下記のようになります。

get/setで実現する

 

#{get '_mylib_h_'}

 
    <!-- 本文 -->
 
#{/get}
#{set _mylib_h_:'' /}
 
頭の部分で #{get}"_mylib_h_" という変数の出力を試みます。
#{get}では、指定の変数が未定義のときはタグで挟まれた <!-- 本文 --> が出力されます。
その後、#{set}"_mylib_h_" 変数を定義しつつ、中身を空にしておきます。 #{set '' /} と一文にまとめないのがポイントです。
 
こうすることで次の読込では、変数 "_mylib_h_" は定義済と判断されるのでタグで囲まれた部分ではなく変数の中身が出力されます。
しかし変数の中身は空っぽなので何も出力されないことになります。
 
本文の内容が一時的にでも、変数"_mylib_h_" に設定されることになると思うので、気になるのであれば次の方法で。

ifnot/setで実現する

素直にifnotで実現すると下記のようになります。

#{ifnot _mylib_h_}

#{set _mylib_h_:'defined' /}


    <!-- 本文 -->
 
#{/ifnot}
変数"_mylib_h_" に設定する値は何でもいいですが、空文字だとダメなので何かしら設定する必要があります。