[play1-template] includeタグで対象ファイルが存在しない場合への対処

  playframework1

includeタグを使うと外部ファイルをインクルードすることができます。
通常はファイルが存在することを前提にすると思いますが、たとえばプロパティ値や変数を使って動的に読み込むファイル名を決めるような高度な使い方も考えられます。

対処と言っても難しいことはなく、ファイルが存在しない場合はTemplateNotFoundException例外が発生するので、下記のように、trycatch で例外を捕捉するだけでよいです。

%{ try { %}
  #{include 'adm/'+type.name+'/list.custom.html' /}
%{ } catch (play.exceptions.TemplateNotFoundException e) { }%
  ファイル読み込みできませんでした.
%{ } }%

カスタムタグ

せっかっくなので安全なインクルードを行うカスタムタグを作ってみました。エラーにならず代替文字を表示します。

%{
  try {
    (_arg ) && (_src = _arg);
    if (!_src) {
        throw new play.exceptions.TagInternalException("src attribute cannot be empty for safeInclude tag");
    }
%}
#{include _src /}
%{
  } catch (play.exceptions.TemplateNotFoundException e) {
}%
  #{doBody/}
%{
  }
}%

使い方1

ファイルが見つからないときはスルーします。

#{safeInclude 'myfile.txt' /}

使い方2

ファイルが見つからないときは指定したエラーメッセージに置換します。

#{safeInclude 'myfile.txt' }ファイルが見つかりません#{/safeInclude}

LEAVE A COMMENT