[Zope-CMF] Re: Finding the current skin name

Florent Guillaume fg at nuxeo.com
Wed Nov 2 19:35:13 EST 2005


Could you expand a bit on the use case ? I'm not sure I get what you 
want do to, do you change skins several times in the middle of the 
request ? In what way is this skin needed afterward, at what point ? 
What's a "correct" skin ?

Florent

Laurence Rowe wrote:
> In Plone ResourceRegistries (1.1 branch) I need to get the current skin 
> name so that the resource (a css or js file) is fetched from the correct 
> skin. Unfortunately it seems that there is no easy way to get the 
> current skin name (when it is not set by a cookie in the request). I can 
> work around this like follows, but it's a bit ugly:
> 
> 
>     security.declareProtected(permissions.View, 'getCurrentSkinName')
>     def getCurrentSkinName(self):
>         """Returns the id of the current skin.
> 
>         Ugh, there really should be a better way of doing this. This is
>         depending on internals in CMFCore and should be added there.
>         """
>         skintool = getToolByName(self, 'portal_skins')
>         default_skin_name = skintool.getDefaultSkin()
>         tid = get_ident()
>         if SKINDATA.has_key(tid):
>             skinobj, ignore, resolve = SKINDATA.get(tid)
>             current_skin_path = skinobj.getPhysicalPath()
> 
>             #
>             # Perhaps test against default skin first?
>             #
> 
>             skinnames = skintool.getSkinSelections()
> 
>             # loop through skin names looking for a match
>             for name in skinnames:
>                 skin = skintool.getSkinByName(name)
>                 path = skin.getPhysicalPath()
>                 if current_skin_path == path:
>                     return name
> 
>         return default_skin_name
> 
> Would it be reasonable to make 
> Skinnable.SkinnableObjectManager.changeSkin set the skin request var 
> name after changing the skin? Such as:
> 
>     security.declarePublic('changeSkin')
>     def changeSkin(self, skinname):
>         '''Change the current skin.
> 
>         Can be called manually, allowing the user to change
>         skins in the middle of a request.
>         '''
>         skinobj = self.getSkin(skinname)
>         if skinobj is not None:
>             tid = get_ident()
>             SKINDATA[tid] = (skinobj, {}, {})
>             REQUEST = getattr(self, 'REQUEST', None)
>             if REQUEST is not None:
>                 REQUEST._hold(SkinDataCleanup(tid))
>                 sfn = self.getSkinsFolderName()
>                 if sfn is not None:
>                     sf = getattr(self, sfn, None)
>                     if sf is not None:
>                         REQUEST.set(sf.getRequestVarname(), skinname)
> 
> Then getSkinNameFromRequest would work happily. Or is the a better way 
> to do this?
> 
> Regards,
> 
> Laurence
> 
> _______________________________________________
> Zope-CMF maillist  -  Zope-CMF-lEa0QfImRKZ5o+NzvwT5Tw at public.gmane.org
> http://mail.zope.org/mailman/listinfo/zope-cmf
> 
> See http://collector.zope.org/CMF for bug reports and feature requests
> 


-- 
Florent Guillaume, Nuxeo (Paris, France)   Director of R&D
+33 1 40 33 71 59   http://nuxeo.com   fg at nuxeo.com


More information about the Zope-CMF mailing list