Jason Johnston wrote:

On Mon, 2005-06-13 at 17:02 +0200, Sylvain Wallez wrote:
Hi all,

As part of the stabilization work on CForms, there are a couple of changes I'd like to do on the naming-related methods of the Widget interface.

Today we have:
- getId() which returns the local name of widget.
- getRequestParameterName() which returns the combination of the parent widgdet's requestParameterName with the local name.

Working with advanced templates and Ajax stuff, I find these names increasingly annoying and confusing: - each widget produces an HTML element with an "id" attribute filled with getRequestParameterName(), and not getId()!

The HTML element is also given a "name" attribute with the same value,
which is what is actually used as the parameter name when the form is
submitted.  As far as the HTML form is concerned (don't know about your
Ajax work) the id attribute on the HTML element is meaningless.

Right, but CForms produces more @id's than @name's :-)

The result of getRequestParameterName() is used:
- for input/@name
- for @id of either the input or an enclosing element (for partial Ajax updates) - for @id of HTML elements corresponding to container widgets (also for Ajax)

The real problem is that writing <div id="${widget.id}"> for a container in a template is faulty as it doesn't consider upper-level containers, and should be written <div id="${widget.fullRequestParameterName}">. That's this pitfall I'd like to fix with this renaming.

An notice that when mixing such div's with ft:widget, this gets even worse:
<div id="${widget.fullRequestParameterName}">
 <ft:widget id="foo"/>
</div>

Where the @id on ft:widget really is the local name...

So what I'd like in this end is:
 <div id="${widget.id}">
   <ft:widget name="foo"/>
 </div>

Meaning when you see "id" it's a full id in the DTD meaning of it, and when you see "name" on a ft:* tag it's a local name within the current container widget (not talking about html @name's what we actually never see in templates).

- this getRequestParameterName is really tooooo long to type, especially in templates where we have no IDE autocompletion.

Ideally, I'd like to do the following renaming:
- getId() --> getName()
- getRequestParameterName() --> getId()
But since the meaning of getId() changes, this is likely to cause weird things in existing code.

So I propose the following:
- getId() --> getName()

So now the method name no longer matches the form definition:

<fd:field id="theIdOfTheWidget">
         ^^

Yeah, I'd like to change that one also, as this id attribute isn't a real id in the DTD meaning of it, as different widgets in different containers can have the same name, e.g:

<fd:repeater id="foo">
 <fd:widgets>
   <fd:field id="duplicate"/>
 </fd:widgets>
</fd:repeater>
<fd:repeater id="bar">
 <fd:widgets>
   <fd:field id="duplicate"/>
 </fd:widgets>
</fd:repeater>

However, such a renaming causes no problem as there's no semantic change on an existing notation (like what I'd like to do on getId()), and thus can live in "compatibility mode" for a long time.

So now we use getName() to get the value of the id attribute?  This
seems to me like you're causing a greater asymmetry in an attempt to
solve a lesser one.

With the renaming of the "id" attribute to "name", we achieve an increased global consistency.

- getRequestParameterName() --> getFullId()

Since it seems you're wanting to tie this method more closely to the
widget's HTML styling, what about just getName()?  That would match the
HTML element's 'name' attribute which is what gets sent in the request
anyway.

No, as "name" is the local name which has to be unique among siblings, but need not to be globally unique.

- deprecate and remove later getId() and getRequestParameterName().
Once getId() will have been removed for some time, we'll be able to reintroduce it as an equivalent to getFullId().

Sylvain

--
Sylvain Wallez                        Anyware Technologies
http://apache.org/~sylvain            http://anyware-tech.com
Apache Software Foundation Member     Research & Technology Director

Reply via email to