Если вы знаете, как обрабатывать код Python и создавать представление в браузере, вы можете определить представление браузера, которое возвращает некоторые css. Я использовал следующий код в клиентском проекте для вставки некоторого css, который устанавливает в качестве фона ближайший header.jpg
, поэтому вы можете иметь разные фоны в разных разделах.
В configure.zcml:
<browser:page
for="*"
permission="zope.Public"
name="header-image-css"
class=".utils.HeaderImageCSS"
/>
В качестве utils.py файла:
HEADER_IMAGE_CSS = """
#portal-header {
background: url("%s") no-repeat scroll right top #FFFFFF;
position: relative;
z-index: 2;
}
"""
class HeaderImageCSS(BrowserView):
"""CSS for header image.
We want the nearest header.jpg in the acquisition context. For
caching it is best to look up the image and return its
absolute_url, instead of simply loading header.jpg in the current
context. It will work, but then the same image will be loaded by
the browser for lots of different pages.
This is meant to be used in the rules.xml of the Diazo theme, like this:
<after css:theme="title" css:content="style" href="@@header-image-css" />
Because we set the Content-Type header to text/css, diazo will put
a 'style' tag around it. Nice.
"""
def __call__(self):
image = self.context.restrictedTraverse('header.jpg', None)
if image is None:
url = ''
else:
url = image.absolute_url()
self.request.RESPONSE.setHeader('Content-Type', 'text/css')
return HEADER_IMAGE_CSS % url
Для вашего случая использования вы могли бы получить роль, как это и затем возвращать различные CSS на основе этой информации (код непроверен):
def __call__(self):
from zope.component import getMultiAdapter
pps = getMultiAdapter((self.context, self.request), name='plone_portal_state')
member = pps.member()
roles = member.getRolesInContext(self.context)
css = "#content {background-color: %s}"
if 'Manager' in roles:
color = 'red'
elif 'Reviewer' in roles:
color = 'blue'
else:
color = 'yellow'
self.request.RESPONSE.setHeader('Content-Type', 'text/css')
return css % color
Ничего себе! Я поражен тем, насколько прост и силен этот способ работы. Вы также используете другой пример, но настройка условий через диазо-тему напрямую происходит быстрее и проще. Для тех, кто пытается это сделать: обязательно перезапустите plone после изменения файла rules.xml. Перезагрузки css недостаточно для распространения изменений. – FvD