3

我要覆盖的视图由“ixds.covalent”包的“behaviors”文件夹内名为“covalent_member.py”的文件中的“ActivateForm”类定义。所以在这个包(ixds.covalent)中为我的视图放置一个自定义模板的地方是

ixds/covalent/behaviors/covalent_member_templates/activateform.pt

(这有效)

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

ixds.covalent.behaviors.covalent_member_templates.activateform.pt

在我的主题的“覆盖”文件夹中,没有任何反应(当然我尝试重新启动实例,禁用并重新启用主题,重新安装多个产品,甚至运行构建)。自定义模板“activateform.pt”是否仍然存在于我的 ixds.covalent 包中,似乎没有任何区别(嗯,实际上是的:如果我删除它,我会得到一个“没有这样的文件或目录”错误. 但是问题总是一样的:主题的“覆盖”目录中的模板永远不会被获取)。

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

我做错了什么?

4

1 回答 1

3

我假设您在 Github 上使用ixds.covalent

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

该类ActivateForm派生自plone.directives.form.Form,而后者又使用five.grok包。因此ActivateForm在启动时是“grokked”的,这意味着它在 Zope 中的注册是自动完成的,无需在另一个文件中单独输入。对开发者来说非常方便ixds.covalent

grok 机制还允许开发人员为表单创建一个自动注册的模板。他们可以创建一个包含模块名称加上“_templates”(covalent_member_templates)的目录和一个匹配类名(activateform.pt)的文件。

但在这种情况下,开发人员并没有选择这样做。plone.directives.form存在使开发人员更容易创建表单,例如不需要专用模板。如您所见,没有什么可以阻止ixds.covalent按照标准 grok 方法在包中创建该模板。

但是当然不建议以这种方式编辑第三方包。您可以在自己的包中自定义表单。但是您不能使用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>

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

于 2013-02-08T09:22:07.803 回答