How to override widget in the Plone control panel

124 views Asked by At

LinguaPlone uses the MultiSelect widget for selecting multiple languages. Something like an InOut widget or even a MultiCheckBox widget will be a better user interface as it is hard to see all the selected languages from a long list.

I tried to override the FormFields using:

form_fields['available_languages'].custom_widget = MultiCheckBoxWidget

as suggested in the zope.formlib docs, but am getting a traceback as follows:

Traceback (innermost last):
  Module ZPublisher.Publish, line 128, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 48, in call_object
  Module zope.formlib.form, line 795, in __call__
  Module five.formlib.formbase, line 50, in update
  Module zope.formlib.form, line 758, in update
  Module plone.fieldsets.form, line 30, in setUpWidgets
  Module zope.formlib.form, line 402, in setUpEditWidgets
  Module zope.formlib.form, line 334, in _createWidget
TypeError: __init__() takes exactly 4 arguments (3 given)

How can I override the default widget?

1

There are 1 answers

0
sureshvv On

What you need is:

from zope.formlib.widgets import OrderedMultiSelectWidget
from Products.LinguaPlone.browser.controlpanel import LanguageControlPanel

def MyMultiCheckBoxWidget(field, request):
    return OrderedMultiSelectWidget(field, field.value_type.vocabulary, request)


LanguageControlPanel.form_fields["available_languages"].custom_widget = MyMultiCheckBoxWidget