根据用户角色更改Diazo主题元素

时间:2013-07-18 16:24:30

标签: plone diazo

是否可以使Diazo主题的元素取决于Plone中的用户角色?例如:我想在主题中为某些特定角色提供不同的标题图像,并在用户登录后立即在网站上进行这些更改。

This question可能是相关的,但我更愿意仅通过角色分配来管理它。

2 个答案:

答案 0 :(得分:5)

这可以通过指定theme parameter来实现。未经测试,但您可以定义如下参数:

roles = python: portal_state.member().getRolesInContext(context)

或类似的东西:

is_manager = python: 'Manager' in portal_state.member().getRolesInContext(context)

然后在rules.xml文件中使用该参数。这会为管理者切换主题:

<notheme if="$is_manager" />

这对标题没有任何作用,但你应该可以从中推断。

答案 1 :(得分:1)

如果您知道如何处理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