[Checkins] SVN: z3c.form/trunk/src/z3c/form/ objectwidget: conert sub-widget value before assign.
Adam Groszer
agroszer at gmail.com
Tue Dec 23 11:11:08 EST 2008
Log message for revision 94290:
objectwidget: conert sub-widget value before assign.
btw: added test for selectwidget DISPLAY_MODE
Changed:
U z3c.form/trunk/src/z3c/form/browser/select.txt
U z3c.form/trunk/src/z3c/form/object.py
-=-
Modified: z3c.form/trunk/src/z3c/form/browser/select.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/select.txt 2008-12-23 15:55:35 UTC (rev 94289)
+++ z3c.form/trunk/src/z3c/form/browser/select.txt 2008-12-23 16:11:08 UTC (rev 94290)
@@ -51,7 +51,7 @@
value="1" />
Let's provide some values for this widget. We can do this by defining a source
-providing ``ITerms``. This source uses descriminators wich will fit our setup.
+providing ``ITerms``. This source uses descriminators which will fit our setup.
>>> import zope.schema.interfaces
>>> from zope.schema.vocabulary import SimpleVocabulary
@@ -213,6 +213,26 @@
>>> widget.promptMessage
u'please select a value'
+Display Widget
+--------------
+
+The select widget comes with a template for ``DISPLAY_MODE``. Let's
+register it first:
+
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('select_display.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.ISelectWidget),
+ ... IPageTemplate, name=interfaces.DISPLAY_MODE)
+
+ >>> widget.mode = interfaces.DISPLAY_MODE
+ >>> widget.value = ['b', 'c']
+ >>> widget.update()
+ >>> print widget.render() # doctest: +NORMALIZE_WHITESPACE
+ <span id="widget-id" class="select-widget required">
+ <span class="selected-option">b</span>,
+ <span class="selected-option">c</span>
+ </span>
+
Hidden Widget
-------------
@@ -224,7 +244,7 @@
... (None, None, None, None, interfaces.ISelectWidget),
... IPageTemplate, name=interfaces.HIDDEN_MODE)
-We ca now set our widget's mode to hidden and render it:
+We can now set our widget's mode to hidden and render it:
>>> widget.mode = interfaces.HIDDEN_MODE
>>> widget.value = ['b']
Modified: z3c.form/trunk/src/z3c/form/object.py
===================================================================
--- z3c.form/trunk/src/z3c/form/object.py 2008-12-23 15:55:35 UTC (rev 94289)
+++ z3c.form/trunk/src/z3c/form/object.py 2008-12-23 16:11:08 UTC (rev 94290)
@@ -227,6 +227,26 @@
finally:
self._updating = False
+ def applyValue(self, widget, value=interfaces.NOVALUE):
+ """Validate and apply value to given widget.
+ """
+ converter = interfaces.IDataConverter(widget)
+ try:
+ zope.component.getMultiAdapter(
+ (self.context,
+ self.request,
+ self.form,
+ getattr(widget, 'field', None),
+ widget),
+ interfaces.IValidator).validate(value)
+
+ widget.value = converter.toWidgetValue(value)
+ except (zope.schema.ValidationError, ValueError), error:
+ # on exception, setup the widget error message
+ # set the wrong value as value
+ # the widget itself ought to cry about the error
+ widget.value = value
+
@apply
def value():
"""This invokes updateWidgets on any value change e.g. update/extract."""
@@ -246,8 +266,8 @@
# ensure that we apply our new values to the widgets
if value is not interfaces.NOVALUE:
for name in zope.schema.getFieldNames(self.field.schema):
- self.subform.widgets[name].value = value.get(name,
- interfaces.NOVALUE)
+ self.applyValue(self.subform.widgets[name],
+ value.get(name, interfaces.NOVALUE))
return property(get, set)
More information about the Checkins
mailing list