2012-07-29 7 views
5

Desidero che un viewlet si applichi alla vista di diversi tipi di contenuto nello stesso uovo python. Quello che ho fatto è di applicare l'interfaccia marcatore via browser/configure.zcmlUn modo migliore per etichettare i tipi di contenuto con un'interfaccia comune

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

E nel mio modello Grok-based che ho:

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) 

Questo funziona. Ma sono interessato a sapere se c'è un modo migliore per farlo.

risposta

0

No, quello che stai facendo è in realtà il modo migliore per avvicinarti a questo. L'uso delle interfacce marcatore è il modo in cui lo I farebbe di tutto in ogni caso. :-)

L'alternativa sarebbe per voi per registrare nuovamente la viewlet per le interfacce o classi di tutti i diversi tipi di contenuto, invece:

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

ma che è un bel po 'più prolisso.

0

In alternativa, questo funziona anche:

ho aggiunto interfacce/annualprogram.py (io ho usato paster per creare il mio prodotto). In esso ho:

from zope.interface import Interface  

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

Poi nel mio institution.py ho aggiunto:

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

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

Ho poi applicato la stessa cosa per gli altri tipi di contenuto che avevano bisogno l'IAnnualProgram.

Questo funziona ma non è necessariamente migliore.

Problemi correlati