2011-11-01 11 views
7

El proyecto en el que estoy trabajando usa el impresionante plugin Dexterity de Plone. Algunos de mis tipos de contenido personalizado tienen nombres muy específicos que deben calcularse. La forma en que originalmente había logrado esto antes era añadiendo plone.app.content.interfaces.INameFromTitle como un comportamiento en la entrada de configuración genérica del objeto, según las instrucciones del manual:¿Hay alguna manera de extender el comportamiento INameFromTitle de 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> 

Entonces creó un adaptador que se proporcionaría 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 

este método es muy similar a la sugerida en esta entrada del blog:

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

Lamentablemente, este método dejó de funcionar después de plone.app.dexterity beta y ahora mis elementos de contenido no tienen sus nombres asignados correctamente.

¿Alguien sabe cómo extender el comportamiento INameFromTitle de Dexterity para casos de uso de nombres muy específicos?

¡Su ayuda es muy apreciada, gracias!

Respuesta

4

Puede intentar lo siguiente.

en interfaces.py

from plone.app.content.interfaces import INameFromTitle 

class INameForMyType(INameFromTitle): 

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

en 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 

generalmente prefiero definir mis adaptadores utilizando ZCML; en configure.zcml

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

pero que probablemente se podría también utilizar un grok.global_adapter.

3

lo hice con un comportamiento, adaptándose a INameFromTitle

en 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 

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

Luego deshabilite el comportamiento INameFromTitle en profiles/types/your.contenttype.xml.

Voila. Esto se integra muy bien y muestra un título apropiado en la vista y navegación predeterminadas. Eliminar context.setTitle(title) del adaptador nos dejaría una identificación adecuada, pero no se establecería el título.

Esto no cambia el título automáticamente después de la edición.Hasta ahora, no he tenido éxito al anular la propiedad klass de mis tipos de contenido, como a menudo se sugiere.

Si se define el atributo title en su esquema, como:

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

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

puede cambiar fácilmente el título más tarde. Se debe ocultar el campo de título en addForm para evitar malentendidos.

Cuestiones relacionadas