Как работать с несколькими клиентами в одном приложении Grails с индивидуальным подходом? - PullRequest
2 голосов
/ 07 декабря 2009

Мое приложение должно поддерживать несколько клиентов во время выполнения. Все они будут отображать одни и те же данные, используя одни и те же контроллеры, сервисы, но с разным расположением, CSS и изображениями.

Моя основная идея заключается в следующем:

1) Наличие фильтра для аутентификации и установки значения конфигурации в сеансе 2) мой код контроллера будет вызывать что-то вроде этого: render (view: "/ $ {session.userContext} / test / test")

Итак, для customer1 мы будем отображать: views / customer1 / test / test.gsp

В идеале я хотел бы иметь все пользовательские представления и макеты в каталоге / views / customer1 /, но сетка сайта ищет макеты в каталоге / views / layouts, и я не могу найти способ обойти это. В этом смысле решение немного неуклюже, так как я не получаю желаемый уровень изоляции.

Что было бы идеально, если бы я мог установить корень метода рендеринга grails во время выполнения, например вместо того, чтобы начинать с представлений, посмотрите на views / customer1, увы, я понятия не имею, как это сделать, но его решение кажется самым умным.

Любая помощь будет высоко ценится.

Приветствия

Гав

Ответы [ 2 ]

2 голосов
/ 07 декабря 2009

Я бы рекомендовал изучить создание подкласса GrailsLayoutDecoratorMapper . Поскольку у вас есть доступ к полному HttpServletRequest, вы можете отобразить другое представление в зависимости от того, как вы отличаете одного клиента от другого (домен, переменная сеанса и т. Д.). Если вы не можете определить правильный вид / макет для текущего запроса, вы можете просто делегировать GrailsLayoutDecoratorMapper, чтобы сохранить поведение по умолчанию.

Чтобы настроить собственный DecoratorMapper, вам нужно изменить /web-app/WEB-INF/sitemesh.xml и заменить значение по умолчанию <mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" /> на ваше собственное внедрение.

1 голос
/ 07 декабря 2009

Проверьте плагин Multi-Tenant - похоже, он может помочь вам и в остальной части вашего приложения.

Вам придется обрабатывать указание макетов из контроллера, передавая имя макета -> <meta name="layout" content="$layoutName"> Я не думаю, что вы сможете заставить Grails изолировать ваши макеты без переопределения bean-компонента Layout Decorator Mappings по умолчанию.

...