3

我正在尝试覆盖由<browser:page ...具有相同name=属性的 CMF 皮肤层提供的视图。这在 Plone 中是否可行,或者浏览器视图只能覆盖其他浏览器视图?

4

3 回答 3

5

(这有点晚了,但到底是什么)

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

所以简而言之,如果你放在@@前面,browserview会覆盖,否则不会。

IE:

localhost:8080/Plone/@@myview 

覆盖:

localhost:8080/Plone/myview

要克服这个问题,请覆盖 CMF 皮肤层中的模板和tal:define指向View您的@@myview. 然后,您仍然可以从 CMF 皮肤层模板访问 BrowserViews 方法。

于 2011-01-31T13:02:09.870 回答
3

默认情况下,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 导入步骤安装的标记接口。

马丁

于 2011-02-19T15:17:06.113 回答
2

我不确定,但是您可以快速做的是使用 plone_skins 中的“自定义”文件夹进行尝试。

您也可以从http://plone.org/documentation/kb/applying-a-custom-view-to-a-specific-folder尝试“替代”方式

于 2010-12-17T12:40:42.760 回答