Don't miss out Virtual Happy Hour this Friday (April 26).

Try our conversational search powered by Generative AI!

Lee Crowe
Nov 4, 2011
  4774
(1 votes)

ElencySolutions.MultipleProperty v1.3.1 Released

For those of you who are not using ElencySolutions.MultipleProperty in their projects please refer back to previous blog posts and the usage instructions linked to on codeplex to see how it could help you out.

Some of the things it allows you to easily do but by no means all are briefly summarised below:

  • Create custom properties that comprise of other properties.
  • Create lists of properties
  • As the Multiple property entities make use of PropertyData objects you are able to pretty much have lists within lists.
  • Ability to define minimum and maximum number of entities.
  • Ability to copy the property to another page.
  • Ability to display entity properties in different tabs.

What’s new in v1.3.1

Those of you who keep an eye on World will probably be wondering why I have released another version already considering I released v1.3 two days ago.

Well, it’s not because there were bugs in v1.3 (as far as I am aware).  It’s because one of my colleagues wanted to do some additional things with property settings which the previous versions didn’t offer.  More specifically she had a property which was essentially a list of FilteredPageReference properties and she wanted to use the list based property on various page types but wanted to restrict the page types that could be picked differently depending on the page type.  She wanted to do this by modifying the filtered page reference settings for the page type property through admin mode..

So as I have plenty of time on the train, I thought I would extend the MultipleProperty offering to cater for her needs and as we are using the FilteredPageReference and MultipleProperty properties more and more I thought it would prove quite useful.

New features are summarised below:

  • A minimum number of entities can now be defined on a list of entities.  If the number of minimum enters have not been added then the page will not be able to be saved.
  • There are now three ways of setting property settings on an entity property.  Well if we are being picky two of them are pretty much the same but I wanted the solution to be backwards compatible.

Installation and Setup

ElencySolutions.MultipleProperty has been built to work with EPiServer CMS 6 and onwards.  Advanced usage instructions (which are definately worth having a read of) as well as examples can be found on codeplex.  The usage instructions also has an FAQ section which could prove quite handy.

The easiest way to install the assembly is to download the latest nuget feed from nuget.episerver.com.

The site on codeplex will also provide useful links for all blog posts that have been posted related to ElencySolutionsMultipleProperty.

Making use of MultipleProperty Entity PropertyData property settings

You are able to define property settings for a Property Control by setting the PropertySettingsCreator property within the MultiplePropertyEntityProperty attribute class.

The value of this property needs to be a type that implements IMultiplePropertySettingsCreator or IMultiplePropertySettingsCreatorAdvanced.

You are now also able to set the UseMatchingSettingsDecoratedOnPropertyType boolean property within the MultiplePropertyEntityProperty attribute class. If the value of the property is set to true then the relevant settings if found will be taken from the ones defined on the physical page type page definition property.

Code Examples

The code below demonstrate how to define property settings for a PropertyHtmlString property using both the IMultiplePropertySettingsCreator and IMultiplePropertySettingsCreatorAdvanced interfaces.

You will notice that for the WYSIWYGAlternative property it uses a property settings creator based on IMultipleSettingsCreatorAdvanced.  This is a new interface for v1.3.1 and the implementation needs to have a method named CreatePropertySettings which accepts a page type id and property name parameter.  This method allows you to conditionally based on the parameters create or load different property settings.  You will also notice that the implementation of this method calls MultiplePropertyHelper.GetPropertySettings which allows you to retrieve property setting that have been defined on a property data instance of a page data object created from a specific page type.

  1: [Serializable]
  2: [DataContract]
  3: [KnownType(typeof(CustomProperty))]
  4: [MultiplePropertyEntity]
  5: public class CustomProperty
  6: {
  7:     public override string ToString()
  8:     {
  9:         return MultiplePropertyHelper.SerializeObject(this);
 10:     }
 11: 
 12:     [MultiplePropertyEntityProperty(Caption = "What you see is what you get",
 13:         Type = typeof(PropertyXhtmlString),
 14:         SortIndex = 100,
 15:         PropertySettingsCreator = typeof(WYSIWYGPropertySettingsCreator))]
 16:     [DataMember]
 17:     public string WYSIWYG { get; set; }
 18: 
 19:     [MultiplePropertyEntityProperty(Caption = "What you see is what you get alternative",
 20:         Type = typeof(PropertyXhtmlString),
 21:         SortIndex = 100,
 22:         PropertySettingsCreator = typeof(WYSIWYGPropertySettingsCreatorAdvanced))]
 23:     [DataMember]
 24:     public string WYSIWYGAlternative { get; set; }
 25: }
 26: 
 27: public class WYSIWYGPropertySettingsCreator : IMultiplePropertySettingsCreator
 28: {
 29:     public IPropertySettings CreatePropertySettings()
 30:     {
 31:         TinyMCESettings settings = new TinyMCESettings().GetDefaultValues() as TinyMCESettings;
 32:         settings.ToolbarRows.Clear();
 33:         return settings;
 34:     }
 35: }
 36: 
 37: public class WYSIWYGPropertySettingsCreatorAdvanced : IMultiplePropertySettingsCreatorAdvanced
 38: {
 39:     public IPropertySettings CreatePropertySettings(int pageTypeId, string propertyName)
 40:     {
 41:         TinyMCESettings settings = new TinyMCESettings().GetDefaultValues() as TinyMCESettings;
 42: 
 43:         if (pageTypeId == 33 && string.Equals(propertyName, "MyCustomProperty_WYWIWYG"))
 44:         {
 45:             settings.ToolbarRows.Clear();
 46:         }
 47:         else if (pageTypeId == 34 && string.Equals(propertyName, "MyCustomProperty_WYWIWYG2"))
 48:         {
 49:             // get the settings from a property defined on a page type
 50:             PageData settingsPage = DataFactory.Instance.GetChildren(PageReference.RootPage)
 51:                 .Where(current => string.Equals(current.PageTypeName, "Settings Page Type"))
 52:                 .FirstOrDefault();
 53: 
 54:             if (settingsPage != null)
 55:                 settings = (TinyMCESettings)MultiplePropertyHelper.GetPropertySettings(settingsPage.Property["SomeProperty"], typeof(TinyMCESettings));
 56:         }
 57: 
 58:         return settings;
 59:     }
 60: }

The following example will demonstrate how you could make use of settings that have been applied to a property definition belonging to a page type and edited through admin mode.

You will notice that the UseMatchingSettingsDecoratedOnPropertyType boolean property of the MultiplePropertyEntityPropertyAttribute is set to true. 

In this example as the property control is a PropertyXhtmlString the code will look for TincyMCESettings that have been set on the property definition and if there are any it will apply the to the entity property.

  1: [Serializable]
  2: [PageDefinitionTypePlugIn(DisplayName = "PropertyCustomPropertyTwo", Description = "A custom property")]
  3: [PropertySettings(typeof(TinyMCESettings), true)]
  4: public class PropertyCustomPropertyTwo: MultiplePropertyBase<CustomPropertyTwo, CustomPropertyTwo>
  5: {
  6:     public override void CreateDefaultViewControls(Web.PropertyControls.PropertyDataControl control)
  7:     {
  8:         if (Value == null)
  9:             return;
 10: 
 11:         Gallery galleryControl = control.Page.LoadControl("~/MultiplePropertyExample/Units/Gallery.ascx") as Gallery;
 12:         galleryControl.PopulateControl(Value as ImageGallery);
 13:         control.Controls.Add(galleryControl);
 14:     }
 15: }
 16: 
 17: [Serializable]
 18: [DataContract]
 19: [KnownType(typeof(CustomPropertyTwo))]
 20: [MultiplePropertyEntity]
 21: public class CustomPropertyTwo
 22: {
 23:     public override string ToString()
 24:     {
 25:         return MultiplePropertyHelper.SerializeObject(this);
 26:     }
 27: 
 28:     [MultiplePropertyEntityProperty(Caption = "What you see is what you get",
 29:         Type = typeof(PropertyXhtmlString),
 30:         SortIndex = 100,
 31:         UseMatchingSettingsDecoratedOnPropertyType = true)]
 32:     [DataMember]
 33:     public string WYSIWYG { get; set; }
 34: }

 

Feedback

As always feedback is greatly appreciated, how many people are actively using this project within there EPiServer 6 solutions?

Also, if you have any suggestions for new features or changes I am happy to hear them.

Just twitter me @croweman or send me an email Smile

Nov 04, 2011

Comments

Please login to comment.
Latest blogs
Solving the mystery of high memory usage

Sometimes, my work is easy, the problem could be resolved with one look (when I’m lucky enough to look at where it needs to be looked, just like th...

Quan Mai | Apr 22, 2024 | Syndicated blog

Search & Navigation reporting improvements

From version 16.1.0 there are some updates on the statistics pages: Add pagination to search phrase list Allows choosing a custom date range to get...

Phong | Apr 22, 2024

Optimizely and the never-ending story of the missing globe!

I've worked with Optimizely CMS for 14 years, and there are two things I'm obsessed with: Link validation and the globe that keeps disappearing on...

Tomas Hensrud Gulla | Apr 18, 2024 | Syndicated blog

Visitor Groups Usage Report For Optimizely CMS 12

This add-on offers detailed information on how visitor groups are used and how effective they are within Optimizely CMS. Editors can monitor and...

Adnan Zameer | Apr 18, 2024 | Syndicated blog

Azure AI Language – Abstractive Summarisation in Optimizely CMS

In this article, I show how the abstraction summarisation feature provided by the Azure AI Language platform, can be used within Optimizely CMS to...

Anil Patel | Apr 18, 2024 | Syndicated blog

Fix your Search & Navigation (Find) indexing job, please

Once upon a time, a colleague asked me to look into a customer database with weird spikes in database log usage. (You might start to wonder why I a...

Quan Mai | Apr 17, 2024 | Syndicated blog