Plone 不同用户的不同皮肤

Plone 不同用户的不同皮肤,plone,Plone,我正在尝试根据当前用户对请求应用标记接口。这个想法是根据用户的喜好提供不同的皮肤 所以我试着用。在configure.zcml中: <subscriber for="Products.CMFCore.interfaces.ISiteRoot zope.traversing.interfaces.IBeforeTraverseEvent" handler=".layer.mark_layer" /> 问题是plone总是报告用户是匿名的 那么

我正在尝试根据当前用户对请求应用标记接口。这个想法是根据用户的喜好提供不同的皮肤

所以我试着用。在configure.zcml中:

<subscriber
    for="Products.CMFCore.interfaces.ISiteRoot
         zope.traversing.interfaces.IBeforeTraverseEvent"
    handler=".layer.mark_layer"
    />
问题是plone总是报告用户是匿名的

那么,在这种情况下,我如何应用标记接口呢


提前感谢。

只有在遍历完成后才能确定用户。在Plone中,用户的身份验证和授权取决于上下文,在遍历完成之前无法确定

因此,您必须在遍历后钩住
IPubAfterTraversal
;遍历完成并确定用户后,它将传递请求

<subscriber
    for="ZPublisher.interfaces.IPubAfterTraversal"
    handler=".layer.mark_layer"
    />
明确地说:这意味着您不能根据经过身份验证的用户更改遍历期间找到的对象,因为身份验证是在遍历完成后进行的。渲染开始后,用户已通过身份验证

这意味着您不能为每用户主题注册页面,并希望能够在URL路径(
/path/to/context/@@user-specific-page
)中使用该页面。当然,在响应渲染过程中查找的任何内容都是公平的,所以Viewlet、Portlet、由代码(而不是发布遍历)查找的视图等都可以使用标记接口进行更改

<subscriber
    for="ZPublisher.interfaces.IPubAfterTraversal"
    handler=".layer.mark_layer"
    />
from zope.app.component.hooks import getSite

def mark_layer(event):
    site = getSite()
    request = event.request
    portal_state = getMultiAdapter((site, request), name="plone_portal_state")
    # etc.