[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