[Zope-CMF] Finding the current skin name

Laurence Rowe l at lrowe.co.uk
Fri Oct 28 09:31:42 EDT 2005


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



More information about the Zope-CMF mailing list