1

現在のユーザーに応じて、マーカー インターフェイスをリクエストに適用しようとしています。アイデアは、ユーザーの好みに応じてさまざまなスキンを提供することです.

そこでミドルウェア的なフックを使ってみました。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) で使用できると期待できます。もちろん、レスポンスのレンダリング中に検索されたものはすべて公正なゲームであるため、ビューレット、ポートレット、パブリケーション トラバーサル以外のコードによって検索されたビューなどはすべて、マーカー インターフェイスを使用して変更できます。

于 2012-10-27T10:44:27.127 に答える