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]