Oops! Forgotten the custom validation delegate.
public class MyDelegate extends ValidationDelegate {
private static final long serialVersionUID =
-7297508746898486393L;
private List<String> clientIds = new
ArrayList<String>();
public void addClientsId(String id) {
clientIds.add(id);
}
public void writeSuffix(IMarkupWriter writer,
IRequestCycle cycle,
IFormComponent component, IValidator validator) {
String clientId = component.getClientId();
if (clientIds.contains(clientId)) {
writer.printRaw(" ");
writer.begin("font");
writer.attribute("color", "red");
writer.print("**");
writer.end();
} else {
super.writeSuffix(writer, cycle, component,
validator);
}
}
}
Shing
--- Shing Hing Man <[EMAIL PROTECTED]> wrote:
>
> When you use a component in a loop, only one
> instance
> of it is used.
> The problem is that in the java code of your page,
> you
> can not, as you said,
> reference the second,say, 'component' in the loop.
> Each 'copy' of the component in the loop can be
> uniquely identified by
> getClientId().
>
> Example : .page
>
> <component id="loop" type="For">
> <binding name="source"
> value="ognl:entries"/>
> <binding name="value" value="ognl:entry"/>
>
> <binding name="index" value="myIndex"/>
>
>
> </component>
>
>
> <component id="inputTF" type="TextField">
> <binding name="value" value="ognl:entry" />
>
>
> </component>
>
>
> .html,
> <span jwcid="loop">
> Entry : <input type="text" jwcid="inputTF"/>
> <br>
>
> </span>
>
> The generated html would be :
>
> Entry : <input type="text" name="inputTF"
> value=""
> id="inputTF"/> <br>
>
> Entry : <input type="text" name="inputTF_0"
> value="" id="inputTF_0"/> <br>
>
> Entry : <input type="text" name="inputTF_1"
> value="" id="inputTF_1"/> <br>
>
>
> ----------------
> Note that the inputTF, inputTF_0, inputTF_1 are the
> unique clientIds.
> A possible solution is to use a custom delegate to
> record the clientId of the component in error, in
> your
> java code.
> In the custom delegate, you have your own method
> public void writeSuffix, to mark the fields in
> error.
> The following is an example to illustrate the above.
> ( But I have not put in the error message .)
>
>
> Shing
> ========================
>
>
>
> public abstract class TestComponentInLoop extends
> BasePage implements
> PageBeginRenderListener {
>
> @Bean(man.custom.MyDelegate.class)
> public abstract MyDelegate getDelegate();
>
> public abstract String[] getEntries();
>
> public abstract void setEntries(String[] str);
>
> public abstract int getMyIndex();
>
> public abstract void setMyIndex(int ent);
>
> public void formSubmit(IRequestCycle cycle) {
> // Mark the second inputTF in error
> MyDelegate delegate = getDelegate();
> delegate.addClientsId("inputTF_0");
> }
>
> public String getEntry() {
> return getEntries()[getMyIndex()];
> }
>
> public void setEntry(String str) {
> getEntries()[getMyIndex()] = str;
> }
>
> public void pageBeginRender(PageEvent arg0) {
> if (getEntries() == null) {
> String[] entries = new String[3];
> setEntries(entries);
> }
>
> }
>
> }
>
> ===============
>
> .page :
>
>
>
>
>
>
> <?xml version="1.0"?>
> <!DOCTYPE page-specification PUBLIC
> "-//Apache Software Foundation//Tapestry
> Specification 4.0//EN"
>
>
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
>
>
> <page-specification
> class="man.pages.TestComponentInLoop" >
>
> <description>
> Custom validation of a component in a loop
>
> </description>
>
> <component id="loop" type="For">
> <binding name="source"
> value="ognl:entries"/>
> <binding name="value" value="ognl:entry"/>
>
> <binding name="index" value="myIndex"/>
>
>
> </component>
>
>
> <component id="inputTF" type="TextField">
> <binding name="value" value="ognl:entry" />
>
>
> </component>
> </page-specification>
>
> ==============================
> .html
>
>
>
>
> <html>
>
> <head>
> <title>TestComponentInLoop</title>
> <meta name="GENERATOR" content="Quanta Plus">
> <meta http-equiv="Content-Type"
> content="text/html;
> charset=iso-8859-1">
> </head>
> <body jwcid="@Body">
> <form jwcid="@Form"
> listener="listener:formSubmit"
> delegate="ognl:delegate">
> <span jwcid="loop">
> Entry : <input type="text" jwcid="inputTF"/>
> <br>
>
> </span>
>
> <input type="submit"/>
> </form>
>
> </body>
> </html>
>
>
> --- Christian Dutaret <[EMAIL PROTECTED]>
> wrote:
>
> > Hi,
> >
> > I have a form which contains input fields (e.g.
> > PropertySelection
> > components) within For loops.
> > I need to perform some custom validation, which
> > sometimes acts across
> > several fields. I usually implement single-field
> > validation through
> > validators, and cross-field validation in the
> > listener (this is
> > necessary because i cannot validate against other
> > fields if the
>
=== message truncated ===
Home page :
http://uk.geocities.com/matmsh/index.html
___________________________________________________________
Inbox full of spam? Get leading spam protection and 1GB storage with All New
Yahoo! Mail. http://uk.docs.yahoo.com/nowyoucan.html
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]