2

私のアプリは、実行時に複数の顧客をサポートする必要があります。それらはすべて、同じコントローラー、サービスを使用して同じデータを表示しますが、レイアウト、CSS、および画像が異なります。

私の基本的な考え方は次のとおりです。

1) セッションで構成値を認証および設定するためのフィルターを用意する 2) 私のコントローラー コードは次の行に沿って何かを呼び出します: render(view:"/${session.userContext}/test/test")

したがって、customer1 については、views/customer1/test/test.gsp をレンダリングします。

理想的には、すべてのカスタム ビューとレイアウトを /views/customer1/ ディレクトリに置きたいのですが、サイト メッシュは /views/layouts ディレクトリでレイアウトを探しますが、これを回避する方法が見つかりません。この意味で、必要なレベルの分離が得られないため、ソリューションは少し不格好です。

理想的なのは、実行時に grails render メソッドのルートを設定できる場合です。たとえば、ビューから開始する代わりに、views/customer1 を見てください。これを行う方法はわかりませんが、彼は最も賢いソリューションのようです。

どんな助けでも大歓迎です。

乾杯、

ガブ

4

2 に答える 2

2

GrailsLayoutDecoratorMapperのサブクラスの作成を検討することをお勧めします。完全な HttpServletRequest にアクセスできるため、ある顧客を別の顧客と区別する方法 (ドメイン、セッション変数など) に応じて、異なるビューをレンダリングできます。現在のリクエストに対して適切なビュー/レイアウトを判断できない場合は、単に GrailsLayoutDecoratorMapper に委譲して、デフォルトの動作を維持することができます。

カスタム DecoratorMapper を構成するには、/web-app/WEB-INF/sitemesh.xml を変更し、デフォルト<mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" />をカスタム実装に置き換える必要があります。

于 2009-12-07T19:04:05.660 に答える
1

Multi-Tenant プラグインを確認してください - アプリの残りの部分でも同様に役立つようです。

レイアウト名を渡すことにより、コントローラーから レイアウトを指定する必要があります-><meta name="layout" content="$layoutName"> デフォルトのレイアウトデコレーターマッピングBeanをオーバーライドせずに、Grailsにレイアウトを分離させることができるとは思いません。

于 2009-12-07T19:07:21.410 に答える