[Zope3-checkins] CVS: Zope3/lib/python/Zope/App/Forms/Views/Browser - IBrowserWidget.py:1.2.6.2 Widget.py:1.9.6.1

Jim Fulton jim@zope.com
Mon, 28 Oct 2002 11:51:25 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/Forms/Views/Browser
In directory cvs.zope.org:/tmp/cvs-serv29831/lib/python/Zope/App/Forms/Views/Browser

Modified Files:
      Tag: Zope3-Bangalore-TTW-Branch
	IBrowserWidget.py Widget.py 
Log Message:
Changed the form widget interfaces:

- Widgets now have a setData method for setting their initial 
  data. This is the data that will be displayed absent user input.

- Browser widgets should now be called without arguments to render.
  If there is initial data, it should be passed with setData prior to
  rendering.  This change was made to allow widgets to be rendered in
  ZPT without resorting to python expressions.

- Browser widgets now have a 'hidden' method to render the widgets as
  hidden fields. The hidden method is called without arguments. 
  
- Removed the unused, except in tests, hidden attribute that was,
  presumably, a flag indicating that a widget should render as hidden.

- Deprecated the render and renderHidden methods. These need to be
  refactored out after the Zope3-Bangalore-TTW-Branch branch is merged
  into the trunk. 

- Changed the render method (back) so that it requires a value
  argument. 



=== Zope3/lib/python/Zope/App/Forms/Views/Browser/IBrowserWidget.py 1.2.6.1 => 1.2.6.2 ===
--- Zope3/lib/python/Zope/App/Forms/Views/Browser/IBrowserWidget.py:1.2.6.1	Tue Oct 22 10:18:08 2002
+++ Zope3/lib/python/Zope/App/Forms/Views/Browser/IBrowserWidget.py	Mon Oct 28 11:51:24 2002
@@ -25,14 +25,36 @@
        default value and so on.
     """
 
+    def setPrefix(self, prefix):
+        """Set the form-variable name prefix used for the widget
 
-    def render(value=None):
-        """Renders this widget as HTML using property values in field.
-
-        The value if given will be used as the default value for the widget.        
+        The widget will define it's own form variable names by
+        concatinating the profix and the field name using a dot. For
+        example, with a prefix of "page" and a field name of "title",
+        a form name of "page.title" will be used. A widget may use
+        multiple form fields. If so, it should add distinguishing
+        suffixes to the prefix and field name.
         """
 
+    def __call__():
+        """Render the widget
+        """
+
+    def hidden():
+        """Render the widget as a hidden field
+        """
+    
+
+    # XXX The following methods are being supported for backward compatability
+    # They are depricated and will be refactored away eventually.
+
+    def render(value):
+        """Renders this widget as HTML using property values in field.
+
+        The value if given will be used as the default value for the widget.  
+        """
         
-    def render_hidden(field, key, value):
-        """Renders this widget as a hidden field."""
+    def renderHidden(value):
+        """Renders this widget as a hidden field.
+        """
         


=== Zope3/lib/python/Zope/App/Forms/Views/Browser/Widget.py 1.9 => 1.9.6.1 ===
--- Zope3/lib/python/Zope/App/Forms/Views/Browser/Widget.py:1.9	Sat Sep  7 12:18:48 2002
+++ Zope3/lib/python/Zope/App/Forms/Views/Browser/Widget.py	Mon Oct 28 11:51:24 2002
@@ -33,39 +33,59 @@
     __implements__ = IBrowserWidget
     converter = Converter.NullConverter()
 
-    propertyNames = Widget.propertyNames + \
-                    ['tag', 'type', 'cssClass', 'hidden', 'extra']
+    propertyNames = (Widget.propertyNames + 
+                     ['tag', 'type', 'cssClass', 'extra'])
     
     tag = 'input'
     type = 'text'
     cssClass = ''
-    hidden = 0
     extra = ''
+    _data = ''
+    _prefix = 'field.'
 
-
+    def setPrefix(self, prefix):
+        if not prefix.endswith("."):
+            prefix += '.'
+        self._prefix = prefix
+    
     def _getRawData(self):
-        return self.request.form["field_" + self.getName()] 
+        return self.request.form[self._prefix + self.context.__name__] 
 
     def _convert(self, value):
         return self.converter.convert(value)
 
-    def render(self, value):
+    def setData(self, value):
+        self._data = value
+
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
         return renderElement(self.getValue('tag'),
                              type = self.getValue('type'),
-                             name = self.getName(),
-                             value = value,
+                             name = self._prefix + self.context.__name__,
+                             value = self._data,
                              cssClass = self.getValue('cssClass'),
                              extra = self.getValue('extra'))
 
-    def renderHidden(self, value):
+    def hidden(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
         return renderElement(self.getValue('tag'),
                              type = 'hidden',
-                             name = self.getName(),
-                             value = value,
+                             name = self._prefix + self.context.__name__,
+                             value = self._data,
                              cssClass = self.getValue('cssClass'),
                              extra = self.getValue('extra'))
+        
+
+
+    def render(self, value):
+        'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
+        self.setData(value)
+        return self()
+
+    def renderHidden(self, value):
+        'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
+        self.setData(value)
+        return self.hidden()
 
 
 class CheckBoxWidget(BrowserWidget):
@@ -77,19 +97,19 @@
     default = 0
     extra = ''
 
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
-        if value:
+        if self._data:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
+                                 name = self._prefix + self.context.__name__,
                                  checked = None,
                                  cssClass = self.getValue('cssClass'),
                                  extra = self.getValue('extra'))
         else:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
+                                 name = self._prefix + self.context.__name__,
                                  cssClass = self.getValue('cssClass'),
                                  size = self.getValue('displayWidth'),
                                  extra = self.getValue('extra'))
@@ -104,14 +124,14 @@
     displayMaxWidth = ""
     extra = ''
 
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
         displayMaxWidth = self.getValue('displayMaxWidth') or 0
         if displayMaxWidth > 0:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
-                                 value = value,
+                                 name = self._prefix + self.context.__name__,
+                                 value = self._data,
                                  cssClass = self.getValue('cssClass'),
                                  size = self.getValue('displayWidth'),
                                  maxlength = displayMaxWidth,
@@ -119,8 +139,8 @@
         else:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
-                                 value = value,
+                                 name = self._prefix + self.context.__name__,
+                                 value = self._data,
                                  cssClass = self.getValue('cssClass'),
                                  size = self.getValue('displayWidth'),
                                  extra = self.getValue('extra'))
@@ -153,15 +173,15 @@
     height = 15
     extra=""
     
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
         return renderElement("textarea",
-                             name=self.context.getName(),
-                             cssClass=self.getValue('cssClass'),
-                             cols=self.getValue('width'),
-                             rows=self.getValue('height'),
-                             contents=value,
-                             extra=self.getValue('extra'))
+                             name = self._prefix + self.context.__name__,
+                             cssClass = self.getValue('cssClass'),
+                             cols = self.getValue('width'),
+                             rows = self.getValue('height'),
+                             contents = self._data,
+                             extra = self.getValue('extra'))
 
 
 class PasswordWidget(TextWidget):
@@ -174,13 +194,13 @@
     converter = Converter.FileToStrConverter()
     type = 'file'
 
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
         displayMaxWidth = self.getValue('displayMaxWidth') or 0
         if displayMaxWidth > 0:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
+                                 name = self._prefix + self.context.__name__,
                                  cssClass = self.getValue('cssClass'),
                                  size = self.getValue('displayWidth'),
                                  maxlength = displayMaxWidth,
@@ -188,7 +208,7 @@
         else:
             return renderElement(self.getValue('tag'),
                                  type = self.getValue('type'),
-                                 name = self.context.getName(),
+                                 name = self._prefix + self.context.__name__,
                                  cssClass = self.getValue('cssClass'),
                                  size = self.getValue('displayWidth'),
                                  extra = self.getValue('extra'))
@@ -206,7 +226,7 @@
     firstItem = 0    
 
     def renderItems(self, value):
-        name = self.context.getName()
+        name = self._prefix + self.context.__name__
         # get items
         items = self.context.items
         if callable(items):
@@ -253,15 +273,15 @@
                      ['firstItem', 'items', 'size', 'extra']
     size = 5
 
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
-        renderedItems = self.renderItems(value)
+        renderedItems = self.renderItems(self._data)
         return renderElement('select',
-                              name=self.context.getName(),
-                              cssClass=self.getValue('cssClass'),
-                              size=self.getValue('size'),
-                              contents="\n".join(renderedItems),
-                              extra=self.getValue('extra'))
+                              name = self._prefix + self.context.__name__,
+                              cssClass = self.getValue('cssClass'),
+                              size = self.getValue('size'),
+                              contents = "\n".join(renderedItems),
+                              extra = self.getValue('extra'))
 
     def renderItem(self, text, value, name, cssClass):
         return renderElement('option', contents=text, value=value,
@@ -278,9 +298,9 @@
                      ['firstItem', 'items', 'orientation']
     orientation = "vertical"
                                    
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
-        rendered_items = self.renderItems(value)
+        rendered_items = self.renderItems(self._data)
         orientation = self.getValue('orientation')
         if orientation == 'horizontal':
             return "  ".join(rendered_items)
@@ -289,18 +309,18 @@
 
     def renderItem(self, text, value, name, cssClass):
         return renderElement('input',
-                              type="radio",
-                              cssClass=cssClass,
-                              name=name,
-                              value=value) + text
+                              type = "radio",
+                              cssClass = cssClass,
+                              name = name,
+                              value = value) + text
     
     def renderSelectedItem(self, text, value, name, cssClass):
         return renderElement('input',
                               type="radio",
                               cssClass=cssClass,
-                              name=name,
-                              value=value,
-                              checked=None) + text
+                              name = name,
+                              value = value,
+                              checked = None) + text
 
 
 class MultiItemsWidget(ItemsWidget):
@@ -315,7 +335,7 @@
 
         if not isinstance(value, ListTypes):
             value = [value]
-        name = self.context.getName()
+        name = self._prefix + self.context.__name__
         items = self.context.items
         if callable(items):
             items = items()
@@ -350,16 +370,16 @@
                      ['items', 'size', 'extra']
     size = 5
 
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
-        rendered_items = self.renderItems(value)
+        rendered_items = self.renderItems(self._data)
         return renderElement('select',
-                              name=self.context.getName(),
-                              multiple=None,
-                              cssClass=self.getValue('cssClass'),
-                              size=self.getValue('size'),
-                              contents="\n".join(rendered_items),
-                              extra=self.getValue('extra'))
+                              name = self._prefix + self.context.__name__,
+                              multiple = None,
+                              cssClass = self.getValue('cssClass'),
+                              size = self.getValue('size'),
+                              contents = "\n".join(rendered_items),
+                              extra = self.getValue('extra'))
     
     def renderItem(self, text, value, name, cssClass):
         return renderElement('option', contents=text, value=value)
@@ -375,9 +395,9 @@
                      ['items', 'orientation']
     orientation = "vertical"
                                    
-    def render(self, value):
+    def __call__(self):
         'See Zope.App.Forms.Views.Browser.IBrowserWidget.IBrowserWidget'
-        rendered_items = self.renderItems(value)
+        rendered_items = self.renderItems(self._data)
         orientation = self.getValue('orientation')
         if orientation == 'horizontal':
             return "  ".join(rendered_items)
@@ -386,18 +406,18 @@
     
     def renderItem(self, text, value, name, cssClass):
         return renderElement('input',
-                              type="checkbox",
-                              cssClass=cssClass,
-                              name=name,
-                              value=value) + text
+                              type = "checkbox",
+                              cssClass = cssClass,
+                              name = name,
+                              value = value) + text
     
     def renderSelectedItem(self, text, value, name, cssClass):
         return renderElement('input',
-                              type="checkbox",
-                              cssClass=cssClass,
-                              name=name,
-                              value=value,
-                              checked=None) + text
+                              type = "checkbox",
+                              cssClass = cssClass,
+                              name = name,
+                              value = value,
+                              checked = None) + text
 
 
 # XXX Note, some HTML quoting is needed in renderTag and renderElement.
@@ -405,9 +425,6 @@
 def renderTag(tag, **kw):
     """Render the tag. Well, not all of it, as we may want to / it."""
     attr_list = []
-
-    if kw.has_key('name'):
-        kw['name'] = 'field_' + kw['name']
 
     # special case handling for cssClass
     if 'cssClass' in kw: