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
 Attachments: AbstractFormComponent.clientid_fix.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]

Reply via email to