Github でこれixds.covalent
を使用していると仮定します。
ここでは、2 つの異なるテンプレート登録メカニズムが使用されます。
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>
...そして、カスタマイズされたテンプレートが表示されます。