首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMF皮肤中的模板可以被Zope3浏览器:页面覆盖吗?

CMF皮肤中的模板可以被Zope3浏览器:页面覆盖吗?
EN

Stack Overflow用户
提问于 2010-12-14 22:37:52
回答 3查看 362关注 0票数 3

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-31 21:02:10

(这有点晚了,但见鬼去吧)

CMF外观层会覆盖浏览器视图。这就是为什么你必须在URL中把@@放在浏览器视图名称的前面,也就是说,为了消除它的歧义,并确保调用的是浏览器视图,而不是CMF皮肤层模板。

所以简而言之,如果你把@@放在前面,浏览器视图将会覆盖,否则就不会。

即:

代码语言:javascript
复制
localhost:8080/Plone/@@myview 

覆盖:

代码语言:javascript
复制
localhost:8080/Plone/myview

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

票数 5
EN

Stack Overflow用户

发布于 2011-02-19 23:17:06

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

代码语言:javascript
复制
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

您需要使用以下地址进行注册:

代码语言:javascript
复制
<adapter factory=".skins.SkinnableTraverser" />

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

马丁

票数 3
EN

Stack Overflow用户

发布于 2010-12-17 20:40:43

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4440274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档