--- Sylvain Wallez <[EMAIL PROTECTED]> schrieb: > Reinhard Poetz wrote: > > > Sylvain Wallez wrote: > > > >> Sylvain Wallez wrote: > >> > >>> Sorry to rain on the party, but the new widget > state stuff in CForms > >>> should make building multi-page forms a piece of > cake. > >>> > >>> Off writing an example.... > >> > >> > >> Done, I wrote my first wizard with CForms :-) > >> > >> Please update branch 2.1.x and point your browser > to > >> > http://localhost:8888/forms-samples/do-multipage.flow > >> > >> Enjoy! > > > > > > Great, thanks for the example! One question: IIUC > the wizard is driven > > by the widget states and the event handling > mechanism. > > > Yes: the various "pages" are widget groups > (fd:struct) whose state is > set either to active or invisible depending on the > displayed page. The > initial state, in the form definition, is to have > only page1 being > active, others being invisible. Navigation is > managed by fd:action that > change the page state. "next" validates the current > page whereas "prev" > doesn't. On the last page, a fd:submit goes back to > flowscript if > validation is successful. > > > This may solve many use cases but would it be > possible to control > > which part of the form is shown by the controller > (flowscript) which > > would bring some more flexibility (mix in > non-forms pages, jump to > > different sub-pages)? > > > That is possible if you use fd:submit instead of > fd:action when control > has to come back to flowscript. Since only the > active widgets are > validated, the submit will be sucessful if the > widgets in the current > page are valid, not taking other pages into account. > It's then the > flowscript's responsibility to display the > appropriate page when calling > again form.showForm(). > > > [some pseudocode ...] > > var myFlow() { > > var form = new Form("myForm"); > > form.load(myBean); > > form.showSubForm("myPipeline", "../page1"); > > cocoon.sendPageAndWait("showAnotherPage"); > > form.showSubForm("myPipeline", "../page"); > > form.save(myBean); > > } > > > The "showSubForm" above would simply set all pages > to invisible state > except the one defined by the second parameter > (which should be "pageX" > rather than "../pageX"). > > > And while writing this, another question came up: > What's the best way > > to deal with validation errors? example: On page 2 > the users enters > > something that wouldn't let page 1 validate any > more. Can we handle this? > > > Validation of the last page could revalidate > previous pages in order, > and switch back to the first one that doesn't > validate successfully. > > That could be something like: > > function validateWizard() { > currentPage.setState(WidgetState.INVISIBLE); // > another one may be > chosen below > for (page in pageList) { > page.setState(WidgetState.ACTIVE); > if (page.validate()) { > page.setState(WidgetState.INVISIBLE); > } else { > return false; // validation failed > } > } > } > > > Setting the page state to active before calling > validate() is important > as non-active widgets are not validated. That isn't > a problem here since > we must redisplay a page that doesn't validate, but > I'm thinking of > adding a Widget.validate(boolean force) method, that > would, when "force" > is true, validate widgets whatever their state.
Thanks for your remarks. If nobody beats my, I'll try to implement the wizard example by following your ideas next week. -- Reinhard ___________________________________________________________ Gesendet von Yahoo! Mail - Jetzt mit 100MB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de