2015-03-13 1 views
2

Comment puis-je ajouter dynamiquement des champs de formulaire, en fonction de catalog.results?z3c.form ajouter dynamiquement des champs dynamiquement un catalogue.results

Par exemple:

catalog.results = ['Channel A', 'Channel B', 'Channel C',] 

form.fields doivent être

form.fieldset Channels A { 
    input[type=checkbox].course a1 
    input[type=checkbox].course a2 
    input[type=checkbox].course a3 
} 
form.fieldset Channels B { 
    input[type=checkbox].course b1 
    input[type=checkbox].course b2 
    input[type=checkbox].course b2 
} 

Chaque canal est folderish, et tous les canaux peuvent contenir des cours N, pour chaque canal doit être un fieldset et pour chaque cours devrait être une entrée [type = case à cocher] (Ou MultiCheckbox) Champ généré

Désolé, j'ai mis ma question à jour, parce que notre designer a envoyé une erreur Image

Répondre

1

Je ne recommanderais pas de créer un champ séparé pour chaque option.

Vous pouvez définir un champ de liste dans votre z3c.form avec le CheckBoxFieldWidget:

from zope import schema 
from plone.directives import form 
from z3c.form.browser.checkbox import CheckBoxFieldWidget 


class IChannels(form.Schema) 

    form.widget(channels=CheckBoxFieldWidget) 
    channels = schema.List(
     title=_(u'label_channels', default='Channels'), 
     value_type=schema.Choice(
      vocabulary=u'channels.vocabulary'), 
     required=False) 

Enregistrez-vous maintenant un vobaulary, le nom channels.vocabulary, qui retourne termes basés sur une requête de catalogue.

from zope.interface import directlyProvides 
from zope.schema import vocabulary 
from zope.schema.interfaces import IVocabularyFactory 


def channels_vocabulary(context): 
    catalog = getToolByName(context, 'portal_catalog') 
    terms = [] 
    query = {} # Your query 
    for term in catalog(**query): 
     terms.append(vocabulary.SimpleTerm(value=term.decode('utf8'), 
           token=normalizer.normalize(term.decode('utf8')), 
           title=term.decode('utf8'))) 
    return vocabulary.SimpleVocabulary(terms) 

directlyProvides(channels_vocabulary, IVocabularyFactory) 

Inscrivez zcml:

<utility 
    component=".vocabularies.channels_vocabulary" 
    name="channels.vocabulary" 
/> 

L'exemple est basé sur http://docs.plone.org/develop/plone/forms/schemas.html#multi-choice-example

+0

Merci, pourrait être une bonne idée, mais je dois demander à notre designer .... – user966660

+0

Avez-vous besoin un fieldset séparé autour de chaque case à cocher? – Mathias

+0

Désolé, j'ai mis à jour/corriger ma question .... – user966660