Как справиться с несколькими клиентами в одном приложении Grails с индивидуальным подходом?
Мое приложение должно поддерживать несколько клиентов во время выполнения. Все они будут отображать одни и те же данные, используя одни и те же контроллеры, сервисы, но с разным расположением, css и изображениями.
Моя основная идея заключается в следующем:
1) Имейте фильтр для аутентификации и установите значение конфигурации в сеансе. 2) Мой код контроллера будет вызывать что-то вроде этого: render(view:"/${session.userContext}/test/test")
Поэтому для customer1 мы будем рендерить: views/customer1/test/test.gsp
В идеале я хотел бы иметь все пользовательские представления и макеты в каталоге /views/customer1/, но сетка сайта ищет макеты в каталоге / views / layouts, и я не могу найти способ обойти это. В этом смысле решение немного неуклюже, так как я не получаю желаемый уровень изоляции.
Что было бы идеально, если бы я мог установить корень метода рендеринга grails во время выполнения, например, вместо того, чтобы начинать с представлений, посмотрите на views / customer1, увы, я понятия не имею, как это сделать, но он кажется самым умным решением.
Любая помощь будет высоко ценится.
Ура,
Гав
2 ответа
Я бы порекомендовал посмотреть на создание подкласса GrailsLayoutDecoratorMapper. Поскольку у вас есть доступ к полному HttpServletRequest, вы можете отобразить другое представление в зависимости от того, как вы отличаете одного клиента от другого (домен, переменная сеанса и т. Д.). Если вы не можете определить правильный вид / макет для текущего запроса, вы можете просто делегировать GrailsLayoutDecoratorMapper, чтобы сохранить поведение по умолчанию.
Чтобы настроить собственный DecoratorMapper, вам нужно изменить /web-app/WEB-INF/sitemesh.xml и заменить значение по умолчанию <mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" />
с вашей пользовательской реализацией.
Проверьте плагин Multi-Tenant. Похоже, он может помочь вам в остальной части вашего приложения.
Вам придется обрабатывать указание макетов из контроллера, передавая имя макета -> <meta name="layout" content="$layoutName">
Я не думаю, что вы сможете заставить Grails изолировать ваши макеты без переопределения стандартного bean-компонента Layout Decorator Mappings.