2012-10-27 7 views
1

J'essaie d'appliquer une interface de marqueur aux demandes en fonction de l'utilisateur actuel. L'idée est d'offrir différents skins en fonction des préférences de l'utilisateur.Différents habillages pour différents utilisateurs

J'ai donc essayé d'utiliser Middleware-like hooks. En configure.zcml:

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

Et 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... 

Le problème est que plone signale toujours que l'utilisateur est anonyme.

Alors, dans ces circonstances, comment pourrais-je appliquer l'interface du marqueur?

Merci d'avance.

Répondre

3

L'utilisateur n'est pas déterminé avant que après la traversée ait eu lieu. Dans Plone, l'authentification et l'autorisation d'un utilisateur dépendent du contexte et ne peuvent pas être déterminées avant la fin de la traversée.

Ainsi, vous devez vous connecter au IPubAfterTraversal à la place; la requête est passée après la fin de la traversée et la détermination d'un utilisateur.

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

Vous devrez récupérer le portail en utilisant la fonction getSite() à la place:

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. 

Pour être explicite: Cela signifie que vous ne peut pas varier l'objet trouvé lors de la traversée en fonction de l'utilisateur authentifié, car l'authentification a lieu après la traversée est terminée. Une fois le rendu commencé, l'utilisateur a été authentifié. Cela signifie que vous ne pouvez pas enregistrer une page pour votre thème par utilisateur et que vous prévoyez d'utiliser cette page dans un chemin d'accès URL (/path/to/context/@@user-specific-page). Tout ce qui est recherché pendant le rendu de la réponse est bien entendu un jeu équitable, donc les vues, les portlets, les vues recherchées par un code autre que la traversée de publication, etc. peuvent toutes être modifiées à l'aide de votre interface de marqueur.

Questions connexes