[Zope-dev] Default skin pain

Philipp von Weitershausen philipp at weitershausen.de
Sat Mar 18 04:34:57 EST 2006


Hi there,

Zope 3 has the concept of a default layer. This is a request interface
that most skins derive from. It is also the default request interface
that browser views are registered for if they don't specify another one
using the 'layer' argument.

Zope 3 also has the concept of a default skin. This is a request
interface that is specially registered and applied to the request after
it has been created. This last bit is important because you want all
subsequent view look-ups to take the default skin into account. Since
most browser views are registered for the default layer interface and
most skins derive from the default layer interface, not setting the
default skin on the request as early as possible would result in most
views not being found.

Of course, ZPublisher doesn't apply the default skin to the request
after its creation. Therefore, Five has to do a hack: upon the first
Five-style traversal (that might involve Zope 3 views), it puts the
default skin on the request. There are two problems with this approach:

* Previous traversal steps could have already set a different layer (or
skin) on the request. This is a valid usecase (e.g. ++skin++ can be used
for this). Five's behaviour would possibly make the previously applied
layers or skins ineffective again. Five tries to be as uninvasive as
possible by only doing this when the request doesn't have an ILayer
interface yet. Problem is, the notion of all layer interfaces providing
ILayer is going to go away (it's already deprecated on the Zope 3 trunk).

* More importantly, you sometimes might want to do view lookup before
the first Five-style traversal happens. Then you're dealing with a
virgin request that doesn't have the default skin installed (and
therefore neither the default layer in most case) and your view look-ups
 would probably fail because the views were registered for the default
layer.

The latter point is an issue in Plone, by the way.

I would propose to remove the Five hack and "properly" set the default
skin right after the request has been created. This would be in
ZPublisher.Publish.publish_module_standard.

(ZopeTestCase would also have to be fixed up so that each test gets its
individual request object [all tests currently share the same one!] and
that the request would also have the default skin set from the beginning)

Philipp



More information about the Zope-Dev mailing list