Those who worked with Portal and Portlets (and here I mean JSR-168 portlets), they know that Portlet has two kind of requests: RenderRequest and ActionRequest. These two requests can be compared with regular servlet's GET and POST requests, but there is significant difference: Portlet's ActionRequest can not have any response body!
This means, that the approach (GET request shows form - Submit POSTs form to server - server validates form and in case of failure re-displays form) taken by Cocoon Form's showForm() method is not possible anymore. Once form is POSTed (or, ActionRequest is received - in Portlet-speak), response can not be HTML of the re-displayed form, response must be always redirect, and only subsequent RenderRequest can send HTML with re-displayed forms.
To achieve this functionality, Form.showForm() method should be overridden:
Form.prototype.showForm = function(uri, bizData) {
// ... Snip ...
var finished = false;
this.isValid = false;
var s = capture();
var k = cocoon.sendPageAndWait(uri, bizData);
var formContext = Packages.org.apache.cocoon.woody.flow.javascript.
WoodyFlowHelper.getFormContext(cocoon, this.locale);
// Prematurely add the bizData as a request attribute so that event listeners can use it
// (the same is done by cocoon.sendPage())
cocoon.request.setAttribute(
Packages.org.apache.cocoon.components.flow.
FlowHelper.CONTEXT_OBJECT, bizData);
finished = this.form.process(formContext);
// Additional flow-level validation
if (finished && this.form.isValid()) {
if (this.validator == null) {
this.isValid = true;
} else {
this.isValid = this.validator(this.form, bizData);
finished = this.isValid;
}
}
if (!finished) {
// Failure: Redirect back to starting point, s.
cocoon.redirectTo(s.id + ".continue");
FOM_Cocoon.suicide();
}
var widget = this.form.getSubmitWidget();
// Can be null on "normal" submit
this.submitId = widget == null ? null : widget.getId();
// Success: Redirect out of this function
cocoon.redirectTo(cocoon.makeWebContinuation(new Continuation()).id + ".continue");
FOM_Cocoon.suicide();
}
Where, capture() method is simply:
function capture() {
var wc = cocoon.createWebContinuation(0);
return wc;
}
PS All of the above relevant when using Cocoon Forms (a.k.a. Woody) from the Flow.
Posted by Vadim at March 26, 2004 8:45 AM