I tried using the commons validation features of Shale. The application is using Myfaces 1.1.1. The validation javascript is being written back to the browser. The server side validation is working fine but a javascript `field error occurs during the . However there is a problem with the client side input element Id's that the javascript validation is looking for versus the client side id's that are generated by the dataList. The page i tried validation on has a Myfaces dataList inside a form, and for each iteration through the list there are inputs. Basically a dataList will append the `row index` to the client side Id to guarantee uniqueness, as in "myForm:myDataList_0:someRequiredField" for the first row, "myForm:myDataList_1:someRequiredField" for the second, and so on. But in the rendering of the javascript by the struts validatorScript tag, the clientId of the input components lose their row index.
I have created an illustrative example that generates the same problem. The code is included below and the inline comments hopefully explain what's happening. To keep things simple there is no backing bean, and I use a class from shale-core to give me some objects to edit, so all you'd just need to deploy into a shale-core based "blank" web-app. My application page is more complex than this but I am running into exact the same problem withthe validation javascript Does this look familiar to anyone? Any workarounds, solutions?... Thanks -- Paul Devine <%@ page language="java" import="java.util.*, org.apache.shale.dialog.impl.DialogImpl"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://myfaces.apache.org/extensions" prefix="t"%> <%@ taglib uri="http://struts.apache.org/shale/core" prefix="s" %> <% /* Put a couple of Shale DialogImpl objects into the session (we just need an object with a getter and a setter * and this class is readily accessible) */ List inputObjects = new ArrayList(); inputObjects.add(new DialogImpl()); inputObjects.add(new DialogImpl()); session.setAttribute("someInputObjects",inputObjects); %> <f:view> <%-- A form with a dataList of inputs. The client side id's of the components will be someForm:someDataList_0:someRequiredField and someForm:someDataList_1:someRequiredField --%> <h:form id="someForm" onsubmit="return validateForm(this);"> <t:dataList id="someDataList" value="#{someInputObjects}" var="object" rowIndexVar="index"> <h:outputLabel value="Name"/> <h:inputText id="someRequiredField" value="#{object.name}" size="20" required="true"> <s:commonsValidator type="required" arg="Name" server="true" client="true"/> </h:inputText><h:message for="someRequiredField" errorClass="errorMessage"/> </t:dataList> <%-- The dataList is now closed. Before we close out the form, write out the validator javascript. But this results in a mismatch on the client side id's in the required function. Note the uniqueness indexes _0 and _1 are missing. Because we are outside the dataList there is no "row index" anymore (and for some reason the HtmlInputText components `calculate` their clientId's again when asked for getClientId from Shale's ValidatorScript findCommonsValidators method Here's what the validatorScript comes up with:- function required() { this[0] = new Array("someForm:someDataList:someRequiredField", "Name is required.", new Function("x", "return {}[x];")); } --%> <s:validatorScript functionName="validateForm"/> <h:commandButton action="submit"/> </h:form> </f:view>