[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