2011-11-01 15 views
7

परियोजना मैं पर काम कर रहा हूँ प्लोन के भयानक निपुणता प्लगइन का उपयोग करता है। मेरे कुछ कस्टम सामग्री प्रकारों में बहुत विशिष्ट नाम हैं जिन्हें गणना की जानी चाहिए। जिस तरह से मैं मूल रूप से पहले इस पूरा किया था वस्तु की सामान्य सेटअप प्रविष्टि में एक व्यवहार के रूप में plone.app.content.interfaces.INameFromTitle जोड़ने, मैनुअल के निर्देशों के अनुसार द्वारा किया गया था:क्या प्लोन डिसक्टेरिटी के INameFromTitle व्यवहार को बढ़ाने का कोई तरीका है?

<?xml version="1.0"?> 
<object name="avrc.aeh.cycle" meta_type="Dexterity FTI"> 
    ... 
    <property name="schema">myproject.mytype.IMyType</property> 
    <property name="klass">plone.dexterity.content.Item</property> 
    ... 
    <property name="behaviors"> 
    <element value="plone.app.content.interfaces.INameFromTitle" /> 
    </property> 
    ... 
</object> 

तो मैं एक एडाप्टर बनाया कि INameFromTitle प्रदान करेगा:

from five import grok 
from zope.interface import Interface 
import zope.schema 
from plone.app.content.interfaces import INameFromTitle 

class IMyType(Interface): 

    foo = zope.schema.TextLine(
     title=u'Foo' 
     ) 

class NameForMyType(grok.Adapter): 
    grok.context(IMyType) 
    grok.provides(INameFromTitle) 

    @property 
    def title(self): 
     return u'Custom Title %s' % self.context.foo 

इस विधि बहुत इस ब्लॉग पोस्ट में सुझाव दिया है कि के समान है:

http://davidjb.com/blog/2010/04/plone-and-dexterity-working-with-computed-fields

दुर्भाग्य से, इस विधि plone.app.dexterity बीटा के बाद काम करना बंद कर लिया और अब मेरा सामग्री आइटम उनके नाम ठीक से सौंपा नहीं है।

किसी को भी पता है कि कैसे बहुत विशिष्ट नामकरण उपयोग-मामले के लिए निपुणता के INameFromTitle व्यवहार का विस्तार करने के ऐसा होगा?

आपका मदद की बहुत सराहना की है, धन्यवाद!

उत्तर

4

आप निम्नलिखित की कोशिश कर सकते।

में

from plone.app.content.interfaces import INameFromTitle 

class INameForMyType(INameFromTitle): 

    def title(): 
     """Return a custom title""" 

behaviors.py

from myproject.mytype.interfaces import INameForMyType 

class NameForMyType(object): 
    implements(INameForMyType) 

    def __init__(self, context): 
     self.context = context 

    @property 
    def title(self): 
     return u"Custom Title %s" % self.context.foo 

मैं आम तौर पर ZCML उपयोग करते हुए मेरे एडेप्टर को परिभाषित करने को प्राथमिकता देते interfaces.py में; configure.zcml में

<adapter for="myproject.mytype.IMyType" 
     factory=".behaviors.NameForMyType" 
     provides=".behaviors.INameForMyType" 
     /> 

लेकिन आप शायद यह भी एक grok.global_adapter इस्तेमाल कर सकते हैं।

3

मैं एक व्यवहार के साथ यह किया behaviors.zcml या configure.zcml में behaviors.py

class INameFromBrandAndModel(Interface): 
    """ Interface to adapt to INameFromTitle """ 

class NameFromBrandAndModel(object): 
    """ Adapter to INameFromTitle """ 
    implements(INameFromTitle) 
    adapts(INameFromBrandAndModel) 

    def __init__(self, context): 
     pass 

    def __new__(cls, context): 
     brand = context.brand 
     model = context.modeltype  
     title = u'%s %s' % (brand,model) 
     inst = super(NameFromBrandAndModel, cls).__new__(cls) 

     inst.title = title 
     context.setTitle(title) 

     return inst 

में INameFromTitle

के अनुरूप ढलने से

<plone:behavior 

    title="Name from brand and model" 
    description="generates a name from brand and model attributes" 
    for="plone.dexterity.interfaces.IDexterityContent" 
    provides=".behavios.INameFromBrandAndModel" 
    /> 

<adapter factory=".behaviors.NameFromBrandAndModel" /> 

फिर INameFromTitle व्यवहार को अक्षम करें profiles/types/your.contenttype.xml

देखा। यह बहुत अच्छी तरह से एकीकृत करता है और डिफ़ॉल्ट दृश्य और नेविगेशन में उचित शीर्षक दिखाता है। एडाप्टर से context.setTitle(title) को हटाने से हमें बस एक उचित आईडी के साथ छोड़ दिया जाएगा, लेकिन कोई शीर्षक सेट नहीं होगा।

यह संपादन के बाद स्वेच्छापूर्वक शीर्षक नहीं बदलता है।मैंने अब तक, मेरी सामग्री प्रकारों की klass संपत्ति को ओवरराइड करने के साथ कोई सफलता नहीं दी है, जैसा कि अक्सर सुझाया जाता है।

आप अपने स्कीमा में title विशेषता, जैसे परिभाषित हैं:

class IBike(form.Schema): 
    """A bike 
    """ 

    title = schema.TextLine(
     title = _(u'Title'), 
     required = False, 
    ) 

आप बाद में आसानी शीर्षक बदल सकते हैं। गलतफहमी से बचने के लिए, एडफॉर्म में शीर्षक फ़ील्ड को छिपाना चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^