不同用户的不同皮肤

时间:2012-10-27 01:21:53

标签: plone

我正在尝试将标记接口应用于请求,具体取决于当前用户。我们的想法是根据用户的喜好提供不同的皮肤。

所以我尝试使用Middleware-like hooks。在configure.zcml中:

<subscriber
    for="Products.CMFCore.interfaces.ISiteRoot
         zope.traversing.interfaces.IBeforeTraverseEvent"
    handler=".layer.mark_layer"
    />

在layer.py中

def mark_layer(portal, event):
    '''Conditional marking of the request according to the user 
    preferences.'''
    request = event.request
    portal_state = getMultiAdapter((portal, request), name="plone_portal_state")

    anon = portal_state.anonymous()
    print anon, portal.portal_membership.isAnonymousUser()
    # more code here...

问题是plone总是报告用户是匿名的。

那么,在这种情况下,我该如何应用标记界面?

提前致谢。

1 个答案:

答案 0 :(得分:3)

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

因此,你必须加入IPubAfterTraversal;在遍历完成并确定用户后,它会被传递。

<subscriber
    for="ZPublisher.interfaces.IPubAfterTraversal"
    handler=".layer.mark_layer"
    />

您必须使用getSite()函数来检索门户网站:

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.

要明确:这意味着无法根据经过身份验证的用户改变在遍历期间找到的对象,因为在遍历完成后进行身份验证。渲染开始后,用户已经过身份验证。

这意味着您无法为每个用户主题注册一个页面,并希望能够在URL路径(/path/to/context/@@user-specific-page)中使用该页面。在响应呈现期间查找的任何内容当然都是公平的游戏,因此使用标记界面可以改变除了发布遍历等代码查看的Viewlet,portlet,视图。