1

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

所以我尝试使用类似中间件的 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 总是报告用户是匿名的。

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

提前致谢。

4

1 回答 1

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、通过出版物遍历以外的代码查找的视图等都可以使用您的标记界面进行更改。

于 2012-10-27T10:44:27.127 回答