25

play フレームワークでカスタムタグを作成するには 2 つの方法があります。

  1. app/view/tags で groovy テンプレートを定義することによって
  2. クラスに FastTags を拡張させることにより、純粋な Java で直接

最新のものは文書化されていません。

4

1 に答える 1

23

したがって、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/}
于 2010-11-09T17:54:27.333 に答える