我要覆盖的视图由“ixds.covalent”包的“behavior”文件夹中名为“covalent_member.py”的文件中的“ActivateForm”类定义。因此,在我的视图中放置自定义模板的地方(ixds.covalent)是
ixds/covalent/behaviors/covalent_member_templates/activateform.pt
(这有效)
然后我尝试在我的主题包中进行自定义,方法是创建一个名为
的文件ixds.covalent.behaviors.covalent_member_templates.activateform.pt
在我的主题的“覆盖”文件夹中,没有任何反应(当然我尝试重新启动实例,禁用并重新启用主题,重新安装多个产品,甚至运行buildout)。自定义模板“activateform.pt”是否仍然存在于我的ixds.covalent包中,似乎没有任何区别(好吧,实际上是的:如果我删除它,我将得到“没有这样的文件或目录”错误然而问题总是一样的:主题的“覆盖”目录中的模板永远不会被提取。)
我在同一个“覆盖”文件夹中有5个其他覆盖模板,所有这些模板都在工作。我正在使用z3c.jbot 0.7.1(最新版本),Plone 4.2.4(最新稳定版)以及来自Github的最新版本的ixds.covalent Git版本。
我可以做错什么?
答案 0 :(得分:3)
我假设你正在使用this ixds.covalent
on Github。
这里有两种不同的模板注册机制。
ActivateForm
类派生自plone.directives.form.Form
,后者又使用five.grok
包。因此ActivateForm
在启动时是“grokked”,这意味着它在Zope中的注册是自动完成的,而在另一个文件中没有单独的条目。对ixds.covalent
。
grok机制还允许开发人员为表单创建自动注册的模板。他们可以使用模块名称加上'_templates'(covalent_member_templates
)和与类名称匹配的文件(activateform.pt
)创建一个目录。
但在这种情况下,开发人员并未选择这样做。 plone.directives.form
的存在是为了让开发人员更轻松地创建表单,例如不需要专用模板。正如您所看到的,没有什么能阻止你在标准grok方法之后在ixds.covalent
包中创建该模板。
但当然以这种方式编辑第三方软件包是不可取的。您可以在自己的包中自定义表单。但是您无法使用z3c.jbot
,因为没有要覆盖的现有模板。您必须覆盖ActivateForm
类并自己使用grok模板技术。
因此,在我的my.theme包中,请确保您已进入interfaces.py
:
from zope.interface import Interface
class IMyTheme(Interface):
"""Marker interface that defines a ZTK browser layer.
"""
在profiles/default/browserlayer.xml
:
<layers>
<layer
name="my.theme"
interface="my.theme.interfaces.IMyTheme"
/>
</layers>
在configure.zcml
:
...
<!-- Grok the package -->
<grok:grok package="."/>
...
在covalent_member.py
:
from five import grok
from ixds.covalent.behaviors.covalent_member import ActivateForm \
as OriginalActivateForm
from my.theme.interfaces import IMyTheme
class ActivateForm(OriginalActivateForm):
grok.layer(IMyTheme)
在covalent_member_templates/activateform.pt
:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="my.theme"
metal:use-macro="context/main_template/macros/master">
<metal:block fill-slot="main">
<h1 class="documentFirstHeading" tal:content="view/label | nothing" />
<p>Hey there. I'd really like you to fill out this form.</p>
<div id="content-core">
<metal:block use-macro="context/@@ploneform-macros/titlelessform" />
</div>
</metal:block>
</html>
...您将看到呈现的自定义模板。