[Checkins] SVN: plone.z3cform/trunk/plone/z3cform/base. Add a more convenient way of wrapping a form into a layout.

Daniel Nouri daniel.nouri at gmail.com
Sat Jul 19 12:50:00 EDT 2008


Log message for revision 88606:
  Add a more convenient way of wrapping a form into a layout.
  

Changed:
  U   plone.z3cform/trunk/plone/z3cform/base.py
  U   plone.z3cform/trunk/plone/z3cform/base.txt

-=-
Modified: plone.z3cform/trunk/plone/z3cform/base.py
===================================================================
--- plone.z3cform/trunk/plone/z3cform/base.py	2008-07-19 15:05:19 UTC (rev 88605)
+++ plone.z3cform/trunk/plone/z3cform/base.py	2008-07-19 16:49:59 UTC (rev 88606)
@@ -46,3 +46,11 @@
         attribute works as well.
         """
         return self.form.label
+
+def wrap_form(form, **kwargs):
+    class MyFormWrapper(FormWrapper):
+        pass
+    MyFormWrapper.form = form
+    for name, value in kwargs.items():
+        setattr(MyFormWrapper, name, value)
+    return MyFormWrapper

Modified: plone.z3cform/trunk/plone/z3cform/base.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/base.txt	2008-07-19 15:05:19 UTC (rev 88605)
+++ plone.z3cform/trunk/plone/z3cform/base.txt	2008-07-19 16:49:59 UTC (rev 88606)
@@ -57,16 +57,55 @@
     >>> getMultiAdapter((context, request), name=u"test-form")
     ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
     <MyFormWrapper object ...>
-    >>> del context, request
 
-Send bad data to the form:
+We can also use a function called ``wrap_form`` to wrap our form in a
+layout.  We define a custom layout template first:
 
-    >>> request = make_request(form={'form.widgets.age': '12.1'})
-    >>> from zope.interface import Interface, implements
+    >>> import os
+    >>> import tempfile
+    >>> from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+    >>> handle, path = tempfile.mkstemp()
+    >>> f = open(path, 'w')
+    >>> f.write("""
+    ... <html>Hello, this is your layout speaking:
+    ... <div tal:content="structure view/contents"></div>
+    ... </html>""")
+    >>> f.close()
+    >>> layout = ViewPageTemplateFile(path, _prefix='')
+
+Note that the ``_prefix`` argument passed to Five's
+ViewPageTemplateFile is unnecessary when used outside of a test.  We
+can now make the actual call to ``wrap_form`` and register the view
+class it returns.  Normally, you'd register this view class using
+ZCML, like with any other view.
+    
+    >>> from plone.z3cform.base import wrap_form
+    >>> view_class = wrap_form(MyWrappedForm, index=layout)
+    >>> provideAdapter(adapts=(Interface, IBrowserRequest),
+    ...                provides=Interface,
+    ...                factory=view_class,
+    ...                name=u"test-form2")
+
+To satisfy permission checking, we'll wrap the view in a Zope2-ish
+object before we render it.  Again, you usually don't have to worry
+about this:
+
     >>> from Acquisition import Implicit
     >>> class Bar(Implicit):
+    ...     __allow_access_to_unprotected_subobjects__ = 1
     ...     implements(Interface)
     >>> context = Bar()
+
+    >>> view = getMultiAdapter(
+    ...     (context, request), name=u"test-form2").__of__(context)
+    >>> print view() # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
+    <html>Hello, this is your layout speaking:...Age...</html>
+    >>> os.unlink(path)
+    
+Send bad data to the form:
+
+    >>> request = make_request(form={'form.widgets.age': '12.1'})
+    >>> from zope.interface import Interface, implements
     >>> formWrapper = getMultiAdapter((context, request), name=u"test-form")
     >>> form = formWrapper.form(context, request)
     >>> form.update()
@@ -81,9 +120,6 @@
     >>> request = make_request(form={'form.widgets.age': '12'})
     >>> from zope.interface import Interface, implements
     >>> from Acquisition import Implicit
-    >>> class Bar(Implicit):
-    ...     implements(Interface)
-    >>> context = Bar()
     >>> formWrapper = getMultiAdapter((context, request), name=u"test-form")
     >>> form = formWrapper.form(context, request)
     >>> form.update()



More information about the Checkins mailing list