z3c.form 2.2 e Multi Widget

Come usare le nuove funzionalità dell'ultima versione di z3c.form con Plone

Immaginiamo di dover sviluppare in Plone un oggetto ufficio a cui posso referenziare differenti persone (oggetti che potrebbero essere già presenti o meno sul portale).

Per chi è pratico di Archetypes, è il classico caso in cui l'utilizzo di Products.DataGridField risolverebbe perfettamente la questione. Per chi deve utilizzare z3c.form il problema potrebbe risultare scottante.

Non è però persa l'ultima speranza; la nuova versione di z3c.form supporta questa esigenza abbastanza comune ma il vero problema è far funzionare l'ultima versione di z3c.form con Plone.

Qualcuno qualche tempo fa mi disse che stava utilizzando con profitto z3c.form 2.1 (è sempre miziodel che vuole tenere alto in me un sano senso di invidia) e mi suggerisce un post dove qualcuno parlava della spinosa questione.

Voglio proprio vedere se la cosa funziona veramente e creo un buildout che include z3c.form 2.2 (l'ultima attualmente rilasciata).

...
[versions]
z3c.form = 2.1.0
zope.browser = 1.2
zope.i18n = 3.4.0
zope.schema = 3.4.0
...

Dopo aver eseguito il buildout creo un pacchetto per provare il fantomatico multi widget (demo.multiwidget); all'interno del mio pacchetto inizio a descrivere gli oggetti ufficio e personale attraverso due apposite interfacce.

from zope.interface import Interface
from zope import schema

class IPersonale(Interface):
nome = schema.TextLine(
title = u'Nome',
required = True)

cognome = schema.TextLine(
title = u'Cognome',
required = True)

class IUfficio(Interface):
...
personale = schema.List(
title = u'Personale',
required = True,
value_type = schema.Object(
title = u"Personale",
schema=IPersonale))

Passo quindi alla realizzazione di una form per gestire il mio oggetto ufficio:

from z3c.form import field, form, button
from demo.multiwidget.interfaces import IUfficio

class addUfficioForm(form.Form):
fields = field.Fields(IUfficio)
...
@button.buttonAndHandler(u'Save')
def handleSave(self, action):
...
self.status = u'Ufficio aggiunto'

e come ultima cosa devo gestire una factory per i miei oggetti personale:

from OFS.SimpleItem import SimpleItem

from zope.schema.fieldproperty import FieldProperty
from zope.interface import implements
from z3c.form.object import registerFactoryAdapter

from demo.multiwidget.interfaces import IPersonale

class Personale(SimpleItem):

implements(IPersonale)

nome= FieldProperty(IPersonale['nome'])
cognome = FieldProperty(IPersonale['cognome'])

__name__ = None
__parent__ = None

def getId(self):
return self.__name__ or ''

registerFactoryAdapter(IPersonale, Personale)

una cosa importante è che l'oggetto Personale erediti da un qualcosa di Persistent, nel mio caso l'adorato SimpleItem.

Ecco il risultato, ho dovuto solo aggiungere un po' di css perché il widget era decisamente bruttino.

z3c.form multi widget

blog comments powered by Disqus