Stephen2

SF Personalisation - GetUserSegment()

Feb 15th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.09 KB | None | 0 0
  1. public static Segment GetUserSegment() {
  2.     Segment firstMatchingSegment = null;
  3.     var personalizationService = new PersonalizationService();
  4.     var personalizationConfig = Config.Get<PersonalizationConfig>();
  5.     var personalizationManager = PersonalizationManager.GetManager();
  6.     var activeSegments = personalizationManager.GetSegments().Where(o => o.IsActive).OrderBy(o => o.Priority).ToList();
  7.  
  8.     //Reflection... :(
  9.     var validateModuleItemMethod = typeof(SystemManager).GetMethod("ValidateModuleItem", BindingFlags.Static | BindingFlags.NonPublic);
  10.     var isCriteriaMatchMethod = personalizationService.GetType().GetMethod("IsCriteriaMatch", BindingFlags.Instance | BindingFlags.NonPublic);
  11.     var buildTestContextMethod = personalizationService.GetType().GetMethod("BuildTestContext", BindingFlags.Instance | BindingFlags.NonPublic);
  12.     var testContext = buildTestContextMethod.Invoke(personalizationService, null) as IPersonalizationTestContext;
  13.  
  14.     //Test Segment is easy
  15.     if (testContext.IsInTestMode && testContext.SelectedSegmentId != Guid.Empty) {
  16.         return personalizationManager.GetSegments().SingleOrDefault(o => o.Id == testContext.SelectedSegmentId);
  17.     }
  18.  
  19.     //Validate which segments are valid for assessment
  20.     var validSegments = activeSegments.Where(
  21.         segment => segment.CriteriaGroups.All(
  22.             criteriaGroup => criteriaGroup.Criteria.All(
  23.                 criteria => {
  24.                     var item = personalizationConfig.Criteria[criteria.CriterionName];
  25.                     return item == null ? false : (bool)validateModuleItemMethod.Invoke(null, new[] { item });
  26.                 }
  27.             )
  28.         )
  29.     );
  30.  
  31.     //Pick first matching (priority is set in the Sitefinity UI)
  32.     firstMatchingSegment = validSegments.FirstOrDefault(
  33.         segment => segment.CriteriaGroups.All(
  34.             criteriaGroup => criteriaGroup.Criteria.Any(
  35.                 criteria => (bool)isCriteriaMatchMethod.Invoke(personalizationService, new object[] { criteria, testContext })
  36.             )
  37.         )
  38.     );
  39.  
  40.     return firstMatchingSegment;
  41. }
Advertisement
Add Comment
Please, Sign In to add comment