Widget Zope 3
Par gawel le 12/03/2007 21:29
Catégories : Zope3
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:
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('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.







