2017-01-25 2 views
0

мне нужно переопределить поведение виджета, назначенный на поле на z3c.form (в частности виджета, используемый для schema.Bool поля, как один объявленных ниже), чтобы изменить способ режим виджета работает в различных условиях:Как переопределить или наследовать виджет z3c.form?

from plone.autoform.interfaces import IFormFieldProvider 
from plone.supermodel import model 
from zope import schema 
from zope.interface import provider 

@provider(IFormFieldProvider) 
class IGoogleNews(model.Schema): 
    """Behavior interface to add some Google News features.""" 

    standout_journalism = schema.Bool(
     title=_(u'Standout Journalism'), 
     required=False, 
    ) 

    news_keywords = schema.Tuple(
     title=_(u'Keywords'), 
     value_type=schema.TextLine(), 
     required=False, 
    ) 
+0

Вы копаетесь в аду ;-) Возможно, проще написать собственный виджет, наследующий от исходного виджета bool. Переопределение виджета не так просто, без предоставления нового интерфейса в форме или в самом поле. Afaik Вы можете переопределить только виджет bool. – Mathias

+0

Фактически, это была моя первоначальная идея :-) Вы знаете, как я могу это сделать? – hvelarde

ответ

2

Это пример кода, полученного из виджета ftw.datepicker.

В 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 

Регистрация с помощью ZCML (configure.zcml):

<adapter factory=".widget.MyBoolWidgetFactory" /> 

Используйте виджет для булева поля.

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, 
    ) 

После этого подхода я создал несколько виджетов, Например также KeywordWidget

С положительной стороны:

  • Обычно маленький и минималистичный
  • проста в использовании

malus:

  • Вам необходимо вручную нанести его везде, где хотите.

пример не включает в себя каких-либо шаблонов, вы можете получить их from z3c.form или plone.z3cform. *

Этот подход довольно прост и не использует все компоненты виджета обычно. Например, зарегистрируйте шаблон виджета для каждого режима и т. Д.

+0

спасибо! Я проверю это и дам вам обратную связь в следующие дни. – hvelarde

Смежные вопросы