2015-08-21 2 views
1

J'ai un registre de panneau de contrôle personnalisé Plone et j'essaie d'utiliser une méthode bien connue pour personnaliser certaines propriétés des widgets pour zope.schema.Text et zope.schema.TextField.Comment personnaliser le widget z3c.form pour les champs à l'intérieur des groupes (fieldsets)

Je personnalise souvent le updateWidgets de cette façon:

def updateWidgets(self): 
    super(MyEditForm, self).updateWidgets() 
    self.widgets['my_text_area'].style = 'width: 100%' 
    self.widgets['my_text_area'].rows = 7 

Mais maintenant, je travaille sur un formulaire où les champs sont dans deux fieldsets en fente:

class MySettingsEditForm(controlpanel.RegistryEditForm): 
    schema = IMySettingsSchema 
    groups = (Form1, Form2) 
    # fields = nothing 

Si je tente d'accéder self.widgets['my_text_area'] Je reçois KeyError. Il semble que comme je n'ai pas défini l'attribut fields, je ne peux pas accéder directement aux widgets.

Je trouve que j'ai groups donc je peux appeler quelque chose comme self.groups[0].fields['my_text_area'] mais je ne trouve pas moyen d'accéder à des widgets pour les champs à l'intérieur des groupes.

Comment personnaliser les attributs de widgets lors de l'utilisation de groupes?

+0

Vous ne trouvez pas les sources rapidement, mais je pense que de se rappeler, qu'il est impossible :-( –

+0

Ah, voilà est: https://github.com/zopefoundation/z3c.form/issues/2 –

+0

Merci @IdaEbkes! Lecture au sujet du problème et de la question SO correspondante à http://stackoverflow.com/questions/15385575/plone-4-dexterity -viewform-add-css-class-à-widget-in-fieldset-x il parle de champs cachés.J'ai des problèmes avec les champs * visible *, donc j'ai peur d'avoir manqué quelque chose pendant le débogage Restez à l'écoute ... –

Répondre

3

Je pense que ce dont vous avez besoin est de jouer avec un widget subform, voir ce code:

def fix_table_widget(self, name, widgets): 
    sub_widgets = widgets[name].widgets 
    for widget in sub_widgets: 
     new_label = widget.subform.widgets['weekday'].value 
     widget.subform.widgets['selected'].items[0]['label'] = new_label 
     widget.subform.widgets['weekday'].mode = 'hidden' 

def schoolrequest_customizations(self): 
    ''' Customizations for the schoolrequest base views 
    ''' 
    for group in self.groups: 
     widgets = group.widgets 
     if 'table_bus_to_school' in widgets: 
      self.block_widget_table('table_bus_to_school', widgets) 
      self.fix_table_widget('table_bus_to_school', widgets) 

     if 'table_bus_to_home' in widgets: 
      self.block_widget_table('table_bus_to_home', widgets) 
      self.fix_table_widget('table_bus_to_home', widgets) 

def update(self): 
    super(MyForm, self).update() 
    self.schoolrequest_customizations() 
+0

Ne fonctionne pas, je reçois 'AttributeError: 'GroupFactory' objet n'a pas d'attribut 'widgets'' lors de l'accès' group.widgets' –

+0

Oh je vois. Je lançais ce code dans la méthode update et non dans updateWidgets. – alepisa

+0

Incroyable, ça fonctionne comme un charme! Aussi avec sous-formulaire –