2012-07-29 6 views
5

Quiero que un viewlet se aplique a la vista de varios tipos de contenido en el mismo huevo python. Lo que he estado haciendo es aplicar la interfaz marcador a través del navegador/configure.zcmlMejor forma de etiquetar los tipos de contenido con una interfaz común

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

Y en mi plantilla basada en Grok que tengo:

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) 

Esto funciona. Pero estoy interesado en saber si hay una mejor manera de hacerlo.

Respuesta

0

No, lo que estás haciendo es en realidad la mejor manera de acercarte a esto. El uso de interfaces de marcador es la forma en que I lo haría en cualquier caso. :-)

La alternativa sería para que usted pueda volver a registrar el viewlet para las interfaces o clases de todos los diferentes tipos de contenido en su lugar:

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

pero que es mucho más detallado.

0

Como alternativa, esto también funciona:

que añade las interfaces/annualprogram.py (utilicé parche para crear mi producto). En lo que tengo:

from zope.interface import Interface  

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

Luego, en mi institution.py añadí:

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

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

Solicité entonces lo mismo con los otros tipos de contenido que necesitan la IAnnualProgram.

Esto funciona pero no es necesariamente mejor.

Cuestiones relacionadas