Dies ist Beispielcode abgeleitet von ftw.datepicker Widget.
In widget.py:
# This widget has a plone integration, so we take this one as base
from plone.z3cform.widget import SingleCheckBoxWidget
from z3c.form.interfaces import DISPLAY_MODE
from z3c.form.interfaces import ISingleCheckBoxWidget
from zope.interface import implementsOnly
from zope.component import adapter
from z3c.form.interfaces import IFormLayer
from z3c.form.interfaces import IFieldWidget
from z3c.form.widget import FieldWidget
class IMyBoolWidget(ISingleCheckBoxWidget):
"""Marker interface"""
class MyBoolWidget(SingleCheckBoxWidget)
implementsOnly(IMyBoolWidget)
display_template = ViewPageTemplateFile('templates/keyword_display.pt')
input_template = ViewPageTemplateFile('templates/keyword_input.pt')
hidden_template = ViewPageTemplateFile('templates/keyword_hidden.pt')
disabled_template = ViewPageTemplateFile('templates/disabled_hidden.pt')
def update(self):
super(MyBoolWidget, self).update()
if self.disable_widget():
# Change widget to display mode
self.mode = 'my_own_disabled_mode'
def disable_widget(self):
# Figure out if the widget should enabled or not.
def render(self):
if self.mode == INPUT_MODE:
return self.input_template(self)
elif self.mode == DISPLAY_MODE:
return self.display_template(self)
elif self.mode == HIDDEN_MODE:
return self.hidden_template(self)
elif self.mode == 'my_own_disabled_mode'
return self.disabled_template(self)
raise NotImplementedError(
'Mode: "{0}" not supported'.format(self.mode))
# Following the patterns of z3c widget and create a widget factory.
# This is not necessary in this case, since there are no additional params.
@adapter(IMyBoolWidget, IFormLayer)
@implementer(IFieldWidget)
def MyBoolWidgetFactory(field, request, config=None):
"""IFieldWidget factory for..."""
return FieldWidget(field, MyBoolWidget(request))
MyBoolFieldWidget = MyBoolWidgetFactory
Register mit zcml (configure.zcml):
<adapter factory=".widget.MyBoolWidgetFactory" />
das Widget für Ihre boolean Feld verwenden.
from plone.autoform.interfaces import IFormFieldProvider
from plone.supermodel import model
from zope import schema
from zope.interface import provider
from plone.directives import form
from wherever.the.widget.is import widget MyBoolFieldWidget
@provider(IFormFieldProvider)
class IGoogleNews(model.Schema):
"""Behavior interface to add some Google News features."""
form.widget('standout_journalism', MyBoolFieldWidget)
standout_journalism = schema.Bool(
title=_(u'Standout Journalism'),
required=False,
)
news_keywords = schema.Tuple(
title=_(u'Keywords'),
value_type=schema.TextLine(),
required=False,
)
Nach diesem Ansatz, den ich mehrere Widgets erstellt, Zum Beispiel auch ein KeywordWidget
Auf der positiven Seite:
- der Regel klein und minimalistisch
- leicht zu bedienen
malus:
- Sie müssen es manuell anwenden, wo immer Sie wollen.
Das Beispiel enthält keine Vorlagen, können Sie sie from z3c.form
oder plone.z3cform bekommen. *
Dieser Ansatz ziemlich geradlinig ist und verwendet nicht die alle Komponenten ein Widget in der Regel der Fall ist. B. eine Widget-Vorlage für jeden Modus usw. registrieren.
Sie graben in der Hölle ;-) Es ist wahrscheinlich einfacher, ein eigenes Widget zu schreiben, das vom ursprünglichen Bool-Widget abgeleitet ist. Das Überschreiben eines Widgets ist nicht so einfach, ohne eine neue Oberfläche im Formular oder Feld selbst bereitzustellen. Afaik Sie können das bool-Widget generell nur überschreiben. – Mathias
in der Tat, das war meine ursprüngliche Idee :-) Weißt du, wie kann ich das tun? – hvelarde