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>

Reply via email to