Sorry, forgot to include Trinidad in the subject.

________________________________

From: Graeme Steyn
Sent: Fri 20/07/2007 8:56 PM
To: 'MyFaces Discussion'
Subject: Validating Multiple Components in DataTable


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/[EMAIL 
PROTECTED]  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);
        
    }

Reply via email to