Work around problems/weaknesses in 'zope.formlib' and the widgets in 'zope.app.form'.
This package allows to work around problems/weaknesses in zope.formlib and the associated widgets in zope.app.form.browser, described by “https://bugs.launchpad.net/zope3/+bug/528920” and “https://bugs.launchpad.net/zope3/+bug/528912”.
The package has been developed for Zope 2.10, will probably work for Zope 2.11 and is unlikely to work for very new Zope versions, because the widget code has been moved from zope.app.form to zope.formlib. I may publish versions of this package for new Zope versions in the future.
The package consists of various modules described below.
To use the package in your application, you import some of its patch functions (mentioned below) and call them during the startup of your application.
I hope that corresponding patches will sooner or later appear in the standard Zope code and make this package obsolete.
zope.formlib distinguishes between widget related errors and other (more global) errors. If a widget itself detects a widget related error (usually because a restriction for the associated field fails), it sets its error condition. This error condition is usually used to highlight the widget containing an error and to provide information about this error. However, if the widget related error is not detected by the widget itself, the error is not associated with the widget and important information may be missing.
The function patch_action() in module form enhances zope.formlib.form.Action by an additional method associate_errors_with_widgets and redefines its failure method to call it unless an explicit failure handler is specified. This provides for automatic error association with the widgets in the standard case.
associate_errors_with_widgets tries to associate zope.app.form.interfaces.WidgetInputError with the corresponding widget. For this purpose, the widget must have a setWidgetInputError method. By default widgets lack this method. However widget.patch_widget() can be used to define it. Therefore, form.patch_action() and widget.patch_widget() are usually used together.
Its patch_widget() enhances zope.app.form.browser.widget.BrowserWidget (the base class for zope.app.form widgets) by defining the method setWidgetInputError. The method allows external code to set an error condition on the widget.
setWidgetInputError is used by the error handling implemented by the form module. Therefore, widget.patch_widget() is usually used together with form.patch_action().