2017-01-25 3 views
0

Ich brauche das Verhalten des Widgets auf einem Feld auf einem z3c.form (speziell die für eine schema.Bool Feld wie das unten erklärt ein verwendeten Widget) zugeordnet außer Kraft zu setzen, wie die Widget-Modus unter verschiedenen Bedingungen arbeitet sich ändern:Wie überschreiben oder erben Sie ein z3c.form-Widget?

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

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

+0

in der Tat, das war meine ursprüngliche Idee :-) Weißt du, wie kann ich das tun? – hvelarde

Antwort

2

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.

+0

danke! Ich werde das testen und Ihnen in den nächsten Tagen Feedback geben. – hvelarde

Verwandte Themen