Plone CMF皮肤中的模板能否被Zope 3浏览器:页面覆盖?

Plone CMF皮肤中的模板能否被Zope 3浏览器:页面覆盖?,plone,zope,Plone,Zope,我正在尝试用一个覆盖CMF皮肤层提供的视图,我不确定,但您可以为fast做的是使用plone_皮肤中的“自定义”文件夹进行尝试 你也可以从尝试“另类”方式(这有点晚了,但这到底是怎么回事) CMF蒙皮层覆盖浏览器视图。这就是为什么在URL中必须将@放在browserview名称的前面,即消除歧义并确保调用browserview而不是CMF皮肤层模板 因此,简而言之,如果您将@放在前面,则browserview将覆盖,否则不会覆盖 i、 e: 覆盖: localhost:8080/Plone/my

我正在尝试用一个
覆盖CMF皮肤层提供的视图,我不确定,但您可以为fast做的是使用plone_皮肤中的“自定义”文件夹进行尝试

你也可以从

尝试“另类”方式(这有点晚了,但这到底是怎么回事)

CMF蒙皮层覆盖浏览器视图。这就是为什么在URL中必须将
@
放在browserview名称的前面,即消除歧义并确保调用browserview而不是CMF皮肤层模板

因此,简而言之,如果您将
@
放在前面,则browserview将覆盖,否则不会覆盖

i、 e:

覆盖:

localhost:8080/Plone/myview

要克服此问题,请覆盖CMF皮肤层中的模板,并定义
视图
变量以指向您的
@@myview
。然后,您仍然可以从CMF皮肤层模板访问BrowserViews方法。

默认情况下,CMF皮肤机制在查找视图之前先在门户网站皮肤中查找。您可以通过自定义IPPublishTraverse适配器来更改此设置。这有点邪恶,但这可能会起作用(在Plone 3中进行了测试-我不能100%确定Plone 4中的默认行为是什么):

您需要向以下机构注册此信息:

<adapter factory=".skins.SkinnableTraverser" />

可能在overrides.zcml中。另一种选择是对请求使用更具体的标记接口,例如,通过browserlayer.xml导入步骤安装的标记接口


Martin

欢迎来到Stack Overflow!迟交的答案在这里非常受欢迎,我们更关心的是答案是否正确而不是快速。谢谢你。在学习“@@”时,我的直接反应是“消除对什么的歧义?”这也解释了为什么我可以使用unlimitedTraverse()对“@@myview”,而不是“@@view”,因为“view”(至少在我尝试过的地方)是一个皮肤模板,而不是浏览器视图。
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" />