Customiser un widget Zope 3

 

Les widgets dans Zope 3, c'est easy ©JF.

Ce sont de simple objets rendant du html sur leur méthode __call__:

>>> class SuperWidget(object):
...     """
...     un widget qui sert à rien
...     """
...     def __call__(self):
...         return '<input type="text" value="jesersarien" />'

Bon, là, c'est pas super. On vas tenter un peu plus utile.

Voici un exemple simple pour utiliser un champ caché avec zope.app.form:

>>> import zope.schema
>>> from zope.formlib import form
>>> from zope.app.form.browser import TextWidget

>>> class HiddenWidget(TextWidget):
...     """
...     un widget basé sur TextWidget mais rendant un champs caché
...     """
...     def __call__(self):
...         return self.hidden()

>>> class IContact(zope.interface.Interface):
...     """
...     les champs de mon formulaire de contact
...     """
...     email = zope.schema.TextLine(title=u'Votre email')
...     name = zope.schema.TextLine(title=u'Votre nom')
...     message = zope.schema.TextLine(title=u'Message')
...     control = zope.schema.TextLine(title=u'')

>>> class ContactForm(form.Form):
...     """
...     le formulaire lui même
...     """
...     form_fields = form.Fields(IContact)
...     form_fields['control'].custom_widget = HiddenWidget

J'utilise ce principe pour éviter les spams. En chargeant une valeur dans le champs control via ajax, on évites tous les post indésirables.

Il est aussi possible d'utiliser une template pour rendre votre widget. Cela peut-être utile si on veut y insérer un chouïlla de javascript par exemple:

>>> from zope.app.form.browser import TextWidget
>>> from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile

>>> class ComplexeWidget(TextWidget):
...     template = ViewPageTemplateFile(template_dir + '/complexe.pt')
...     def getValue(self):
...         return self._getFormValue()
...     def __call__(self):
...         return self.template

complexe.pt peut contenir n'importe quel code html valide. Vous pouvez utiliser la méthode getValue du widget pour accéder à la valeur stockée dans le request.