while using z3c.form-package i reach its limits here and there. thats why i
started to think about how a more general implemention should look like. my
intention of writing this is that i want to know what you are thinking about
it and i want to know the design-decisions that led to the different aspects
in the first part i try to give definitions of the concepts of z3c.form as
would understand them.
1.) what are the parts of a form-description?
forms are composed of widgets, actions and other forms. these elements are
rendered into the template and are therefor the forms elements. a form
doesnt consist of anything else.
2.) what are fields?
if one is using widgets, the task of assigning the extracted values of the
widgets to an attribute of the context arises. if you dont want to do this
by hand, you can use fields. they additionaly provide standard-values,
constraints and validations.
as those fields provide the validation, they always want to be used in
combination with a widget. this stands in conflict with what fields are
expect to be, the connection between attributes of a context and the
widgets. for me it feels like they are doing a little too much. two concepts
which should have been separated are unified in one object.
now the button comes into play. the button is a field too. needs a button
validation? is a button conntected to a form attribute? in my opinion, a
button isnt a field at all.
at least this is very confusing. i cant detect a clear concept behind a
field. as i tried to show, the field as it is used now mixes at least 3
different concepts. so i'm asking, what is the definition of a field?
from the z3c.form.field.txt: "The formlib uses form fields, to describe how
the form should be put together." this isnt true, the fields describe, which
attributes will be presented through which widget. the form itself consists
of widgets. a field is only a little helper.
3.) managers (fields, fieldwidgets, buttons, actions)
if you have a group of widgets, fields, buttons or actions that belong to
one concern, you can use a manager to collect them. in templates you can
iterate through widget-managers and display all of its widgets or let it
extract all data at once.
in z3c.form in contrast, all those little elements cant be used without
their managers. the using of a single field requires the fields-manager
because only it is consulted by the fieldwidgets-manager which in turn is
the only one that knows how to create a fieldwidget. fields should be able
to create their fieldwidgets on their own. managers shouldnt in fact don't
really be needed. they only should be a nice addition if you want to group
something of the same concern. so why was it done this way?
z3c.form is all about this one use-case where the user describes a context
with the help of a schema. you define fields, those fields are used to
create fieldwidgets and those are rendered in the standard-forms from
z3c.formui. its very nice to have this use-case well supported, but this
support should be based on more general implementations. this would enable
the user to create any kind of form.
some general words about object orientation:
z3c.form isnt object oriented in all parts. for example the field which
connects context-attributes to widgets. it should be the fields
responsibility to apply those values extracted from the widget to the
attribute. instead it is done by an external method z3c.form.applyChanges
that is called by EditForm. in this case i can imagine that this was done
for performance reasons. but if you had want to save method-calls (calling
an apply-method of every field), then the fields-manager should be the guy
to do this task. instead the field-manager is iterated from the outside and
the values are assigned from this external method. this is clearly
functional programming with objects as datacontainers.
this has several disadvantages:
1.) in my case i want to introduce a new field-type that is able to handle
subforms (for the loved and hated objectwidget). applying a value to a
subobject isnt the same as applying a value to a primitve attribute like an
integer or string. the solution as it is implemented in z3c.form would be to
rewrite the applyChanges-function to add an if-statement that devides
between the different field-types. polymorphism was developed to handle
2.) the field is a connector to an attribute. only the field should know,
which attribute it is connected to. by implementing it the way it was done
in EditForm, it is assumed, that the name of the attribute of the context,
the name the field and the name the widget uses are all the same. its not
really an issue because that's the way it is, but this is not clean, because
it could be different or something could be changed and then it would be
some little things
this should be a subclass of widget, instead a widget and a fieldwidget are
the same and differences are if-ed. this is not a big issue as well, but it
also isnt clean as well.
prefixes could be generated by joining every name of every parent of an
element. instead they are created by hand and assigned directly. should this
result in a better performance too? otherwise its cumbersome, import util,
expandPrefix... its not necessary.
now i'm interested in your points of view. nobody should feel offended. its
just that i'm coming to the conclusions i presented and that i now want to
know, if they are wrong or right.
for explanation: all these thoughts came from my plan to write a general
list- and dictionary-form. for this i already started to write a new
implementation of a form-package based z3c.form, but at some points i'm not
sure if i'm right. thats why i want to discuss the basic thoughts of my
approach. i feel that in the existing implementation a lot of stuff is
optimized for speed, but sometimes i'm not sure about this, as i explained
in the object orientation-part. there it feels to me like the principles of
object orientation were not used. i'm not sure, give me explanation. :) and
not only about this, about fields and the managers too.
View this message in context:
Sent from the Zope3 - users mailing list archive at Nabble.com.
Zope3-users mailing list