[Zope3-dev] zope.app.form generates invalid HTML
Martin Aspeli
optilude at gmx.net
Thu Feb 22 21:13:23 EST 2007
Hi guys,
I'm pretty sure you're not allowed dots in ids of HTML elements. At
least not when they are prefixed by 'form'. A zope.schema.TextLine in a
formlib form, for example, generates HTML like this:
<input id="form.title" class="textType" type="text" value="Changed
title" size="20" name="form.title"/>
In particular, we want to style the fields to look a bit more like
Plone, and we have special cases for "title" and "description" that we
want to style by ID, not class.
However, CSS like this has no effect in Firefox or Safari:
#form.title {
font-size: 160%;
font-family: <dtml-var headingFontFamily>;
font-weight: normal;
width: 99%;
}
#form.description {
font: 100% <dtml-var fontFamily>;
font-weight: bold;
height: 6em;
width: 99%;
}
Not all that surprising - it could look like I'm styling a form with
class="description".
I then hacked zope.app.form.widget's renderElement() function to look
like this:
def renderTag(tag, **kw):
"""Render the tag. Well, not all of it, as we may want to / it."""
if 'id' in kw:
kw['id'] = kw['id'].replace('.', '-')
...
The tests in zope.app.form still pass.
Hacky, but the alternatives are to (a) override all the widgets or (b)
at least provide custom ones only for the purpose of getting stylable
ids on various fields. renderTag() is called from a lot of places with
id=self.name. We could fix all those, too, of course.
I would be happy to submit a patch for either the explicit check in
renderTag() or for changing all calls to this in zope.app.form.
However, if someone has depended on the ids being with dots (possibly
not quite as likely as it may seem, since these forms are typically
auto-generated) then we may not have a decent way of deprecating that.
Martin
More information about the Zope3-dev
mailing list