使用通用界面标记内容类型的更好方法



我想要一个viewlet应用于同一个python egg中多个内容类型的视图。我一直在做的是通过浏览器/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)

这是有效的。但我很想知道是否有更好的方法。

不,您所做的实际上是解决这一问题的最佳方法。在任何情况下,使用标记接口都是I的方式。:-)

另一种选择是为所有不同内容类型的接口或类重新注册viewlet:

<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"
    />

但这要详细得多。

作为替代方案,这也适用:

我添加了interfaces/annualprogram.py(我用paster创建了我的产品)。我有:

from zope.interface import Interface    
class IAnnualProgram(Interface):
"""A common marker interface for AnnualProgram ContentTypes"""

然后在我的机构.py我补充道:

from AnnualProgramModule.content.interfaces import IAnnualProgram
.....
class Institution(folder.ATFolder):
    """Institution Profile"""
    implements(IInstitution, IAnnualProgram)

然后,我将同样的东西应用于其他需要IAnnualProgram的内容类型。

这是有效的,但不一定更好。

相关内容

  • 没有找到相关文章

最新更新