[Checkins] SVN: z3c.form/trunk/src/z3c/form/ ouch: multiwidget DISPLAY_MODE and HIDDEN_MODE was not working
Adam Groszer
agroszer at gmail.com
Wed Dec 10 10:54:24 EST 2008
Log message for revision 93844:
ouch: multiwidget DISPLAY_MODE and HIDDEN_MODE was not working
btw: added objectwidget HIDDEN_MODE too
Changed:
U z3c.form/trunk/src/z3c/form/browser/multi.txt
U z3c.form/trunk/src/z3c/form/browser/multi_display.pt
U z3c.form/trunk/src/z3c/form/browser/multi_hidden.pt
U z3c.form/trunk/src/z3c/form/browser/object.txt
A z3c.form/trunk/src/z3c/form/browser/object_hidden.pt
U z3c.form/trunk/src/z3c/form/widget.py
-=-
Modified: z3c.form/trunk/src/z3c/form/browser/multi.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/multi.txt 2008-12-10 13:34:21 UTC (rev 93843)
+++ z3c.form/trunk/src/z3c/form/browser/multi.txt 2008-12-10 15:54:24 UTC (rev 93844)
@@ -499,6 +499,184 @@
<input type="hidden" name="widget.name.count" value="2" />
+
+Displaying
+----------
+
+The widget can be instantiated only using the request:
+
+ >>> from z3c.form.testing import TestRequest
+ >>> request = TestRequest()
+ >>> widget = multi.MultiWidget(request)
+
+Before rendering the widget, one has to set the name and id of the widget:
+
+ >>> widget.id = 'widget-id'
+ >>> widget.name = 'widget.name'
+
+Set the mode to DISPLAY_MODE:
+
+ >>> widget.mode = interfaces.DISPLAY_MODE
+
+We also need to register the template for at least the widget and request:
+
+ >>> import zope.component
+ >>> from zope.pagetemplate.interfaces import IPageTemplate
+ >>> from z3c.form.testing import getPath
+ >>> from z3c.form.widget import WidgetTemplateFactory
+
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('multi_display.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.IMultiWidget),
+ ... IPageTemplate, name=interfaces.DISPLAY_MODE)
+
+We can now render the widget:
+
+ >>> widget.update()
+ >>> print widget.render()
+ <span class="multi-widget" id="widget-id"></span>
+
+As you can see the widget is empty and doesn't provide values. This is because
+the widget does not know what sub-widgets to display. So let's register a
+`IFieldWidget` adapter and a template for our `IInt` field:
+
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('text_display.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.ITextWidget),
+ ... IPageTemplate, name=interfaces.DISPLAY_MODE)
+
+Let's now update the widget and check it again.
+
+ >>> widget.update()
+ >>> print widget.render()
+ <span class="multi-widget" id="widget-id"></span>
+
+It's still the same. Since the widget doesn't provide a field nothing useful
+gets rendered. Now let's define a field for this widget and check it again:
+
+ >>> field = zope.schema.List(
+ ... __name__=u'foo',
+ ... value_type=zope.schema.Int(title=u'Number'),
+ ... )
+ >>> widget.field = field
+ >>> widget.update()
+ >>> print widget.render()
+ <span class="multi-widget" id="widget-id"></span>
+
+As you can see, there is still no input value. Let's provide some values for
+this widget. Before we can do that, we will need to register a data converter
+for our multi widget and the data converter dispatcher adapter:
+
+ >>> widget.update()
+ >>> widget.value = [u'42', u'43']
+ >>> print widget.render()
+ <span class="multi-widget" id="widget-id">
+ <div class="row" id="widget-id-0-row">
+ <div class="label">
+ <label for="widget-id-0">
+ <span>Number</span>
+ <span class="required">*</span>
+ </label>
+ </div>
+ <div class="widget">
+ <div class="multi-widget-display">
+ <span class="text-widget required int-field" id="widget-id-0">42</span>
+ </div>
+ </div>
+ </div>
+ <div class="row" id="widget-id-1-row">
+ <div class="label">
+ <label for="widget-id-1">
+ <span>Number</span>
+ <span class="required">*</span>
+ </label>
+ </div>
+ <div class="widget">
+ <div class="multi-widget-display">
+ <span class="text-widget required int-field" id="widget-id-1">43</span>
+ </div>
+ </div>
+ </div>
+ </span>
+
+
+Hidden mode
+-----------
+
+The widget can be instantiated only using the request:
+
+ >>> from z3c.form.testing import TestRequest
+ >>> request = TestRequest()
+ >>> widget = multi.MultiWidget(request)
+
+Before rendering the widget, one has to set the name and id of the widget:
+
+ >>> widget.id = 'widget-id'
+ >>> widget.name = 'widget.name'
+
+Set the mode to HIDDEN_MODE:
+
+ >>> widget.mode = interfaces.HIDDEN_MODE
+
+We also need to register the template for at least the widget and request:
+
+ >>> import zope.component
+ >>> from zope.pagetemplate.interfaces import IPageTemplate
+ >>> from z3c.form.testing import getPath
+ >>> from z3c.form.widget import WidgetTemplateFactory
+
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('multi_hidden.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.IMultiWidget),
+ ... IPageTemplate, name=interfaces.HIDDEN_MODE)
+
+We can now render the widget:
+
+ >>> widget.update()
+ >>> print widget.render()
+ <input name="widget.name.count" type="hidden" value="0">
+
+As you can see the widget is empty and doesn't provide values. This is because
+the widget does not know what sub-widgets to display. So let's register a
+`IFieldWidget` adapter and a template for our `IInt` field:
+
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('text_hidden.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.ITextWidget),
+ ... IPageTemplate, name=interfaces.HIDDEN_MODE)
+
+Let's now update the widget and check it again.
+
+ >>> widget.update()
+ >>> print widget.render()
+ <input name="widget.name.count" type="hidden" value="0">
+
+It's still the same. Since the widget doesn't provide a field nothing useful
+gets rendered. Now let's define a field for this widget and check it again:
+
+ >>> field = zope.schema.List(
+ ... __name__=u'foo',
+ ... value_type=zope.schema.Int(title=u'Number'),
+ ... )
+ >>> widget.field = field
+ >>> widget.update()
+ >>> print widget.render()
+ <input name="widget.name.count" type="hidden" value="0">
+
+As you can see, there is still no input value. Let's provide some values for
+this widget. Before we can do that, we will need to register a data converter
+for our multi widget and the data converter dispatcher adapter:
+
+ >>> widget.update()
+ >>> widget.value = [u'42', u'43']
+ >>> print widget.render()
+ <input class="hidden-widget"
+ id="widget-id-0" name="widget.name.0" type="hidden" value="42">
+ <input class="hidden-widget"
+ id="widget-id-1" name="widget.name.1" type="hidden" value="43">
+ <input name="widget.name.count" type="hidden" value="2">
+
+
Label
-----
Modified: z3c.form/trunk/src/z3c/form/browser/multi_display.pt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/multi_display.pt 2008-12-10 13:34:21 UTC (rev 93843)
+++ z3c.form/trunk/src/z3c/form/browser/multi_display.pt 2008-12-10 15:54:24 UTC (rev 93844)
@@ -1,6 +1,6 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
- tal:omit-tag="">
+ tal:omit-tag="">
<span id="" class=""
tal:attributes="id view/id;
class view/klass;
@@ -16,11 +16,32 @@
onmouseout view/onmouseout;
onkeypress view/onkeypress;
onkeydown view/onkeydown;
- onkeyup view/onkeyup"><tal:block
- tal:repeat="value view/displayValue"
- ><span class="selected-option"
- tal:content="value"
- /><tal:block condition="not:repeat/value/end">, </tal:block
- ></tal:block
-></span>
+ onkeyup view/onkeyup">
+ <tal:block repeat="widget view/widgets">
+ <div id="" class="row"
+ tal:attributes="id string:${widget/id}-row"
+ tal:condition="python:widget.mode != 'hidden'">
+ <metal:block define-macro="widget-row">
+ <div class="label" tal:condition="view/showLabel">
+ <label tal:attributes="for widget/id">
+ <span i18n:translate=""
+ tal:content="widget/label">label</span>
+ <span class="required"
+ tal:condition="widget/required">*</span>
+ </label>
+ </div>
+ <div class="widget">
+ <div class="multi-widget-display"
+ tal:content="structure widget/render">
+ <input size="24" value="" type="text" />
+ </div>
+ </div>
+ <div class="error"
+ tal:condition="widget/error">
+ <span tal:replace="structure widget/error/render">error</span>
+ </div>
+ </metal:block>
+ </div>
+ </tal:block>
+</span>
</html>
Modified: z3c.form/trunk/src/z3c/form/browser/multi_hidden.pt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/multi_hidden.pt 2008-12-10 13:34:21 UTC (rev 93843)
+++ z3c.form/trunk/src/z3c/form/browser/multi_hidden.pt 2008-12-10 15:54:24 UTC (rev 93844)
@@ -1,13 +1,13 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
+ xmlns:metal="http://xml.zope.org/namespaces/metal"
tal:omit-tag="">
-<tal:block define="id view/id;
- name string:${view/name}:list"
- repeat="item view/items">
- <input type="hidden" name="" class="hidden-widget"
- tal:condition="item/selected"
- tal:attributes="name name; value item/value; id item/id" />
+<tal:block repeat="widget view/widgets">
+ <metal:block define-macro="widget-row">
+ <div tal:replace="structure widget/render">
+ <input size="24" value="" type="text" />
+ </div>
+ </metal:block>
</tal:block>
-<input name="field-empty-marker" type="hidden" value="1"
- tal:attributes="name string:${view/name}-empty-marker" />
+<input type="hidden" tal:replace="structure view/counterMarker" />
</html>
Modified: z3c.form/trunk/src/z3c/form/browser/object.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/object.txt 2008-12-10 13:34:21 UTC (rev 93843)
+++ z3c.form/trunk/src/z3c/form/browser/object.txt 2008-12-10 15:54:24 UTC (rev 93844)
@@ -1006,8 +1006,53 @@
</html>
+Let's see what happens in HIDDEN_MODE:
+(not quite sane thing, but we want to see the objectwidget rendered in hidden
+mode)
+ >>> zope.component.provideAdapter(
+ ... WidgetTemplateFactory(getPath('object_hidden.pt'), 'text/html'),
+ ... (None, None, None, None, interfaces.IObjectWidget),
+ ... IPageTemplate, name=interfaces.HIDDEN_MODE)
+
+ >>> editform = MyEditForm(root['first'], TestRequest())
+ >>> addTemplate(editform)
+ >>> editform.mode = interfaces.HIDDEN_MODE
+ >>> editform.update()
+
+Note, that the labels and the button is there because the form template for testing
+does/should not care about the form being hidden.
+What matters is that the objectwidget is rendered hidden.
+
+ >>> print editform.render()
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <body>
+ <form action=".">
+ <div class="row">
+ <label for="form-widgets-subobject">my object</label>
+ <input id="form-widgets-subobject-widgets-foofield"
+ name="form.widgets.subobject.widgets.foofield"
+ value="666" class="hidden-widget" type="hidden" />
+ <input id="form-widgets-subobject-widgets-barfield"
+ name="form.widgets.subobject.widgets.barfield"
+ value="999" class="hidden-widget" type="hidden" />
+ </div>
+ <div class="row">
+ <label for="form-widgets-name">name</label>
+ <input id="form-widgets-name" name="form.widgets.name"
+ value="first" class="hidden-widget" type="hidden" />
+ </div>
+ <div class="action">
+ <input id="form-buttons-apply" name="form.buttons.apply"
+ class="submit-widget button-field" value="Apply" type="submit" />
+ </div>
+ </form>
+ </body>
+ </html>
+
+
+
Editforms might use dicts as context:
>>> newsub = MySubObject()
Added: z3c.form/trunk/src/z3c/form/browser/object_hidden.pt
===================================================================
--- z3c.form/trunk/src/z3c/form/browser/object_hidden.pt (rev 0)
+++ z3c.form/trunk/src/z3c/form/browser/object_hidden.pt 2008-12-10 15:54:24 UTC (rev 93844)
@@ -0,0 +1,5 @@
+<tal:block repeat="widget view/subform/widgets/values">
+ <div tal:replace="structure widget/render">
+ <input type="text" size="24" value="" />
+ </div>
+</tal:block>
Property changes on: z3c.form/trunk/src/z3c/form/browser/object_hidden.pt
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py 2008-12-10 13:34:21 UTC (rev 93843)
+++ z3c.form/trunk/src/z3c/form/widget.py 2008-12-10 15:54:24 UTC (rev 93844)
@@ -272,6 +272,7 @@
interfaces.IFieldWidget)
widget.name = name
widget.id = id
+ widget.mode = self.mode
#set widget.form (objectwidget needs this)
if interfaces.IFormAware.providedBy(self):
widget.form = self.form
More information about the Checkins
mailing list