Ryan,
Glad you figured out your problem.

regards,

Mark


-----Original Message-----
From: Ryan Cuprak [mailto:[EMAIL PROTECTED]
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  
> <[EMAIL PROTECTED]> 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:[EMAIL PROTECTED]
>> 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: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to