2012-07-29 15 views
5

के साथ सामग्री प्रकार टैगिंग का बेहतर तरीका मैं एक पठार अंडे में कई सामग्री प्रकारों के दृश्य पर लागू करने के लिए एक व्यूलेट चाहता हूं। क्या मैं कर रहे हैं ब्राउज़र/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

नहीं, आप जो कर रहे हैं वह वास्तव में इस तक पहुंचने का सबसे अच्छा तरीका है। मार्कर इंटरफेस का उपयोग करना I किसी भी मामले में इसके बारे में होगा।

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

लेकिन वह भी बहुत कुछ शामिल वर्बोज़ है: :-)

विकल्प आप इंटरफेस या बजाय सभी विभिन्न सामग्री प्रकार के वर्गों के लिए viewlet पुन: पंजीकृत करने के लिए किया जाएगा।

0

एक विकल्प के रूप में, यह भी काम करता है:

मैं जोड़ा इंटरफेस/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 की जरूरत है कि करने के लिए एक ही बात लागू होता है।

यह काम करता है लेकिन यह आवश्यक नहीं है।

संबंधित मुद्दे