Creating a BrowserLanguageCriteria for Visitor groups.
This is my first blog post ever, on any site I think! So I’m a bit nervous, but I hope that someone will find it interesting. So here goes!
This morning I decided that I should learn how to create custom criterias for Visitor groups. I started out by reading an article by Ted Nyberg, to get an idea on how it worked.
But I was short on ideas on what to build. Until I stumbled on http://criteriapack.codeplex.com/, where they had a list on planned criterias. Perfect I thought, and choose to create the BrowserLanguageCriterion. I used BrowserOSCriterion as a template for my own code, and started working.
So first I needed a settings class as mentioned in Teds article. I decided that the editor would want to choose a language from a dropdownlist and every culture/language in the browser should be availible. It was easy figuring out how to get all cultures. The problem for me was to get all cultures into an enum, since I started out using EnumSelectionFactory. Which I guess require an enum?
To be honest, I haven’t used Enums much and had to google if there was a possibility to convert a list/array of languages to an enum. Apparently not, according to some forum post.
My solution was kinda easy once I figured out how to do it. I created my own SelectionFactoryType.
publicclass LanguageFactory : ISelectionFactory
{
public IEnumerable<SelectListItem> GetSelectListItems(Type property)
{
//For each culture availibleforeach(CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) {
yieldreturnnew SelectListItem() { Text = ci.EnglishName, Value = ci.EnglishName };
}
}
}
and changed my SelectionFactoryType to my newly created one;
Finished with my settings class, I started working on the criterion class. Basically what I needed was to compare the
browserlanguage with the language choosen in the criteria for the visitorgroup.
This was done easily by matching the two.
[VisitorGroupCriterion(
Category = "Technical Criteria",
Description = "Match Browser language with specified value",
DisplayName = "Browser language")]
publicclass BrowserLanguageCriterion : CriterionBase<BrowserLanguageModel>
{
privatestring _browserlang;
//matches the browserlanguage with the criterion set language.publicoverridebool IsMatch(System.Security.Principal.IPrincipal principal,
It was a great experience getting this to work and it made me write my first blog!
I’m quite pleased how this day turned out and hope that someone will find my
blogpost interesting!
/Jens Qvist Here is the full source;
using EPiServer.Personalization.VisitorGroups;
using EPiServer.Data;
using System.Threading;
using System.Globalization;
using EPiServer.Web.Mvc.VisitorGroups;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System;
namespace EPiServer.Classes
{
publicclass BrowserLanguageModel : CriterionModelBase
{
private MatchStringType _browserLanguageMatchType;
[DojoWidget(SelectionFactoryType = typeof(EnumSelectionFactory),
AdditionalOptions = "{ selectOnClick: true }")]
public MatchStringType BrowserLanguageMatchType
{
get
{
returnthis._browserLanguageMatchType;
}
set
{
this._browserLanguageMatchType = value;
}
}
[Required]
[DojoWidget(SelectionFactoryType = typeof(LanguageFactory))]
publicstring BrowserLanguage { get; set; }
publicoverride ICriterionModel Copy()
{
returnbase.ShallowCopy();
}
}
[VisitorGroupCriterion(
Category = "Technical Criteria",
Description = "Match Browser language with specified value",
DisplayName = "Browser language")]
publicclass BrowserLanguageCriterion : CriterionBase<BrowserLanguageModel>
{
privatestring _browserlang;
//matches the browserlanguage with the criterion set language.publicoverridebool IsMatch(System.Security.Principal.IPrincipal principal,
Added an image showing how the criterion looks in EPiServer.