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.

- Archive
- 2009 2010 2011 2012