Allan Thraen
+1
Jul 8, 2011
visibility 5413
star star star star star
(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! :-)

error Please login to comment.
Latest blogs
Optimizely CMS SaaS – Chrome Extension to Stop Accidentally Editing Production

If you work with Optimizely CMS SaaS across multiple clients, you know the anxiety — multiple tabs, multiple environments, and one wrong edit away...

Kiran Patil | Jul 1, 2026 |

Optimizely SaaS CMS Contracts: Define Shared Structure Across Content Types

📌 Scope: This post covers Optimizely CMS (SaaS) only — using the @optimizely/cms-sdk toolchain. CMS 13 (PaaS) handles shared structure differently...

Kiran Patil | Jul 1, 2026 |

Finding Thomas Part 3 - The Moment of Recognition

Remember Thomas? In digital landscape, Thomas is the returning visitor who reads everything, opens every email, converts on nothing. In standard...

Ritu Madan | Jun 26, 2026

Add more scheduled job settings from the Optimizely CMS 12 admin UI -- with OptiScheduledJob.ExtraParameters

  Optimizely (EPiServer) CMS 12 ships a great scheduled-jobs framework, but it has one frustrating gap: a job has nowhere to store its own...

Binh Nguyen Thi | Jun 25, 2026