I've been using Tapestry for a couple of month now and still haven't
understood how to work with collections in forms correctly.

What works well for me is the DefaultPrimaryKeyConverter. But it seems
such an overhead, I have to populate it in the beginPageRender, and
iterate it in the listener to update my original collection.

In the "Enjoy.." book by Kent Tong, he demonstrates using an
InvokeListener and calling a listener on every iteration, to process
the current item. Again, that seems odd to me, especially when you
want to delete items.

I also just used a list as source and the index attribute, it seems
Tapestry updates the items "in place" during rewind, which is fine.
But I don't understand how I can avoid the items being serialized into
hidden fields if I choose this approach.

Having said all that, I would like to add that I'm not new to
programing or Java. Quite the opposite, really, but I find Tapestry is
not very well documented in some areas (or the documentation is very
hard to find).

Anyway.. about your code: obviously, I can't tell you which is best.
But I think you don't have to pass your items as a parameter to the
listener method. Instead, the form fields (in this case, the
collection) will be bound to an instance variable in your page object.
Maybe you should drop that parameters attribute in the @Submit.
But you have to make sure the list is not null during rewind, and has
the right length, so you have to refill it before the rewind, and the
values will be overwritten during rewind.

The listener method that is called will be the one referenced in the
@Submit component. In your case, the one referenced in the @Form is
never called, I think. So you might want to lose on of those two, to
avoid confusion.

That's about all the advice I can give you.... let's just hope someone
who really knows let's us in on some "collections in forms" insight.

Lutz


On 11/13/06, Srinivas Yermal <[EMAIL PROTECTED]> wrote:
Can some tapestry savvy guys look at this and help us out here. Would really
appreciate the effort. This is quite a big blocker for me at present.
Thanks,
Srini.

On 11/10/06, Srinivas Yermal <[EMAIL PROTECTED]> wrote:
>
> BTW We currently use version 4.0.2. and run it on tomcat. I would also
> appreciate if somebody can point me to the "rewind" document if any. I have
> heard so many stories about common newbie rewind mistakes but couldnt find
> what they really are.
> Thanks again.
> Srini.
>
> On 11/10/06, Srinivas Yermal <[EMAIL PROTECTED]> wrote:
> >
> > Hi,
> >
> > I am a newbie trying to learn Tapestry. I did try to search through the
> > archives for a solution, but couldnt find anything relavant. It would be
> > great if someone could point me in the right direction.
> >
> > I have a page with a listing of a collection. I am using "For" component
> > (ForBean) in the form. There are text fields against each item which has a
> > value from the items in the collection. Now one can change the text value
> > and hit the save button at the end of the form. The listener that is
> > associated with the form gets called but I dont have a clue as to how I can
> > obtain the changed values from the collection. I tried with both form
> > listener and submit action listener. I always end up with a null or empty
> > item collection.
> >
> > Some code snippet below -
> >
> > public abstract Collection getItems();
> > public abstract void setItems(Collection items);
> >
> > ActionListener Method 1:
> > public void saveHistory(IRequestCycle cycle, Object[] list) {
> >         LOG.debug("saveHistory(cycle, array) invoked");
> >         if (null == list) return;
> >         for (Object o : list) {
> >             Question mh = (Question)o;
> >             LOG.debug(mh.getQuestionText() + " " + mh.getAnswerText());
> >         }
> > }
> >
> > ActionListener Method 2:
> > public void saveHistory(IRequestCycle cycle) {
> >         LOG.debug("saveHistory(cycle, array) invoked");
> >         List list = cycle.getListenerParameters();
> >         if (null == list) return;
> >         for (Object o : list) {
> >             Question mh = (Question)o;
> >             LOG.debug(mh.getQuestionText() + " " + mh.getAnswerText());
> >          }
> > }
> >
> >
> > FormListner Method:
> > public void saveFormHistory(IRequestCycle cycle) {
> >         LOG.debug("saveFormHistory(cyle) invoked");
> >         Collection<Question> list = getItems();
> >         if (null == list) return;
> >         for (Question mh: list) {
> >             LOG.debug(mh.getQuestionText () + " " + mh.getAnswerText());
> >         }
> > }
> >
> > The HTML file -
> >
> > <form jwcid="[EMAIL PROTECTED]" listener="listener:saveFormHistory">
> > ...
> > <tr jwcid="@For" source="ognl:items" value="ognl:item" element="tr">
> >
> >
> >   <td><span jwcid="@Insert" value="ognl:item.question.text">Question 
Text</span></td>
> >   <td><input jwcid="@TextField" value="ognl:item.answerText
> > "/></td>
> >
> > </tr>
> > ...
> > <input class="button" type="submit" value="Save" name="save" jwcid="@Submit" 
action="listener:saveHistory"
> >
> >  parameters="ognl:items"/>
> >
> > Please do let me know if something here is not right or if you have any
> > further questions. Looking forward for some advice.
> >
> > Thanks in advance.
> > Regards,
> > Srini.
> >
>
>


--
http://www.indygosoft.com



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

Reply via email to