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("&nbsp;");
                                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]

Reply via email to