jbot没有覆盖我的模板

时间:2013-02-07 18:14:27

标签: templates override plone theming

我要覆盖的视图由“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版本。

我可以做错什么?

1 个答案:

答案 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>

...您将看到呈现的自定义模板。