myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Graeme Steyn" <g.st...@cqu.edu.au>
Subject Validating Multiple Components in DataTable
Date Fri, 20 Jul 2007 10:56:16 GMT
Hi,
 
I have a <tr:table> component that is displaying rows from an ArrayLIst
containing instances of class X.  I would like to introduce a validator
that checks that if information is entered for any property, then all
properties must be populated for that row.  ANy rows that have no data
entered or all data entered are thus valid. At present I have the
arrangement provided below, but I appear to be getting the instances of
X from the original collection, rather than the table components local
values.  Thus when the view is first displayed, I can enter data in row
1 cell 1 and press next to invoke a POST back and the validation.  Using
the debugger, I find that the first iteration through the loop returns
an instance of X, but without the posted back data (everything is null).
I do not appear to be getting at the local converted value.
 
Any help would be greatly appreciated.
 
Thank you,
 
Regards,
 
Graeme.
 
PS. 
I came across a related query located at
http://mail-archives.apache.org/mod_mbox/myfaces-users/200608.mbox/%3c55
97324.post@talk.nabble.com%3e.  I am trying to avoid binding as the user
will be able to add and delete rows within my datatable, so I was hoping
to keep things flexible.
 
public class X {
 
private String prop1;
private String prop2;
private String prop3;
 
getters/setters...etc
}
 
====================
 
class BackingBean {
 
Collection <X> collection = new ArrayList <X> ();
 
etc
}
 
====================
 
<tr:message for="validateRows" />
 
<tr:table
        id="tblx"
        value="#{bean.collection}"
        binding="#{bean.coreTable}"
        var="entry" >
 
        <tr:column>
            <tr:inputText value="#{entry.prop1} />
        </tr:column>
 
        <tr:column>
            <tr:inputText value="#{entry.prop2} />
        </tr:column>
:
:
etc
</tr:table>
 
<tr:inputHidden id="validateRows" value="dummy"
validator="#{bean.validateRows}" />

=====================
 
Will only catch the first invlaid instance in the table - the validation
message appears at the table level rather than per row.
 
    public void validateEntriesComplete(FacesContext facesContext,
            UIComponent uIComponent,
            Object object) throws ValidatorException {
        
        UIXCollection uixCollection = (UIXCollection) coreTable;
        int oldRowIndex = uixCollection.getRowIndex();
        for (int rowNum = 0, numRows = uixCollection.getRowCount();
rowNum < numRows; rowNum++) {    
            uixCollection.setRowIndex(rowNum);
            X instancex = (X) uixCollection.getRowData();
            
            if (!instancex.isAllPropertiesSet()
            && instancex.isAnyPropertySet()) {
                
                FacesMessage message = Messages.getMessage(
                        Constants.LOCALIZATION_RESOURCE,
                        "IncompleteRecord", null);
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
                
            }
        }
        uixCollection.setRowIndex(oldRowIndex);
        
    }


Mime
View raw message