Templates jbot不覆盖我的模板
我要覆盖的视图是由“ixds.covalent”包的“behaviors”文件夹中名为“covalent_member.py”的文件中的类“ActivateForm”定义的。因此,在这个包(ixds.covalent)中为我的视图放置自定义模板的位置是 (本工程) 但是我尝试在我的主题包中进行自定义,方法是创建一个名为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_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覆盖模板)。