Templates jbot不覆盖我的模板

Templates jbot不覆盖我的模板,templates,overriding,plone,theming,Templates,Overriding,Plone,Theming,我要覆盖的视图是由“ixds.covalent”包的“behaviors”文件夹中名为“covalent_member.py”的文件中的类“ActivateForm”定义的。因此,在这个包(ixds.covalent)中为我的视图放置自定义模板的位置是 (本工程) 但是我尝试在我的主题包中进行自定义,方法是创建一个名为 ixds.covalent.behaviors.covalent_member_templates.activateform.pt 在我的主题的“override”文件夹中,什

我要覆盖的视图是由“ixds.covalent”包的“behaviors”文件夹中名为“covalent_member.py”的文件中的类“ActivateForm”定义的。因此,在这个包(ixds.covalent)中为我的视图放置自定义模板的位置是

(本工程)

但是我尝试在我的主题包中进行自定义,方法是创建一个名为

ixds.covalent.behaviors.covalent_member_templates.activateform.pt
在我的主题的“override”文件夹中,什么也没有发生(当然,我尝试重新启动实例,禁用并重新启用主题,重新安装几个产品,甚至运行buildout)。自定义模板“activateform.pt”是否仍然存在于我的ixds.covalent包中,似乎没有任何区别(好吧,实际上是的:如果我删除它,我将得到一个“没有这样的文件或目录”错误。但是问题总是一样的:主题的“override”目录中的模板永远不会被提取)

我在同一个“覆盖”文件夹中有5个其他覆盖模板,它们都在工作。我正在使用Github提供的z3c.jbot 0.7.1(最新版本)、Plone 4.2.4(最新稳定版本)和最新版本的ixds.covalent

我可能做错了什么?

我假设您正在使用

这里有两种不同的模板注册机制

ActivateForm
类源自
plone.directives.form.form
,后者反过来使用
five.grok
包。因此,
ActivateForm
在启动时是“grokked”的,这意味着它在Zope中的注册是自动完成的,在另一个文件中没有单独的条目。非常方便
ixds.covalent
的开发者

grok机制还允许开发人员为表单创建一个自动注册的模板。他们可以创建一个目录,其中包含模块名称加上“\u模板”(
covalent\u member\u 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.
    """
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)
profiles/default/browserlayer.xml
中:

<layers>
  <layer
      name="my.theme"
      interface="my.theme.interfaces.IMyTheme"
      />
</layers>
...
<!-- Grok the package -->
<grok:grok package="."/>
...
在共价_成员.py中

from zope.interface import Interface

class IMyTheme(Interface):
    """Marker interface that defines a ZTK browser layer.
    """
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)
在共价成员模板/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>

你好。我真的希望你填一下这张表


。。。您将看到定制模板的呈现。

可能希望在问题中指定您正在使用z3c.jbot.OK,我猜是这样的。不确定更改标题是否也是一个好主意。我完全按照您的步骤操作(显然是我们更改了主题界面的名称),出于某种原因,我无法在我们的主题包中实现这一点,但我们最终在另一个自定义包中添加了这一点:抱歉,我仍然不太习惯这个评论系统,而且我做得不对——我想在我最后的评论中说更多的话,比如非常感谢!,我们当前的修复也很好,因为我们把覆盖放在了一个包中,这个包是用来进行定制的,但是我仍然不完全理解为什么我不能从主题中覆盖视图类(如果我在ixds.covalent包中创建了一个模板,我可以看到它被Plone使用,尽管我知道这不是最好的方法,但为什么我也不能用jbot覆盖模板)。