5

同じpythonegg内の複数のコンテンツタイプのビューにビューレットを適用したいと思います。私がやっていることは、browser/configure.zcmlを介してマーカーインターフェイスを適用することです

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="AnnualProgramModule.content">

  <include package="plone.app.contentmenu" />

  <class class="..content.programyear.ProgramYear">
    <implements interface=".viewlets.IAnnualProgram" />
  </class>

  <class class="..content.institution.Institution">
    <implements interface=".viewlets.IAnnualProgram" />
  </class>

</configure>

そして、Grokベースのテンプレートには次のものがあります。

from zope.interface import Interface
from five import grok
from plone.app.layout.viewlets.interfaces import IAboveContentTitle
from AnnualProgramModule.content.interfaces import IInstitution

grok.templatedir('templates')

class IAnnualProgram(Interface):
    """Marker Interface for AnnualProgram content types
    """

class AnnualProgramViewlet(grok.Viewlet):
    grok.require('zope2.View')
    grok.viewletmanager(IAboveContentTitle)
    grok.context(IAnnualProgram)

class InstitutionViewlet(grok.Viewlet):
    grok.require('zope2.View')
    grok.context(IInstitution)
    grok.viewletmanager(IAboveContentTitle)

これは機能します。しかし、私はそれを行うためのより良い方法があるかどうかを知りたいと思っています。

4

2 に答える 2

0

いいえ、あなたがしていることは実際にこれに取り組むための最良の方法です。マーカーインターフェイスを使用することは、どのような場合でも私がそれを行う方法です。:-)

別の方法は、代わりに、すべての異なるコンテンツタイプのインターフェイスまたはクラスのビューレットを再登録することです。

<browser:viewlet
    name="yourpackage.annualprogram"
    for="..content.programyear.ProgramYear"
    manager="plone.app.layout.viewlets.interfaces.IAboveContentTitle"
    template="annualprogram.pt"
    permission="zope2.View"
    />

<browser:viewlet
    name="yourpackage.annualprogram"
    for="..content.interfaces.IInstitution"
    manager="plone.app.layout.viewlets.interfaces.IAboveContentTitle"
    template="annualprogram.pt"
    permission="zope2.View"
    />

しかし、それははるかに冗長です。

于 2012-07-29T08:03:23.440 に答える
0

別の方法として、これも機能します。

interfaces / Annualprogram.pyを追加しました(pasterを使用して製品を作成しました)。その中に私は持っています:

from zope.interface import Interface    

class IAnnualProgram(Interface):
"""A common marker interface for AnnualProgram ContentTypes"""

次に、institution.pyに次のように追加しました。

from AnnualProgramModule.content.interfaces import IAnnualProgram
.....

class Institution(folder.ATFolder):
    """Institution Profile"""
    implements(IInstitution, IAnnualProgram)

次に、IAnnualProgramを必要とする他のコンテンツタイプにも同じことを適用しました。

これは機能しますが、必ずしも良いとは限りません。

于 2012-08-01T06:06:36.263 に答える