A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

Allan Thraen
Jul 8, 2011
  5257
(0 votes)

Summer of Code: XForm Criterion and updated CriteriaPack

image

So, to round off the first week in the Summer of Code series, I figured I’d do a little simple (but quite useful) Criterion for Visitor Groups. This time it’s the XForm Criterion, that will let you check if the current visitor has submitted any of the xforms on the site (in that session).

It’s available together with a few other minor updates in the CriteriaPack Project on Codeplex – and of course also as a separate NuGet package on the EPiServer NuGet feed.

One clever little details I learned while doing this, was how to make dropdownlists in the Visitor Group UI, with dynamically updated contents (like Form names or available roles). It’s really quite easy: just create your own ISelectionFactory and connect it to the Criterions data model like this:

public class XFormModel:CriterionModelBase
{
 
    [Required]
    [DojoWidget(SelectionFactoryType = typeof(EnumSelectionFactory), 
        LabelTranslationKey = "/shell/cms/visitorgroups/criteria/xform/submissionstatus", 
        AdditionalOptions = "{ selectOnClick: true }")]
    public SubmissionStatus SubmissionStatus { get; set; }
 
    [Required]
    [DojoWidget(SelectionFactoryType = typeof(FormSelectionFactory), 
        LabelTranslationKey = "/shell/cms/visitorgroups/criteria/xform/selectedxform",
        AdditionalOptions = "{ selectOnClick: true }")]
    public string SelectedXForm { get; set; }
 
    public override ICriterionModel Copy()
    {
        return base.ShallowCopy();
    }
}
 
public class FormSelectionFactory : ISelectionFactory
{
    #region ISelectionFactory Members
 
    public IEnumerable<System.Web.Mvc.SelectListItem> GetSelectListItems(Type property)
    {
        //Return list of forms
        return XForm.GetForms().Select(xf => new System.Web.Mvc.SelectListItem() { Text=xf.FormName, Value=xf.Id.ToString() });
    }
 
    #endregion
}
 
public enum SubmissionStatus
{
    HasSubmitted,
    HasNotSubmitted
}
Enjoy!
Jul 08, 2011

Comments

Jul 8, 2011 03:18 PM

Nice little series! Keep it up! :-)

Please login to comment.
Latest blogs
Looking back at Optimizely in 2025

Explore Optimizely's architectural shift in 2025, which removed coordination cost through a unified execution loop. Learn how agentic Opal AI and...

Andy Blyth | Dec 17, 2025 |

Cleaning Up Content Graph Webhooks in PaaS CMS: Scheduled Job

The Problem Bit of a niche issue, but we are building a headless solution where the presentation layer is hosted on Netlify, when in a regular...

Minesh Shah (Netcel) | Dec 17, 2025

A day in the life of an Optimizely OMVP - OptiGraphExtensions v2.0: Enhanced Search Control with Language Support and Synonym Slots

Supercharge your Optimizely Graph search experience with powerful new features for multilingual sites and fine-grained search tuning. As search...

Graham Carr | Dec 16, 2025

A day in the life of an Optimizely OMVP - Optimizely Opal: Specialized Agents, Workflows, and Tools Explained

The AI landscape in digital experience platforms has shifted dramatically. At Opticon 2025, Optimizely unveiled the next evolution of Optimizely Op...

Graham Carr | Dec 16, 2025