[Zope-CMF] Re: Working with Zope 3 skin layers

Philipp von Weitershausen philipp at weitershausen.de
Wed May 28 09:44:03 EDT 2008


Charlie Clark wrote:
> Am 28.05.2008 um 13:02 schrieb Philipp von Weitershausen:
> 
>> Views don't "use" layers. You apply a skin layer to the request, and 
>> depending on whether the view was registered for this skin layer or 
>> any of the layers that are contained in that skin layer, the view will 
>> be found.
> 
> Thanks, that's the explanation I was missing - I hope I'm not the only 
> one who doesn't quite understand what is adapting what when a view is 
> called. 8-)

Um, this is explained in detail in my book. Views are always looked up 
like this:

   getMultiAdapter( (context, request), name="foo.html" )

(whitespace added for clarification.)

So by applying marker interfaces to the request, we can change the 
output of that adaption. See pages 168-169 in my book.

>>> Is it possible to get individual views to use different skins without 
>>> using ++skin++ in the URL?
>>
>> That doesn't make any sense to me and it's not how the CMF works 
>> either. In the CMF you may put different views in different skin 
>> layers (i.e. folders), but then you always combine them to a skin (in 
>> "Properties" page of the portal_skins tool where you enter a list of 
>> folders that make up the skin). For instance, you may have the 
>> following skin definition there:
>>
>> Default = custom
>>          something_else
>>          cmf_default
>>
>> This is very similar to Zope 3, except that we now have interfaces, 
>> e.g. ICMFDefaultSkin, ISomethingElse and IMyCustomLayer. You'd now 
>> register views for those layer interfaces (probably just for 
>> IMyCustomLayer) and then combine those layer interfaces in a skin 
>> interface, which is then given a name using the <interface /> 
>> directive and then registered as the default skin:
>>
>> class IMySkin(ICustom, ISomethingElse, ICMFDefaultSkin):
>>    pass
>>
>>
>> <interface interface="...IMyDefaultSkin"
>>           type="zope.publisher.interfaces.browser.IBrowserSkinType"
>>           name="MySkin"
>>           />
>>
>> <browser:defaultSkin name="MySkin" />
> 
> Okay, this is starting to make sense. Layers and skins are confusing 
> especially as they are all just interfaces!

That's what's so easy about them!

> :-O When does the skin name get used apart from in ++skin++ urls?

Wherever you'd like to use it. Perhaps you'd like to show a list of 
available skins to the user so that s/he can choose one.

> Views are still registered to layers, ie. interfaces, aren't they?

Yep.

> What I had been expecting to work, but which I think I now understand 
> why it wouldn't, was the ability to add a layer for something like an 
> "administration" layer which would call a version of standard_macros 
> specific to that layer. I was hoping to be able to change this simply in 
> ZCML rather than in the templates, ie. configure the views I want to use 
> a different "skin". Instead, it seems, I need to write and register my 
> own macros and change those templates that need to use them. Not sure 
> whether this is entirely the right way to go about this, as opposed to 
> using a viewlet to do it but as least I've got it to work.

I'm not quite sure I'm following you here. Often skins mostly contain 
custom macros, meaning all views are registered for some default layer 
(e.g. IDefaultBrowserLayer) and they look up macros using 
context/@@standard_macros. Then it's up to the specific skin to provide 
a standard_macros view. This is the one that defines the look and feel 
of the site and therefore changes from skin to skin.

This is exactly what my book explains and does (see Exapmles 10.3.2 and 
30.3.3)! Forgive my bluntness, but it's hard to believe at this point 
you've read it...


> You're welcome. For the fourth edition, and I hope there will be one, it 
> might be an idea to add a couple of paragraphs from above to clarify 
> customisation by adding a layer, ie. where world_cookery inherits from 
> Rotterdam and where it differs.

The IWorldcookerySkin interface doesn't inherit from Rotterdam. And to 
be honest, I wouldn't know what else to write. I even have a "Flashback" 
box that compares Zope 3 style layers to CMF layers and skins on page 
173. And what I've written in the two previous emails were mostly 
rephrased passages from my book anyway.



More information about the Zope-CMF mailing list