2011-11-01 18 views
7

Il progetto su cui sto lavorando utilizza l'impressionante plug-in di Destrezza di Plone. Un paio di miei tipi di contenuti personalizzati hanno nomi molto specifici che devono essere calcolati. Il modo in cui avevo inizialmente compiuto questo prima era con l'aggiunta di plone.app.content.interfaces.INameFromTitle come un comportamento in ingresso di impostazione generica dell'oggetto, secondo le istruzioni del manuale:C'è un modo per estendere il comportamento INameFromTitle di Plone Dexterity?

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

Poi ho creato un adattatore che fornirebbe 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 

questo metodo è molto simile a quello suggerito in questo post del blog:

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

Sfortunatamente, questo metodo ha smesso di funzionare dopo plone.app.dexterity beta e ora i miei elementi di contenuto non hanno il nome assegnato correttamente.

Qualcuno potrebbe sapere come estendere il comportamento INameFromTitle di Dexterity per casi d'uso di denominazione molto specifici?

Il vostro aiuto è molto apprezzato, grazie!

risposta

4

Si potrebbe provare quanto segue.

in interfaces.py

from plone.app.content.interfaces import INameFromTitle 

class INameForMyType(INameFromTitle): 

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

in 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 

io in genere preferisco definire i miei adattatori usando ZCML; in configure.zcml

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

ma probabilmente si potrebbe anche usare un grok.global_adapter.

3

l'ho fatto con un comportamento, adattandosi a INameFromTitle

in 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 

in behaviors.zcml o configure.zcml

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

Quindi disabilitare il comportamento INameFromTitle in profiles/types/your.contenttype.xml.

Voila. Questo si integra molto bene e mostra un titolo appropriato nella visualizzazione e nella navigazione predefinite. La rimozione di context.setTitle(title) dall'adattatore ci lascerebbe semplicemente con un id corretto, ma senza titolo impostato.

Questo non modifica il titolo in modo automatico dopo la modifica.Finora non ho avuto successo con l'override della proprietà klass dei miei tipi di contenuto, come spesso suggerito.

Se si definisce l'attributo title nello schema, come:

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

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

si può facilmente cambiare il titolo in seguito. Occorrerebbe nascondere il campo del titolo in addForm, per evitare equivoci.