По умолчанию механизм скинов CMF просматривает portal_skins перед поиском представления. Вы можете изменить это, настроив адаптер IPublishTraverse. Это немного зло, но это может сработать (протестировано в Plone 3 - я не уверен на 100%, как по умолчанию в Plone 4):
from zope.component import adapts, queryMultiAdapter
from zope.publisher.interfaces.browser import IBrowserRequest
from Acquisition import aq_base
from ZPublisher.BaseRequest import DefaultPublishTraverse
from Products.CMFCore.Skinnable import SKINDATA, SkinnableObjectManager
from thread import get_ident
_MARKER = object()
class SkinnableTraverser(DefaultPublishTraverse):
adapts(SkinnableObjectManager, IBrowserRequest)
def publishTraverse(self, request, name):
"""Let the default traverser do its job, but if the thing that was
returned was from a skin layer and there's a view with
the same name, let the view win.
"""
gotten = super(SkinnableTraverser, self).publishTraverse(request, name)
if not name.startswith('_') and not name.startswith('aq_'):
sd = SKINDATA.get(get_ident())
if sd is not None:
ob, skinname, ignore, resolve = sd
if resolve.get(name, None) is aq_base(gotten):
# This was retrieved as a skin resource
# Check if it could've been a view also
view = queryMultiAdapter((self.context, request), name=name)
if view is not None:
return view.__of__(self.context)
return gotten
Вы должны зарегистрироваться:
<adapter factory=".skins.SkinnableTraverser" />
Возможно, в файле overrides.zcml. Другим вариантом будет использование более конкретного интерфейса маркера в запросе, например один устанавливается через шаг импорта browserlayer.xml.
Martin