2

我的应用程序需要在运行时支持多个客户。它们都将显示相同的数据,使用相同的控制器、服务,但具有不同的布局、css 和图像。

我的基本思路如下:

1) 有一个过滤器来验证并在会话中设置一个配置值 2) 我的控制器代码将按照以下方式调用一些东西:render(view:"/${session.userContext}/test/test")

所以对于 customer1,我们将渲染:views/customer1/test/test.gsp

理想情况下,我希望在 /views/customer1/ 目录中拥有所有自定义视图和布局,但站点网格在 /views/layouts 目录中查找布局,但我找不到解决方法。从这个意义上说,解决方案有点笨拙,因为我没有得到我想要的隔离级别。

理想的情况是,如果我可以在运行时设置 grails 渲染方法的根,例如,而不是从视图开始,查看 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

Checkout the Multi-Tenant plugin - 看起来它也可以帮助您完成应用程序的其余部分。

您必须通过传入布局名称来处理从控制器 指定布局<meta name="layout" content="$layoutName">- > 我认为您无法在不覆盖默认布局装饰器映射 bean 的情况下让 Grails 隔离您的布局。

于 2009-12-07T19:07:21.410 回答