@Persist("flash") http://tapestry.apache.org/tapestry5/tapestry-core/guide/persist.html
and, since I can peddle my own wares @Persist("flashcookie") http://wiki.apache.org/tapestry/Tapestry5HowToUsePersistentFieldStrategy I've had one (or two) too many glasses of wine. May your night be as good as mine :) --nK On Tue, Apr 22, 2008 at 9:54 PM, Christoph Jäger < [EMAIL PROTECTED]> wrote: > Hi, > > Sorry for this long post. I spent quite some time now to try to figure out > how to use forms to edit/update objects the "right" way (you know, simple, > stable, elegant, easy to read, easy add things, ...). I use Tapestry > 5.0.11. I am almost satisfied with what I came up with now, but some > improvements need to be done. Maybe someone on this list can help with some > ideas. > > As an example, lets have a PersonEdit page, with a PersonDao injected. You > can create new Person entries or edit existing ones. To edit an existing > person, there is a PageLink on a PersonSearch page, which has the Person's > primary id as context. To create a new Person, a PageLink with 0 as context > is used. To make this work, we have onActivate() and onPassivate() methods > in PersonEdit: > > void onActivate(int id) > { > _id = id; > if (id == 0) > { > _person = new Person(); > } > else > { > _person=personDao.get(id); > } > } > > int onPassivate() > { > return _id; > } > > This way we can avoid using @Persist on the Person property (because, for > instance, we want a user to be able to open two browser windows, viewing two > different Person entries side by side and edit and save both of them. I > think this would be problematic if we use @Persist, but please correct me if > I am wrong). > > Now, editing an existing user works like this: > > - click the "edit user XYZ" PageLink on the PersonSearch page > - in onActivate(), the personDao is used to query the Person from the > database > - an HTML form is rendered to let the user edit the values > > Up to here everything looks perfect. > > - the user edits the Person's data and hits the "save" button > > - onActivate() is called, a fresh Person is loaded from the database > - for each field in the HTML form, validation is done (if defined), and a > property in the fresh Person instance is set if the validation was > successful > - onValidateForm() is called if existing to allow for cross-field > validation > - if all validations were successful, onSuccess() is called. Here we call > _person=personDao.save(_person). This save method returns a new Person > instance, exactly as it was written to the database (primary id may be > generated by the database, time stamps or version numbers updated, ...). We > use this new Person's id : _id=_person.getId() to make sure we have the > correct if for the next onPassivate() > - onPassivate() is called > - result sent to browser, redirect > - onActivate() loads Person again > - new form is rendered > > This is good, but I think it could be improved. > > 1. The Person is loaded from the database twice (using personDao.get()), > and saved once. The save() method of personDao already gives us a new, fresh > instance of Person, it seems like a waste to load it again after the > redirect. > > 2. During validation, we check if there is already a Person with the same > userid (in onValidateForm(), or in onValidateFromUserId()) and warn the user > if this is the case. But what happens if a new Person with this userId is > added just after onValidateForm() is called, but before onSuccess() is > called, where we want to save? To make our program solid, we have to take > this into account. In case save() does not work, we do not want to see some > exception page, but the form, as it was filled, with a hint what might have > gone wrong, so the user can try again. To make this possible, we have to > move the save() to onValidateForm(), because there we can still record form > errors (I think there is a JIRA for an improvement to this situation). > > 3. We want to give the user feedback of what happened. After clicking the > save button, we want to show a message like "Successfully saved new person > information" above the form (at the same place you would see error messages > like: "The first name is mandatory"). The only thing that comes to my mind > is to use @Persist to save the message from the onSuccess() or > onValidateForm() through the redirect to the next page render. But now I > have problems to make sure this @Persist'ed message is cleared and is only > presented to the user directly after the save button was clicked. > > > I think to find a nice solution for these issues (you know, easy things > should be easy to do, and a form like this does not sound very complex to > me, so there should be an easy solution), a @Persist, which persists values > just through the redirect would be very helpful. The problem is, I have no > idea how this could work. But maybe an option like this already exists (I am > sure I am not the first to have problems like this), and I just didn't find > it. > > Any ideas are welcome, > > Thanks, > > Christoph Jäger > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >