Success (and error) WFFM pipelines
All comes down to finding the correct pipelines - as usual in Sitecore. In our case we found a pipeline in case of success and one in case of error. But be aware: there is a big difference between the webforms and mvc solution.
Webforms
The pipelines in case of webforms are:
- <successAction>
- <errorSubmit>
These can be found in Sitecore.Forms.config.
Mvc
The pipelines in case of mvc are:
- <wffm.success>
- <wffm.error>
These can be found in Sitecore.MvcForms.config.
Custom redirect after success submit
In case of webforms, we could write a processor that redirects to the location we want and place it in the successAction pipeline as first processor (just before the original 'SuccessRedirect').
In case of MVC, it's a different story.
MVC solution
The wffm.success is by default empty. The actual redirect happens in another pipeline later on. So redirecting here is not the right thing to do. I started writing the processor and noticed that I had a lot of information in a Sitecore.Forms.Mvc.Models.FormModel.
You have access to all the fields, and to the SuccessRedirectUrl property. At this point this is filled with the url as set in Sitecore (which is very useful as a base) and you can alter it as you please. The actual redirect will happen later but it will use the value you have set here.
This example shows you to inherit from Sitecore.Forms.Mvc.Pipelines.FormProcessorBase and implement the Process method. Cast the arguments Model property to a FormModel and start using it. I add a querystring to the redirect url with the value of the first field - sounds useless but it's just an example.
You have access to all the fields, and to the SuccessRedirectUrl property. At this point this is filled with the url as set in Sitecore (which is very useful as a base) and you can alter it as you please. The actual redirect will happen later but it will use the value you have set here.
Code example
public class SuccessRedirect : FormProcessorBase<IFormModel>
{
public override void Process(FormProcessorArgs<IFormModel> args)
{
Assert.ArgumentNotNull((object)args, "args");
var model = args.Model as FormModel;
if (model == null)
return;
model.SuccessRedirectUrl = model.SuccessRedirectUrl + "?val=" + model.Results[0].Value;
}
}
This example shows you to inherit from Sitecore.Forms.Mvc.Pipelines.FormProcessorBase and implement the Process method. Cast the arguments Model property to a FormModel and start using it. I add a querystring to the redirect url with the value of the first field - sounds useless but it's just an example.
Conclusion
As often in WFFM there is a big difference between Webforms and Mvc. I tried the mvc way, and found that you can actually do a lot before Sitecore handles the model. You can change the redirect url, but there are probably also other useful possibilities here for scenarios I can't think of now...
Hi, What do you write in the Sitecore.Forms.Mvc.Models.FormModel ?
ReplyDeleteI'm not sure what you mean exactly.. the arguments of the process function will contain a FormModel object and you can read from it and alter the values. In this case I only changed the SuccessRedirectUrl as that contains the url to redirect to.
ReplyDelete