[Zope3-Users] Re: A slew of z3c.form questions
Martin Aspeli
optilude at gmx.net
Sun Jul 6 17:17:50 EDT 2008
Hi Paul,
Thanks a lot for this!
> You can override the updateActions method and modify the css after the
> buttons are created. As you may have read, buttons are like schema
> fields, and actions are like the widgets for a schema field. So to
> modify the appearance of a button, you have to actually modify the
> action:
>
> @button.buttonAndHander("My Button", name="myButton")
> def handleMyButton(self, action):
> print "handling my button"
>
> def updateActions(self):
> super(MyForm, self).updateActions()
> self.actions["myButton"].addClass("my-custom-css-class")
Nice one! That works.
>> - Some fields on the form are provided by the content item. Others can come
>> from other schemata. There will be adapters from the context to these
>> interfaces. How do it up so that z3c.form uses the appropriate adapter to
>> read and write values, including in the add form?
>
> In the add form, it is up to you to handle the data input, by
> implementing the create and add methods.
Ah right. I guess I should be able to do that. I had guessed that
form.applyChanges() could do something implicit, but I guess that's a
bit too much to ask.
> As for the edit forms, I'm
> not entirely sure about this but I believe the form framework will
> just do the right thing. i.e. you might say:
>
> fields = field.Fields(IMyInterface)
> fields += field.Fields(IMyOtherInterface)
Okay, I'll try that. I actually don't know which interfaces will be used
until runtime (i.e. the form looks those up dynamically), but I'm
guessing I can build that dynamically anyway.
> And it will automatically try to adapt the context to the interface
> from which the field was defined. An alternative way which will
> definitely work (even if you don't have adapters) is to use groups:
>
> class MyOtherInterfaceGroup(group.Group):
> fields = field.Fields(IMyOtherInterface)
> def getContent(self):
> # do whatever you have to do to get something implementing
> IMyOtherInterface, adaptation or otherwise
> return myInterfaceToOtherInterfaceAdapter(self.context) #even
> a direct call to a specific adapter
>
> class MyForm(group.GroupForm):
> fields = field.Fields(IMyOtherInterface)
> groups = (MyOtherInterfaceGroup,)
>
> This is essentially the poor man's version of having a subform. It's
> also a great way to fake "object widgets" when one of the fields of
> IMyInterface is of type zope.schema.Object.
Interesting... can you elaborate on that (I may need it for something else)?
>> - I'd like to group widgets together into fieldsets. A fieldset may contain
>> widgets from multiple interfaces. All fieldsets will be on the same form, in
>> different <fieldset /> tags. Should I look to use groups for this? Subforms?
>> Or something else?
>
> I'd recommend just writing your own template. I've found that the
> templates in z3c.formui can only take you so far, and are best used as
> prototyping tools and reference documents. Of course, you can always
> reuse many of the macros, especially when it comes to displaying
> widget error messages.
Yeah, I'm happy enough to do that. Right now, I'm using a Ploneish
template from plone.z3cform, and I may yet try to generalise this and
extend that instead of my own code, but I'd expected to hack some TAL.
However, I'd like to know if z3c.form has some support for grouping
fields from across multiple adapters/schemata interfaces and marking
them up so that I could render the fields in the right order, in the
right logical groupings.
I'm guessing z3c.form groups do that, of course, but it's not clear to
me whether it's appropriate to use them for this kind of thing,
especially since the logical groupings and field ordering will only be
calculable at runtime.
Cheers,
Martin
--
Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book
More information about the Zope3-users
mailing list