You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Ryan Cuprak <rc...@mac.com> on 2006/06/02 20:38:46 UTC

Custom component validation - two fields

Hello, 
 We are trying to implement a rather simple custom form component for a search page and perform validation on it. The custom component has a checkbox and a text field. If the checkbox is checked then a value must be provided in the text field. If not, the field must be decorated and a message displayed at the top of the form (tie in with the delegate etc). What is the recommended approach for implementing such component validation? Must we extend AbstractFormComponent and implement the renderFormComponent or is there a simpler approach? Is there a hybrid AbstractFormComponent/BaseComponent we have missed somehow? 

 Thanks!
 Ryan

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


RE: Custom component validation - two fields

Posted by Mark Stang <ms...@pingidentity.com>.
Ryan,
Glad you figured out your problem.

regards,

Mark


-----Original Message-----
From: Ryan Cuprak [mailto:rcuprak@mac.com]
Sent: Sat 6/3/2006 10:34 PM
To: Tapestry users
Subject: Re: Custom component validation - two fields
 

  Hello,
  I think figured out my problem - I needed to render the html  
template in rewindFormComponent! It was right in front of me the  
entire time.

  -Ryan

On Jun 3, 2006, at 3:40 PM, Ryan Cuprak wrote:

>
>  I think I follow. So you only display the TextField if the  
> checkbox was checked (via refresh submit)?
>  I plowed ahead with trying to implement my own  
> AbstractFormComponent that would use an html template and also  
> render some of its own content. However, I am getting a stale link  
> exception when I submit. Either I am setting something up  
> incorrectly or missing the boat on the rewind. Not exactly sure how  
> to parse the StaleLink page. Been diving through the list archives  
> and source trying to get a better idea on how component ids are  
> generated and the rewind is done.
>  I can create a new form component re-using other form components -  
> right?
>  To read the template I yanked code out of the BaseComponent class.
>
>  In the end, I want my custom component to display a checkbox and a  
> textfield (possibly a PropertySelection as well). When the form is  
> submitted, if the checkbox is checked but no content is contained  
> in the textfield I want to decorate it and add a message to the  
> top. This component will be used at least a dozen time on the page  
> for different search parameters.
>
>  Gradually learning!
>
>  Thanks,
>  Ryan
>
>
> Exception:
> ---
> You have clicked on a stale link.
>
> Rewind of form test/testForm expected 1 more form elements,  
> starting with id 'selected'.
>
> This is most likely the result of using your browser's back button,  
> but can also be an application error.
>
> Component Java code:
> ---
> public abstract class ComboTest extends AbstractFormComponent  
> implements ITemplateComponent {
>
>     private static Logger logger = Logger.getLogger(ComboTest.class);
>
>     private static final int OUTER_INIT_SIZE = 5;
>     private IRender[] _outer;
>     private int _outerCount = 0;
>
>     public ComboTest() {
>
>     }
>
>     public abstract boolean isSelected();
>
>     public void readTemplate(IRequestCycle cycle, IPageLoader  
> loader) {
>         loader.loadTemplateForComponent(cycle,this);
>     }
>
>     protected void  renderFormComponent(IMarkupWriter writer,  
> IRequestCycle cycle) {
>         logger.debug("being combotest render");
>         // this was an attempt to solve it, thought maybe it was  
> missing the id for this component (this didn't work.)
>         writer.begin("input");
>         writer.attribute("type","hidden");
>         writer.attribute("name",getName());
>         writer.attribute("id",getName());
>         writer.end();
>         for(int i =0; i < _outerCount; i++) {
>             _outer[i].render(writer,cycle);
>         }
>
>         logger.debug("end combotest render");
>     }
>
>     protected void rewindFormComponent(IMarkupWriter writer,  
> IRequestCycle cycle) {
>         logger.debug("combotest choosen: choosen: " +  
> cycle.getParameter(getName()));
>
>     }
>
>     public void finishLoad(IRequestCycle cycle , IPageLoader  
> loader , IComponentSpecification specification) {
>         logger.debug("finishing load");
>         readTemplate(cycle,loader);
>         super.finishLoad(cycle,loader,specification);
>     }
>
>     public void addOuter(IRender element) {
>         logger.debug("outer being rendered");
>         if(_outer == null) {
>             _outer = new IRender[OUTER_INIT_SIZE];
>             _outer[0] = element;
>             _outerCount = 1;
>             return;
>         }
>         if (_outerCount == _outer.length) {
>             IRender[] newOuter;
>             newOuter = new IRender[_outer.length*2];
>             System.arraycopy(_outer,0,newOuter,0,_outerCount);
>             _outer = newOuter;
>         }
>         _outer[_outerCount++] = element;
>     }
> }
>
> HTML Template:
> ---
> <html>
>     <head >
>         <title>Test</title>
>     </head>
>     <body jwcid="$content$">
>         <input type="checkbox" jwcid="selected"/>
>     </body>
> </html>
>
> Template:
> ---
> <component-specification  
> class="com.kodak.mis.web.components.ComboTest"
>                          allow-informal-parameters="yes"
>                          allow-body="no">
>     <component id="selected" type="Checkbox">
>         <binding name="value" value="selected"/>
>     </component>
> </component-specification>
>
>
> On Friday, June 02, 2006, at 12:38PM, Mark Stang  
> <ms...@pingidentity.com> wrote:
>
>> What we do is to wrap the checkbox in an AnySubmit.  And then when  
>> checked a submit happens and the field is then displayed with  
>> whatever mark-up is required.  If the user attempts to leave the  
>> screen standard edits tell them they need to provide a value.  If  
>> they uncheck the box, the field goes away.  Basically, it is done  
>> via a Conditional or Choose Component.
>>
>> hth,
>>
>> Mark
>>
>>
>> -----Original Message-----
>> From: Ryan Cuprak [mailto:rcuprak@mac.com]
>> Sent: Fri 6/2/2006 12:38 PM
>> To: users@tapestry.apache.org
>> Subject: Custom component validation - two fields
>>
>> Hello,
>> We are trying to implement a rather simple custom form component  
>> for a search page and perform validation on it. The custom  
>> component has a checkbox and a text field. If the checkbox is  
>> checked then a value must be provided in the text field. If not,  
>> the field must be decorated and a message displayed at the top of  
>> the form (tie in with the delegate etc). What is the recommended  
>> approach for implementing such component validation? Must we  
>> extend AbstractFormComponent and implement the renderFormComponent  
>> or is there a simpler approach? Is there a hybrid  
>> AbstractFormComponent/BaseComponent we have missed somehow?
>>
>> Thanks!
>> Ryan
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org




Re: Custom component validation - two fields

Posted by Ryan Cuprak <rc...@mac.com>.
  Hello,
  I think figured out my problem - I needed to render the html  
template in rewindFormComponent! It was right in front of me the  
entire time.

  -Ryan

On Jun 3, 2006, at 3:40 PM, Ryan Cuprak wrote:

>
>  I think I follow. So you only display the TextField if the  
> checkbox was checked (via refresh submit)?
>  I plowed ahead with trying to implement my own  
> AbstractFormComponent that would use an html template and also  
> render some of its own content. However, I am getting a stale link  
> exception when I submit. Either I am setting something up  
> incorrectly or missing the boat on the rewind. Not exactly sure how  
> to parse the StaleLink page. Been diving through the list archives  
> and source trying to get a better idea on how component ids are  
> generated and the rewind is done.
>  I can create a new form component re-using other form components -  
> right?
>  To read the template I yanked code out of the BaseComponent class.
>
>  In the end, I want my custom component to display a checkbox and a  
> textfield (possibly a PropertySelection as well). When the form is  
> submitted, if the checkbox is checked but no content is contained  
> in the textfield I want to decorate it and add a message to the  
> top. This component will be used at least a dozen time on the page  
> for different search parameters.
>
>  Gradually learning!
>
>  Thanks,
>  Ryan
>
>
> Exception:
> ---
> You have clicked on a stale link.
>
> Rewind of form test/testForm expected 1 more form elements,  
> starting with id 'selected'.
>
> This is most likely the result of using your browser's back button,  
> but can also be an application error.
>
> Component Java code:
> ---
> public abstract class ComboTest extends AbstractFormComponent  
> implements ITemplateComponent {
>
>     private static Logger logger = Logger.getLogger(ComboTest.class);
>
>     private static final int OUTER_INIT_SIZE = 5;
>     private IRender[] _outer;
>     private int _outerCount = 0;
>
>     public ComboTest() {
>
>     }
>
>     public abstract boolean isSelected();
>
>     public void readTemplate(IRequestCycle cycle, IPageLoader  
> loader) {
>         loader.loadTemplateForComponent(cycle,this);
>     }
>
>     protected void  renderFormComponent(IMarkupWriter writer,  
> IRequestCycle cycle) {
>         logger.debug("being combotest render");
>         // this was an attempt to solve it, thought maybe it was  
> missing the id for this component (this didn't work.)
>         writer.begin("input");
>         writer.attribute("type","hidden");
>         writer.attribute("name",getName());
>         writer.attribute("id",getName());
>         writer.end();
>         for(int i =0; i < _outerCount; i++) {
>             _outer[i].render(writer,cycle);
>         }
>
>         logger.debug("end combotest render");
>     }
>
>     protected void rewindFormComponent(IMarkupWriter writer,  
> IRequestCycle cycle) {
>         logger.debug("combotest choosen: choosen: " +  
> cycle.getParameter(getName()));
>
>     }
>
>     public void finishLoad(IRequestCycle cycle , IPageLoader  
> loader , IComponentSpecification specification) {
>         logger.debug("finishing load");
>         readTemplate(cycle,loader);
>         super.finishLoad(cycle,loader,specification);
>     }
>
>     public void addOuter(IRender element) {
>         logger.debug("outer being rendered");
>         if(_outer == null) {
>             _outer = new IRender[OUTER_INIT_SIZE];
>             _outer[0] = element;
>             _outerCount = 1;
>             return;
>         }
>         if (_outerCount == _outer.length) {
>             IRender[] newOuter;
>             newOuter = new IRender[_outer.length*2];
>             System.arraycopy(_outer,0,newOuter,0,_outerCount);
>             _outer = newOuter;
>         }
>         _outer[_outerCount++] = element;
>     }
> }
>
> HTML Template:
> ---
> <html>
>     <head >
>         <title>Test</title>
>     </head>
>     <body jwcid="$content$">
>         <input type="checkbox" jwcid="selected"/>
>     </body>
> </html>
>
> Template:
> ---
> <component-specification  
> class="com.kodak.mis.web.components.ComboTest"
>                          allow-informal-parameters="yes"
>                          allow-body="no">
>     <component id="selected" type="Checkbox">
>         <binding name="value" value="selected"/>
>     </component>
> </component-specification>
>
>
> On Friday, June 02, 2006, at 12:38PM, Mark Stang  
> <ms...@pingidentity.com> wrote:
>
>> What we do is to wrap the checkbox in an AnySubmit.  And then when  
>> checked a submit happens and the field is then displayed with  
>> whatever mark-up is required.  If the user attempts to leave the  
>> screen standard edits tell them they need to provide a value.  If  
>> they uncheck the box, the field goes away.  Basically, it is done  
>> via a Conditional or Choose Component.
>>
>> hth,
>>
>> Mark
>>
>>
>> -----Original Message-----
>> From: Ryan Cuprak [mailto:rcuprak@mac.com]
>> Sent: Fri 6/2/2006 12:38 PM
>> To: users@tapestry.apache.org
>> Subject: Custom component validation - two fields
>>
>> Hello,
>> We are trying to implement a rather simple custom form component  
>> for a search page and perform validation on it. The custom  
>> component has a checkbox and a text field. If the checkbox is  
>> checked then a value must be provided in the text field. If not,  
>> the field must be decorated and a message displayed at the top of  
>> the form (tie in with the delegate etc). What is the recommended  
>> approach for implementing such component validation? Must we  
>> extend AbstractFormComponent and implement the renderFormComponent  
>> or is there a simpler approach? Is there a hybrid  
>> AbstractFormComponent/BaseComponent we have missed somehow?
>>
>> Thanks!
>> Ryan
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


RE: Custom component validation - two fields

Posted by Ryan Cuprak <rc...@mac.com>.
 
 I think I follow. So you only display the TextField if the checkbox was checked (via refresh submit)?
 I plowed ahead with trying to implement my own AbstractFormComponent that would use an html template and also render some of its own content. However, I am getting a stale link exception when I submit. Either I am setting something up incorrectly or missing the boat on the rewind. Not exactly sure how to parse the StaleLink page. Been diving through the list archives and source trying to get a better idea on how component ids are generated and the rewind is done.
 I can create a new form component re-using other form components - right?
 To read the template I yanked code out of the BaseComponent class. 

 In the end, I want my custom component to display a checkbox and a textfield (possibly a PropertySelection as well). When the form is submitted, if the checkbox is checked but no content is contained in the textfield I want to decorate it and add a message to the top. This component will be used at least a dozen time on the page for different search parameters. 
 
 Gradually learning!

 Thanks,
 Ryan


Exception:
---
You have clicked on a stale link.

Rewind of form test/testForm expected 1 more form elements, starting with id 'selected'.

This is most likely the result of using your browser's back button, but can also be an application error.  

Component Java code:
---
public abstract class ComboTest extends AbstractFormComponent implements ITemplateComponent {

    private static Logger logger = Logger.getLogger(ComboTest.class);

    private static final int OUTER_INIT_SIZE = 5;
    private IRender[] _outer;
    private int _outerCount = 0;

    public ComboTest() {

    }

    public abstract boolean isSelected();

    public void readTemplate(IRequestCycle cycle, IPageLoader loader) {
        loader.loadTemplateForComponent(cycle,this);
    }

    protected void  renderFormComponent(IMarkupWriter writer, IRequestCycle cycle) {
        logger.debug("being combotest render");
        // this was an attempt to solve it, thought maybe it was missing the id for this component (this didn't work.)
        writer.begin("input");
        writer.attribute("type","hidden");
        writer.attribute("name",getName());
        writer.attribute("id",getName());
        writer.end();
        for(int i =0; i < _outerCount; i++) {
            _outer[i].render(writer,cycle);
        }

        logger.debug("end combotest render");
    }

    protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {
        logger.debug("combotest choosen: choosen: " + cycle.getParameter(getName()));

    }

    public void finishLoad(IRequestCycle cycle , IPageLoader loader , IComponentSpecification specification) {
        logger.debug("finishing load");
        readTemplate(cycle,loader);
        super.finishLoad(cycle,loader,specification);
    }

    public void addOuter(IRender element) {
        logger.debug("outer being rendered");
        if(_outer == null) {
            _outer = new IRender[OUTER_INIT_SIZE];
            _outer[0] = element;
            _outerCount = 1;
            return;
        }
        if (_outerCount == _outer.length) {
            IRender[] newOuter;
            newOuter = new IRender[_outer.length*2];
            System.arraycopy(_outer,0,newOuter,0,_outerCount);
            _outer = newOuter;
        }
        _outer[_outerCount++] = element;
    }
}

HTML Template:
---
<html>
    <head >
        <title>Test</title>
    </head>
    <body jwcid="$content$">
        <input type="checkbox" jwcid="selected"/>
    </body>
</html>

Template:
---
<component-specification class="com.kodak.mis.web.components.ComboTest"
                         allow-informal-parameters="yes"
                         allow-body="no">
    <component id="selected" type="Checkbox">
        <binding name="value" value="selected"/>
    </component>
</component-specification>
 

On Friday, June 02, 2006, at 12:38PM, Mark Stang <ms...@pingidentity.com> wrote:

>What we do is to wrap the checkbox in an AnySubmit.  And then when checked a submit happens and the field is then displayed with whatever mark-up is required.  If the user attempts to leave the screen standard edits tell them they need to provide a value.  If they uncheck the box, the field goes away.  Basically, it is done via a Conditional or Choose Component.
>
>hth,
>
>Mark
>
>
>-----Original Message-----
>From: Ryan Cuprak [mailto:rcuprak@mac.com]
>Sent: Fri 6/2/2006 12:38 PM
>To: users@tapestry.apache.org
>Subject: Custom component validation - two fields
> 
>Hello, 
> We are trying to implement a rather simple custom form component for a search page and perform validation on it. The custom component has a checkbox and a text field. If the checkbox is checked then a value must be provided in the text field. If not, the field must be decorated and a message displayed at the top of the form (tie in with the delegate etc). What is the recommended approach for implementing such component validation? Must we extend AbstractFormComponent and implement the renderFormComponent or is there a simpler approach? Is there a hybrid AbstractFormComponent/BaseComponent we have missed somehow? 
>
> Thanks!
> Ryan
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>For additional commands, e-mail: users-help@tapestry.apache.org
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>For additional commands, e-mail: users-help@tapestry.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


RE: Custom component validation - two fields

Posted by Mark Stang <ms...@pingidentity.com>.
What we do is to wrap the checkbox in an AnySubmit.  And then when checked a submit happens and the field is then displayed with whatever mark-up is required.  If the user attempts to leave the screen standard edits tell them they need to provide a value.  If they uncheck the box, the field goes away.  Basically, it is done via a Conditional or Choose Component.

hth,

Mark


-----Original Message-----
From: Ryan Cuprak [mailto:rcuprak@mac.com]
Sent: Fri 6/2/2006 12:38 PM
To: users@tapestry.apache.org
Subject: Custom component validation - two fields
 
Hello, 
 We are trying to implement a rather simple custom form component for a search page and perform validation on it. The custom component has a checkbox and a text field. If the checkbox is checked then a value must be provided in the text field. If not, the field must be decorated and a message displayed at the top of the form (tie in with the delegate etc). What is the recommended approach for implementing such component validation? Must we extend AbstractFormComponent and implement the renderFormComponent or is there a simpler approach? Is there a hybrid AbstractFormComponent/BaseComponent we have missed somehow? 

 Thanks!
 Ryan

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org