我想让一个viewlet应用于同一个python egg中的几个内容类型的视图。我一直在做的是通过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)
这很有效。但我很想知道是否有更好的方法来做到这一点。
答案 0 :(得分:0)
不,你在做什么实际上是解决这个问题的最好方法。在任何情况下,使用标记接口都是 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"
/>
但这更加冗长。
答案 1 :(得分: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的其他内容类型。
这有效但不一定更好。