=============
Image Widget
=============
The image widget allows you to submit a form to the server by clicking on an
image. The "image" type of the "INPUT" element is described here:
http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#edef-INPUT
As for all widgets, the image widget must provide the new ``IWidget``
interface:
>>> from zope.interface.verify import verifyClass
>>> from z3c.form import interfaces
>>> from z3c.form.browser import image
>>> verifyClass(interfaces.IWidget, image.ImageWidget)
True
The widget can be instantiated only using the request:
>>> from z3c.form.testing import TestRequest
>>> request = TestRequest()
>>> widget = image.ImageWidget(request)
Before rendering the widget, one has to set the name and id of the widget:
>>> widget.id = 'widget.id'
>>> widget.name = 'widget.name'
We also need to register the template for the widget:
>>> 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('image_input.pt'), 'text/html'),
... (None, None, None, None, interfaces.IImageWidget),
... IPageTemplate, name=interfaces.INPUT_MODE)
If we render the widget we get a simple input element:
>>> print(widget.render())
Setting an image source for the widget effectively changes the "src" attribute:
>>> widget.src = u'widget.png'
>>> print(widget.render())
Let's now make sure that we can extract user entered data from a widget:
>>> widget.request = TestRequest(
... form={'widget.name.x': '10',
... 'widget.name.y': '20',
... 'widget.name': 'value'})
>>> widget.update()
>>> sorted(widget.extract().items())
[('value', 'value'), ('x', 10), ('y', 20)]
If nothing is found in the request, the default is returned:
>>> widget.request = TestRequest()
>>> widget.update()
>>> widget.extract()