0

君の力が必要!

タイトルが説明的であることを願っていますが、ここに詳細があります

5 つの Web アプリケーションがあり、それらが 5 つの異なるフレームワークで完了したとしましょう。それらの 1 つは、playframework を使用することです。さて、5 つの Web サイトすべてをブランド変更するには膨大な時間がかかるため、1 つのレイアウト テンプレートを HTML ページとしてホストし、その中に <% doLayout %> play タグを含めることにしました。

このレイアウトはプレイ アプリケーションのソース コードの一部であるため、このレイアウトを使用する方法が必要です。API ドキュメントを読んで、VirtualFile クラス ( VirtualFile API Docs ) を見つけました。ドキュメントは非常に簡潔であり、ドキュメントからこのクラスの目的が何であるかはわかりませんが、私の場合に役立つ機能が含まれていることがわかります...

以下は、動作中の同じクラスですが、.NET です。私は少し前にそのような統合を行いましたが、今ではプレイフレームワークでも必要です。また、以下のリンクの例は zip アーカイブから提供されますが、VirtualPathProviders を使用すると、どこからでもテンプレートを提供できます。

ソリューションにVirtualFileを含める必要はありませんが、プラグアンドプレイである必要があります。

注: playframework 1.2.1 を使用しています

ありがとう

4

1 に答える 1

0

問題の解決策は見つかりましたが、仮想ファイル クラスでは見つかりませんでした。extendビューのタグを置き換えるカスタムタグをプレイ中に作成すると、うまくいきません。

Play のソース コードを見ると、既存の FastTags クラスの 319 行がどのように機能するかを確認できます。

public static void _extends(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
    try {
        if (!args.containsKey("arg") || args.get("arg") == null) {
            throw new TemplateExecutionException(template.template, fromLine, "Specify a template name", new TagInternalException("Specify a template name"));
        }
        String name = args.get("arg").toString();
        if (name.startsWith("./")) {
            String ct = BaseTemplate.currentTemplate.get().name;
            if (ct.matches("^/lib/[^/]+/app/views/.*")) {
                ct = ct.substring(ct.indexOf("/", 5));
            }
            ct = ct.substring(0, ct.lastIndexOf("/"));
            name = ct + name.substring(1);
        }
        BaseTemplate.layout.set((BaseTemplate) TemplateLoader.load(name));
    } catch (TemplateNotFoundException e) {
        throw new TemplateNotFoundException(e.getPath(), template.template, fromLine);
    }
}

TemplateLoader.load(String, String)テンプレートを文字列として受け入れ(元の実装のファイル名と比較して)、メソッドに設定 するオーバーロードされたメソッドを使用するだけですBaseTemplate.layout.set(...)。もちろん、まず HTTP リクエストを介してリモート サーバーからテンプレートを取得する必要があります。

于 2012-08-14T02:00:41.433 に答える