[
http://issues.apache.org/jira/browse/TAPESTRY-517?page=comments#action_12320259
]
Jonas Maurus commented on TAPESTRY-517:
---------------------------------------
I don't think that it would be good design if a form component had to use a
parameter to distinguish between the cases of being rendered before or after an
associated component, because
a) this bug will only show up more often as more ajax-components are developed
that require coupling between multiple form components and
b) at the core of the problem is Tapestry's identity management that allows one
component instance to render itself multiple times representing multiple html
entities by changing its identity
However, a work-around that we've currently deployed would be to reset
AbstractFormComponent's "identity attributes" each time the component is
rendered, while still caching the value returned by IdAllocator as my previous
patch does. One way to do this wouldbe modifying AbstractComponent's
renderBody() - implementation like so:
public void renderBody(IMarkupWriter writer, IRequestCycle cycle)
{
for (int i = 0; i < _bodyCount; i++) {
if (_body[i] instanceof AbstractFormComponent) {
((AbstractFormComponent)_body[i]).setClientId(null);
((AbstractFormComponent)_body[i]).setName(null);
}
}
for (int i = 0; i < _bodyCount; i++)
_body[i].render(writer, cycle);
}
I'm still digging through Tapestry's codebase (which is huge and I'm fairly new
to it), but this works in the Workbench and in our Tapestry 4 application, so
it might at least be a work-around. I'll attach a patch containing this
modification as soon as beta 5 is out.
Thanks for taking the bug, btw :-)
> Using a FieldLabel component after the decorated form component causes the
> FieldLabel's id attribute to be wrong
> ----------------------------------------------------------------------------------------------------------------
>
> Key: TAPESTRY-517
> URL: http://issues.apache.org/jira/browse/TAPESTRY-517
> Project: Tapestry
> Type: Bug
> Components: Framework
> Versions: 4.0
> Reporter: Jonas Maurus
> Assignee: Howard M. Lewis Ship
> Attachments: AbstractFormComponent.clientid_fix.diff,
> AbstractFormComponent.clientid_fix_2.diff,
> AbstractFormComponent.clientid_fix_3.diff,
> AbstractFormComponent.clientid_fix_4.diff,
> AbstractFormComponent.clientid_fix_cvs_HEAD_20050825_1358.diff
>
> Quoting from TAPESTRY-409:
> <!-- page definition -->
> <component id="bookkeeperRCB" type="Checkbox">
> <binding name="selected" value="hasBookkeeperRole" />
> </component>
>
> <component id="adminRCB" type="Checkbox">
> <binding name="selected" value="hasAdministratorRole" />
> </component>
> <!-- page template -->
> <tr>
> <td><input jwcid="bookkeeperRCB" type="checkbox" value="Y" /></td>
> <td><label jwcid="@FieldLabel" for="bookkeeper"
> field="ognl:components.bookkeeperRCB"
> displayName="message:form.roles.bookkeeper">Bookkeeper</label></td>
> </tr>
> <tr>
> <td><input jwcid="adminRCB" type="checkbox" value="Y" /></td>
> <td><label jwcid="@FieldLabel" for="admin"
> field="ognl:components.adminRCB"
> displayName="message:form.roles.administrator">Administrator</label></td>
> </tr>
> yields:
> <tr>
> <td><input type="checkbox" name="bookkeeperRCB" id="bookkeeperRCB"
> value="Y"/></td>
> <td><label for="bookkeeperRCB$0">Bookkeeper</label></td>
> </tr>
> <tr>
> <td><input type="checkbox" name="adminRCB" checked="checked" id="adminRCB"
> value="Y"/></td>
> <td><label for="adminRCB$0">Administrator</label></td>
> </tr>
> as you can see the generated fieldnames ("bookkeeperRCB$0"...) are wrong.
> This always results in a stale-link exception.
> I tracked down the bug: FieldLabel calls prerenderField() which in turn
> causes an uniqueId to be allocated in
> AbstractFormComponent.renderIdAttribute. Everything works out when the
> FieldLabel precedes the form component it decorates. If it comes after the
> form component, IRequestCycle.getUniqueId() will already have stored an id
> for the component and return a new one.
> I'm not quite sure about the mechanics described above, as I don't fully
> understand FormSupportImpl yet, perhaps someone else can shed light on this.
> However, the allocated client id wasn't cached properly in
> AbstractFormComponent.renderIdAttribute. I'll attach a patch as soon as I've
> saved this bug report.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]