-
1. Re: Validation and refresh problems...
ilya_shaikovsky Dec 3, 2007 3:03 PM (in response to indyjones)Yes it's a good idea to have some code snippets to be pasted from here and checked.
-
2. Re: Validation and refresh problems...
indyjones Dec 3, 2007 3:27 PM (in response to indyjones)<h:form id="frmUsers"> <rich:dataTable id="tblUsers" var="varUser" value="#{usermanager.users}"> <a4j:support event="onRowClick" action="#{usermanager.selectUser(varUser)}" reRender="tplUserInfo, tblUsers" /> <f:facet name="header"> <rich:columnGroup> <rich:column> <h:outputText value="Username" /> </rich:column> <rich:column> <h:outputText value="First Name" /> </rich:column> <rich:column> <h:outputText value="Last Name" /> </rich:column> </rich:columnGroup> </f:facet> <rich:column><h:outputText value="#{varUser.username}" /></rich:column> <rich:column><h:outputText value="#{varUser.firstname}" /></rich:column> <rich:column><h:outputText value="#{varUser.lastname}" /></rich:column> </rich:dataTable> <rich:spacer height="8" /> <rich:datascroller id="dslUsers" for="tblUsers" maxPages="50" rendered="#{users.rowCount > 0}"/> </h:form> <h:form id="frmUserInfo"> <a4j:commandButton value="Update" action="#{usermanager.updateUser}" reRender="tblUsers, tplUserInfo" ></a4j:commandButton> <rich:tabPanel id="tplUserInfo" switchType="client"> <rich:tab label="Personal Information"> <h:panelGrid columns="2"> <h:outputText value="First Name:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.firstname}"> <s:validate/> </h:inputText> </s:decorate> <h:outputText value="Middle Name:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.middlename}"> <s:validate/> </h:inputText> </s:decorate> <h:outputText value="Last Name:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.lastname}"> <s:validate/> </h:inputText> </s:decorate> </h:panelGrid> </rich:tab> </rich:tabPanel> </h:form>
The method selectUser takes the user object in the table and populates the tabs below. (selectedUser).
The onComplete rerenders the tabPanel to show the new information each time you click a new record.
All this works great.
The problem occurs when you clear the values for middle and last name, BUT keep first name with a value.
You hit the update button and the validation catches the errors (required=true) and error is displayed.
Now, click on a new record, the First Name field now stays the same no matter what record you click on, but the last and middle name keep changing... -
3. Re: Validation and refresh problems...
indyjones Dec 3, 2007 3:29 PM (in response to indyjones)no edit button, sorry...
There is a required="true" on the fields within the tabpanel -
4. Re: Validation and refresh problems...
indyjones Dec 4, 2007 1:39 PM (in response to indyjones)Ok...more info...
If you add some <h:outputText> rendering the exact same attribute on the bean, it works fine but the <h:inputText> does not<h:form id="frmUsers"> <rich:dataTable id="tblUsers" var="varUser" value="#{usermanager.users}"> <a4j:support event="onRowClick" action="#{usermanager.selectUser(varUser)}" reRender="tplUserInfo, tblUsers" /> <f:facet name="header"> <rich:columnGroup> <rich:column> <h:outputText value="Username" /> </rich:column> <rich:column> <h:outputText value="First Name" /> </rich:column> <rich:column> <h:outputText value="Last Name" /> </rich:column> </rich:columnGroup> </f:facet> <rich:column><h:outputText value="#{varUser.username}" /></rich:column> <rich:column><h:outputText value="#{varUser.firstname}" /></rich:column> <rich:column><h:outputText value="#{varUser.lastname}" /></rich:column> </rich:dataTable> <rich:spacer height="8" /> <rich:datascroller id="dslUsers" for="tblUsers" maxPages="50" rendered="#{users.rowCount > 0}"/> </h:form> <h:form id="frmUserInfo"> <a4j:commandButton value="Update" action="#{usermanager.updateUser}" reRender="tblUsers, tplUserInfo" ></a4j:commandButton> <rich:tabPanel id="tplUserInfo" switchType="client"> <rich:tab label="Personal Information"> <h:panelGrid columns="2"> <h:outputText value="First Name 1:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.firstname}" required="true"> <s:validate/> </h:inputText> </s:decorate> <h:outputText value="First Name 2:" /> <h:outputText value="#{usermanager.selectedUser.firstname}" /> <h:outputText value="Middle Name:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.middlename}" required="true"> <s:validate/> </h:inputText> </s:decorate> <h:outputText value="Last Name:" /> <s:decorate> <h:inputText value="#{usermanager.selectedUser.lastname}" required="true"> <s:validate/> </h:inputText> </s:decorate> </h:panelGrid> </rich:tab> </rich:tabPanel> </h:form>
Steps...
1. Click on rows in the datatable. It should should change the data in the tabs with each row clicked
2. Clear out the data on the Middle Name field
3. Hit Update
4. The error Message "value required" will appear for the Middle Name Field
5. Click on a new record in the datatable
6. The only fields that update now are the Middle Name field and the First Name 2 field, the other fields do not update, BUT the bean information is correct....
Is this a bug with the Validation framework and Input Box? -
5. Re: Validation and refresh problems...
indyjones Dec 5, 2007 9:23 AM (in response to indyjones)Can anyone help out on this?
Is this a bug? Am I doing something wrong?
Do I need to post the backing bean? -
6. Re: Validation and refresh problems...
larselis Dec 10, 2007 7:40 AM (in response to indyjones)We're having the exact same problem... we have an inputtext with required="true" and when validation error is received and when we click on a new element in our datatable some values aren't updated, except the ones that were submitted and caused the validation error..
Would be really helpful if someone could help! -
7. Re: Validation and refresh problems...
indyjones Dec 14, 2007 10:27 AM (in response to indyjones)If someone else is getting this....that makes me feel a little better...
Can anyone help here?
For some reason, if Validation fails, the input boxes that DO NOT fail are not getting updated through AJAX....
Anyone?
Bueller?
Sorry, couldn't help my self... :) -
8. Re: Validation and refresh problems...
indyjones Dec 17, 2007 11:28 AM (in response to indyjones)My last bump before I let this fall into oblivion...
:) -
9. Re: Validation and refresh problems...
larselis Dec 20, 2007 2:49 AM (in response to indyjones)We've come up with a solution conerning the field updates... or actually two different ones:
Alternative 1 (the best one in our opinion):
We have a datatable filled with rows, when a row is clicked the fields should be updated. When a validation error occured, the fields that didn't cause a validation error didn't get updated.
1. The closest parent to the fields (in our case, a panelgrid) has a binding to the backing bean.
2. In the action method of the onrowclick we start off by ensuring ourselves that the fields CAN be updated by clearing the submittedValue and the value of the UIComponent. It seems that these are not cleared, as they should be??List<UIComponent> fields = getFormPanelGrid().getChildren(); for(UIComponent c : fields) { if(c instanceof HtmlInputText) { ((HtmlInputText)c).setSubmittedValue(null); ((HtmlInputText)c).setValue(null); } }
This works out fine for us.
Alternative 2:
Clear these properties of the UIComponent in the validator. If you have required="true" I guess alt.1 is the better since you don't have any obvious way to clear these values.
I hope it works out for ya! -
10. Re: Validation and refresh problems...
atijms Jan 18, 2010 8:41 AM (in response to indyjones)It seems though that this is still a problem. I'm using a fairly recent version of RichFaces (3.3.1) on Jboss AS 5.1.
Just like the other posters, I have a page with 2 forms. On the second form I have an a4j:commandButton, with a reRender attribute set to rerender fields in the first form.
As long as I have not posted the first form, pressing the a4j:button in the second form works perfectly. All the fields always get updated. However, as soon as I do post the first form AND this result in a validation error, then pressing the a4j:button does not longer update all fields in the first form.
In my case however, this only concerns input fields (h:inputText and h:inputTextarea). Strict output only components (h:outputText and h:dataTable with only h:outputTexts) still rerender correctly. As soon as I change an h:inputText to an h:outputText, it updates again. Therefor I'm pretty sure I don't have any of the IDs wrongly spelled orso. Contrary to what others post it doesn't seem to be affected by which inputs do or do not pass validation.
I'm going to try one of the solutions involving 'clearing' the input components (see also http://seamframework.org/Community/NoRerenderAfterValidationFailed), but I wonder if one of the rich faces devs could react on this issue.
Thanks in advance!
-
11. Re: Validation and refresh problems...
henk53 Jan 18, 2010 5:06 PM (in response to atijms)It's indeed still a problem.
I wonder, is this by design somehow or just a RichFaces bug? In case it's by design, maybe the documentation should be more clear about this? I spent days(!) a year ago to find the source of this and apparently it's still a problem for people after all this time.
If it's by design, maybe RichFaces could log a message, something like:
"The form on which component 'xyz' is attempted to be re-rendered has already been submitted. RichFaces does not re-render components in forms that have been submitted."
Or something like that of course
-
12. Re: Validation and refresh problems...
nbelaevski Jan 18, 2010 9:03 PM (in response to henk53)Hi,
This is really a behavior specific to JSF: http://ishabalov.blogspot.com/2007/08/sad-story-about-uiinput.html . You can replace a4j:commandLink components with h:commandLink - result will be just the same. As a workaround you can try clearing the whole component tree from action method instead of resetting states of the particular inputs.
-
13. Re: Validation and refresh problems...
henk53 Jan 19, 2010 4:33 AM (in response to nbelaevski)nbelaevski wrote:
Hi,
This is really a behavior specific to JSF: http://ishabalov.blogspot.com/2007/08/sad-story-about-uiinput.html . You can replace a4j:commandLink components with h:commandLink - result will be just the same. As a workaround you can try clearing the whole component tree from action method instead of resetting states of the particular inputs.
The link you gave explains the issue very well. Thanks! I think I have indeed stumbled upon that very behavior in a non a4j/richfaces setup before.
Nevertheless, since the user explicitly declares that he wishes some component to be re-rendered, wouldn't it be expected by the user if RichFaces would clear this state first? For compatibility with existing code this might even be done via a separate attribute.
e.g.
<a4j:commandButton reRenderFromSource="someID" ... >
or
<a4j:commandButton reRender="someID" forceValueEvaluation="true" ... >
What do you think?
-
14. Re: Validation and refresh problems...
ilya_shaikovsky Jan 19, 2010 10:23 AM (in response to henk53)It's better to resolve this at JSF spec level by filling RFC there. Our approach is not to change functionality described in JSF spec but extend using standard extension points. From the point of view of your case it sounds reasonable. But as the submitted value needed in order to fire valueChangeEvent - such functionality will conflict with standard JSF functionality in its current state.