我有一个小小的Plone扩展,其中包含一个简单的基于原型的内容类型(与我无法添加TTW的内容类型相同,请参阅我之前的问题);项目设置在GitHub上。
添加对象后,我在执行plone.abovecontenttitle
内容提供程序期间得到一个KeyError: 'view'
:
{'container': <MyType at /plone/test-for-new-types/a-mytype-object>,
'context': <MyType at /plone/test-for-new-types/a-mytype-object>,
'default': <object object at 0x7fc4f8ebe520>,
'here': <MyType at /plone/test-for-new-types/a-mytype-object>,
'loop': {},
'nothing': None,
'options': {'args': ()},
'repeat': <Products.PageTemplates.Expressions.SafeMapping object at 0x7fc4c9484db8>,
'request': <HTTPRequest, URL=https://my.testing.site/test-for-new-types/a-mytype-object/mytype_view>,
'root': <Application at >,
'template': <FSPageTemplate at /plone/test-for-new-types/a-mytype-object/mytype_view>,
'traverse_subpath': [],
'user': <PloneUser 'me'>}
在develop
模式下安装我的小扩展应该很容易重现。
编辑:我注意到,在"已安装的产品"视图(/portal_quickinstaller/MyCompany.MyProduct/manage_installationInfo
),我的产品Status: installed
和Types MyType
,但Content Type Registry entries
是空的(None
)。
内容提供者调用适配器,适配器期望存在view
参数[1],而基于皮肤的模板不提供,这与基于浏览器的模板相反。 为了解决这个问题,我们可以像在main_template
中使用全局@@plone
-var[2] 一样,因为@@plone
是BrowserView
的一个实例,它提供了视图参数:
tal:define="view context/@@plone;"
这让我觉得,内容提供商使用的适配器应该考虑没有视图可用的情况。
如果您想拥有通常的网站结构并仅自定义内容部分,您也可以将模板填充到内容槽中,然后继承main_template中的所有内容,以及 view-var:
<metal:main metal:use-macro="context/main_template/macros/master">
<metal:content fill-slot="content">
Hey, a working content-provider:
<div tal:replace="structure provider:plone.abovecontenttitle" />
Oh, so much more much, here...
</metal:content>
</metal:main>
我建议这样做,因为这样你就不必担心在标题部分做所有正确的事情。 例如,使用"raiseAnon"应该是不必要的,因为项目的工作流状态正在处理这个问题,并且将评估当前语言等。
如果您只想自定义内容项的正文部分,请将content
更改为content-core
,通常的内容提供程序将被呈现,那么无论如何,如果您希望按通常的顺序插入它们,则无需插入它们。
[1]https://docs.plone.org/4/en/old-参考文献-manuals/portlets/rendered.html
[2]https://github.com/plone/Products.CMFPlone/blob/master/Products/CMFPlone/browser/ploneview.py