EPiServer Custom Property with Custom Settings
Posted on May 14, 2010 by Frederik Vig in EPiServerI was brushing up on custom properties and came across Allan Thræn’s post Custom Property: Category Drop Down. The code is simple and works great, but one thing I didn’t like is that you need to give the property the same name as the root category that you use to populate the drop down.
In EPiServer CMS 6 we now have the ability to add settings to the properties. Linus Ekström wrote a great post on how to use the new settings functionality: Settings for properties. After reading both Allan’s and Linus’ post I decided to give the EPiServer administrator the ability to choose which category should be the root category in the settings tab of the property.
Custom Property
using System; using EPiServer.Core.PropertySettings; using EPiServer.PlugIn; namespace EPiServer.Templates.Properties { [Serializable] [PageDefinitionTypePlugIn] [PropertySettings(typeof(CategoryDropDownSettings), true)] public class CategoryDropDown : EPiServer.Core.PropertyString { public override EPiServer.Core.IPropertyControl CreatePropertyControl() { return new CategoryDropDownControl(); } } } |
The code is almost identical to Allan’s except for the PropertySettings attribute.
using System.Web.UI.WebControls; using EPiServer.DataAbstraction; namespace EPiServer.Templates.Properties { public class CategoryDropDownControl : EPiServer.Web.PropertyControls.PropertyTextBoxControlBase { public override bool SupportsOnPageEdit { get { return false; } } protected DropDownList ddl; public override void CreateEditControls() { ddl = new DropDownList(); CategoryDropDownSettings settings = (CategoryDropDownSettings)base.PropertyData.GetSetting(typeof(CategoryDropDownSettings)); Category main_c = Category.Find(settings.RootCategory); ddl.Items.Add(new ListItem("", "")); foreach (Category c in main_c.Categories) { ListItem li = new ListItem(c.LocalizedDescription, c.Name); li.Selected = (((string)CategoryDropDown.Value) == c.Name); ddl.Items.Add(li); } this.ApplyControlAttributes(ddl); Controls.Add(ddl); } public override void ApplyEditChanges() { SetValue(ddl.SelectedValue); } public CategoryDropDown CategoryDropDown { get { return PropertyData as CategoryDropDown; } } } } |
Only difference to Allan’s code here is in the CreateEditControls method.
... CategoryDropDownSettings settings = (CategoryDropDownSettings)base.PropertyData.GetSetting(typeof(CategoryDropDownSettings)); Category main_c = Category.Find(settings.RootCategory); ... |
Custom Settings
using EPiServer.Core.PropertySettings; namespace EPiServer.Templates.Properties { [PropertySettingsUI(AdminControl = typeof(CategoryDropDownSettingsUI))] public class CategoryDropDownSettings : PropertySettingsBase { public int RootCategory { get; set; } public override IPropertySettings GetDefaultValues() { return new CategoryDropDownSettings { RootCategory = 0 }; } } } |
I’m setting the default rootCategory to be 0 (root).
using System.Linq; using System.Web.UI.WebControls; using EPiServer.Core; using EPiServer.Core.PropertySettings; using EPiServer.Web.WebControls; namespace EPiServer.Templates.Properties { public class CategoryDropDownSettingsUI : PropertySettingsControlBase { private InputCategoryTree _categoryTree; protected override void CreateChildControls() { base.CreateChildControls(); _categoryTree = new InputCategoryTree {ID = "CategoryTree"}; Label label = new Label { Text = "Root Category", AssociatedControlID = "CategoryTree" }; Controls.Add(label); Controls.Add(_categoryTree); } public override void LoadSettingsUI(IPropertySettings propertySettings) { EnsureChildControls(); _categoryTree.SelectedCategories = new CategoryList(new[] {((CategoryDropDownSettings)propertySettings).RootCategory}); } public override void UpdateSettings(IPropertySettings propertySettings) { EnsureChildControls(); // We only want the first selected category ((CategoryDropDownSettings)propertySettings).RootCategory = int.Parse(_categoryTree.SelectedCategories.ElementAt(0).ToString()); } } } |
When we add a new property we now have the option, under custom settings, to choose the root category for our drop down.
Which gives our editors these options.
Anders G. Nordby says:
Post Author June 6, 2011 at 11:33Instead of defaulting to RootCategory = 0, I suggest defaulting to:
RootCategory = EPiServer.DataAbstraction.Category.GetRoot().ID
: anders ;