play フレームワークでカスタムタグを作成するには 2 つの方法があります。
- app/view/tags で groovy テンプレートを定義することによって
- クラスに FastTags を拡張させることにより、純粋な Java で直接
最新のものは文書化されていません。
play フレームワークでカスタムタグを作成するには 2 つの方法があります。
最新のものは文書化されていません。
したがって、JavaExtensions クラスを拡張して JavaExtensions が機能するのと同様に、FastTag を作成するには、FastTags を拡張するクラスを作成する必要があります。タグとして実行する各メソッドは、次のメソッド構造に準拠する必要があります。
public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)
タグ名の前のアンダースコアに注意してください。
実際のタグを作成する方法を理解する最も簡単な方法は、FastTag のソース コードを見て、実際に動作する様子を確認することです。
これはgitハブから直接ソースです。 https://github.com/playframework/play/blob/master/framework/src/play/templates/FastTags.java
以下は、これがどのように機能するかを説明できるように、コピーしたものです。
public static void _verbatim(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
out.println(JavaExtensions.toString(body));
}
したがって、この最初のメソッドはverbatimタグであり、単純に JavaExtensions で toString メソッドを呼び出し、タグの本体に渡します。タグの本文は、開始タグと終了タグの間の任意のものになります。そう
<verbatim>My verbatim</verbatim>
本体値は
My verbatim
2 番目の例は、もう少し複雑です。親タグに依存して機能するタグです。
public static void _option(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
Object value = args.get("arg");
Object selectedValue = TagContext.parent("select").data.get("selected");
boolean selected = selectedValue != null && value != null && selectedValue.equals(value);
out.print("<option value=\"" + (value == null ? "" : value) + "\" " + (selected ? "selected=\"selected\"" : "") + "" + serialize(args, "selected", "value") + ">");
out.println(JavaExtensions.toString(body));
out.print("</option>");
}
このコードは、HTML オプション タグを出力することによって機能し、親タグから選択された値を確認することによって、選択された値を設定します。最初の 3 行はデータを取得し、データを出力できるようにセットアップします。そして、最後の 3 行はタグの結果を出力します。
私がリンクしたソース コードには、さまざまな程度の複雑さでさらに多くの例がありますが、これが良い出発点になることを願っています。
タグがプロジェクト間で、またはコア Play タグと競合しないようにするために、クラス レベルのアノテーション @FastTags.Namespace を使用して名前空間を設定できます。
したがって、hello タグの場合、my.tags の名前空間で、次のようにします。
@FastTags.Namespace("my.tags")
public class MyFastTag extends FastTags {
public static void _hello (Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
...
}
}
次に、テンプレートで hello タグを次のように参照します。
#{my.tags.hello/}