2011-11-01 19 views
7

Projekt nad którym pracuję wykorzystuje niesamowitą wtyczkę Plone's Dexterity. Kilka moich niestandardowych typów treści ma bardzo specyficzne nazwy, które należy obliczyć. Sposób, w jaki pierwotnie dokonał tego wcześniej było dodając plone.app.content.interfaces.INameFromTitle jako zachowanie w pozycji ogólnej konfiguracji obiektu, na kierunkach podręcznika:Czy istnieje sposób na rozszerzenie działania INameFromTitle 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> 

Potem stworzył adaptera zapewniłoby 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 

metoda ta jest bardzo podobna do tej sugerowane w tym blogu:

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

Niestety, ta metoda przestała działać po wersji plone.app.dXterity, a teraz moje elementy treści nie mają poprawnie przypisanych nazw.

Czy ktoś mógłby wiedzieć, w jaki sposób rozszerzyć zachowanie INameFromTitle Dexterity o bardzo specyficzne przypadki użycia nazw?

Twoja pomoc jest bardzo cenna, dzięki!

Odpowiedz

4

Możesz wypróbować następujące rzeczy.

w interfaces.py

from plone.app.content.interfaces import INameFromTitle 

class INameForMyType(INameFromTitle): 

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

w 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 

ja generalnie preferuje definiowanie moje adaptery używając ZCML; w configure.zcml

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

ale prawdopodobnie można też użyć grok.global_adapter.

3

Zrobiłem to z zachowaniem, poprzez dostosowanie do INameFromTitle

w 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 

w behaviors.zcml lub 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" /> 

Następnie wyłącz działanie INameFromTitle w profiles/types/your.contenttype.xml.

Voila. To bardzo dobrze integruje się i pokazuje odpowiedni tytuł w domyślnym widoku i nawigacji. Usunięcie context.setTitle(title) z adaptera pozostawiłoby nam prawidłowy identyfikator, ale brak ustawionego tytułu.

Nie zmienia to tytułu autokratycznie po edycji.Jak dotąd często nie sugerowałem, że udało mi się zastąpić właściwość moich typów zawartości.

Jeśli zdefiniować atrybut title w schemacie, jak:

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

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

można łatwo zmienić tytuł później. Ukrywanie pola tytułu w addForm powinno być zrobione, aby uniknąć nieporozumień.

Powiązane problemy