我试图覆盖CMF皮肤层提供的视图,<browser:page ...
具有相同的name=
属性。这可能在Plone中,或者浏览器视图只能覆盖其他浏览器视图吗?CMF皮肤中的模板能否被Zope 3浏览器覆盖:page?
3
A
回答
5
“另类”的方式(这是有点晚了,但什么是地狱)
CMF皮肤层覆盖浏览器的看法。这就是为什么你必须将@@
放在URL的browserview名称前面,即为了消除歧义,并确保调用browserview而不是CMF皮肤图层模板。
所以简而言之,如果你把@@
放在前面,browserview会覆盖,否则不会。
即:
localhost:8080/Plone/@@myview
覆盖:
localhost:8080/Plone/myview
为了克服这个问题,覆盖模板在你的皮肤CMF层和tal:define
的View
变量指向你的@@myview
。然后,您仍然可以从CMF皮肤层模板访问BrowserViews方法。
2
我不确定,但是您可以快速做的是使用plone_skins中的“自定义”文件夹进行尝试。
您也可以尝试从http://plone.org/documentation/kb/applying-a-custom-view-to-a-specific-folder
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导入步骤安装一个。
Martin
相关问题
- 1. Android平板电脑模拟器皮肤
- 2. 覆盖浏览器“查找”功能
- 3. 确定皮肤文件中的Safari浏览器?
- 4. 柱模板被覆盖
- 5. codename one模拟器皮肤
- 6. DataGridCheckBoxColumn上的错误模板装饰器不能被覆盖
- 7. 如何设置皮肤模板中的默认容器?
- 8. 覆盖模板类功能
- 9. 有没有什么办法可以从皮肤中覆盖Default.aspx的功能?
- 10. 如何通过代码覆盖皮肤的设置?
- 11. Zope的浏览器页面权限
- 12. 覆盖浏览器滚动行为?
- 13. 在浏览器中覆盖控件+ s(保存功能)
- 14. 覆盖/更新浏览器cookie
- 15. ASP.Net中的条件皮肤文件基于浏览器的主题
- 16. NSIS的$ TEMP值能否被覆盖?
- 17. 是否可以在浏览器的滚动条上覆盖DIV?
- 18. android模拟器没有皮肤
- 19. Haskell等效于Zope测试浏览器
- 20. 覆盖EditorForModel模板
- 21. TYPO3模板覆盖
- 22. Joomla模板覆盖
- 23. 是否有可能'重新皮肤'的IOS日期选择器?
- 24. Kinect 2皮肤模型
- 25. 的Minecraft皮肤预览问题
- 26. 使用Symfony CMF模板化
- 27. 浏览器中的“avery”类型模板
- 28. Flex 4皮肤:根据父容器状态更改皮肤
- 29. Android模拟器皮肤布局 - 是否有工具和规范?
- 30. JavaScript设计模式,功能被覆盖
欢迎来到Stack Overflow!迟到的答案在这里非常受欢迎,我们更关心的是回答正确而不是快速。 – Pops 2011-01-31 13:36:10
啊。谢谢你。在了解“@@”时,我的直接答复是“从什么方面消除歧义?”它还解释了为什么我可以使用'@@ myview'而不是'@@ view'来使用unrestrictedTraverse(),因为'view'(至少在我试过的地方)是一个皮肤模板,而不是浏览器视图。 – Auspex 2011-03-11 01:54:46