2012-07-29 13 views
5

Ich möchte ein Viewlet auf die Ansicht mehrerer Inhaltstypen in der gleichen Python-Ei anwenden. Was ich getan habe ist, die Marker-Schnittstelle über Browser/configure.zcml AnwendungBessere Möglichkeit zum Markieren von Inhaltstypen mit einer gemeinsamen Schnittstelle

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

Und in meiner Grok-basierten Vorlage Ich habe:

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) 

Dies funktioniert. Aber ich bin interessiert zu wissen, ob es einen besseren Weg gibt, es zu tun.

Antwort

0

Nein, was Sie tun, ist eigentlich der beste Weg, dies zu erreichen. Die Verwendung von Marker-Schnittstellen ist der Weg I würde in jedem Fall darüber gehen. :-)

Die Alternative wäre für Sie das Viewlet für die Schnittstellen oder Klassen aller verschiedenen Inhaltstypen statt neu zu registrieren:

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

aber, dass eine ganze Menge mehr ausführlich ist.

0

Als Alternative funktioniert das auch:

Ich habe Schnittstellen/annualprogram.py (verwendete ich Paster mein Produkt zu erstellen). Darin habe ich:

from zope.interface import Interface  

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

Da ist in meinem institution.py ich hinzugefügt:

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

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

I angewendet, dann wird die gleiche Sache zu den anderen Inhaltstypen, die die IAnnualProgram benötigt.

Dies funktioniert, ist aber nicht unbedingt besser.

Verwandte Themen