我試圖覆蓋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. 覆蓋瀏覽器
- 2. Android平板電腦模擬器皮膚
- 3. selectSingleNode覆蓋/覆蓋交叉瀏覽器
- 4. 覆蓋瀏覽器「查找」功能
- 5. 確定皮膚文件中的Safari瀏覽器?
- 6. 柱模板被覆蓋
- 7. codename one模擬器皮膚
- 8. 模板功能 - 模板是否覆蓋正常功能
- 9. @page是否真的被當前的瀏覽器支持?
- 10. DataGridCheckBoxColumn上的錯誤模板裝飾器不能被覆蓋
- 11. 如何設置皮膚模板中的默認容器?
- 12. 如何在Plone 4中不使用zope 2皮膚圖層的情況下使用zope 3/ztk圖層?
- 13. 覆蓋模板類功能
- 14. 有沒有什麼辦法可以從皮膚中覆蓋Default.aspx的功能?
- 15. 覆蓋瀏覽器CTRL +(WHEEL)SCROLL with javascript
- 16. 瀏覽器覆蓋我的CSS字體
- 17. 如何通過代碼覆蓋皮膚的設置?
- 18. Android模擬器Galaxy S3的皮膚
- 19. 默認瀏覽器的css沒有被覆蓋
- 20. Css模板在所有瀏覽器中都不一樣(覆蓋div)
- 21. 瀏覽器和Firebug覆蓋差異
- 22. 如何覆蓋瀏覽器字體?
- 23. Zope的瀏覽器頁面權限
- 24. Joomla 3類博客模板覆蓋
- 25. Joomla 3模板覆蓋插件
- 26. 覆蓋瀏覽器滾動行爲?
- 27. 用瀏覽器默認值覆蓋reset.css
- 28. ASP.Net中的條件皮膚文件基於瀏覽器的主題
- 29. 在瀏覽器中覆蓋控件+ s(保存功能)
- 30. 覆蓋/更新瀏覽器cookie
歡迎來到Stack Overflow!遲到的答案在這裏非常受歡迎,我們更關心的是回答正確而不是快速。 – Pops 2011-01-31 13:36:10
啊。謝謝你。在瞭解「@@」時,我的直接答覆是「從什麼方面消除歧義?」它還解釋了爲什麼我可以使用'@@ myview'而不是'@@ view'來使用unrestrictedTraverse(),因爲'view'(至少在我試過的地方)是一個皮膚模板,而不是瀏覽器視圖。 – Auspex 2011-03-11 01:54:46