Anders Hattestad
Mar 7, 2011
  3220
(1 votes)

Dynamic Properties with versioning V0.9

One thing I miss a lot is version on dynamic properties. I have been looking for clean solutions to add that to EPiServer, an think I have come up with an concept that can work, while we wait for CMS 7.

I have borrowed some code from Itera.Objects, that can display other properties inside one property. and used that together with Page Objects.

The concept is simple, I have one property that have all the dynamic properties inside it. When I save the page, I also save the dynamic properties inside the Page Object store. If the property is set to inherit, I delete the value from the store on this page. But my get value method checks all the stores up to the top to find the value.

image

As you can see from this picture the value for Writer is retrieved from page id 7 in en.

The pointers here is that we have to make the owner property be modified when a dynamic property is changed. This is because we need to trigger the save event. I also save the values after the page is saved, so the version is correct.

When I need to retrieve the dynamic property value I have made my own property handle. That load the values based on the page.

Hade a lot more of code in this blog post, but Live writer died, and I didn’t have any backup :(, but the core saving is done by creating a class that have the value for the property. This is because its a bit tricky to save a property data object to the store.

Code Snippet
  1. static void Instance_SavedPage(object sender, EPiServer.PageEventArgs e)
  2. {
  3.     foreach (var prop in e.Page.Property)
  4.     {
  5.         if (prop is PropertyDynamicProperties)
  6.         {
  7.             PageObjectManager pom = new PageObjectManager(e.Page);
  8.             foreach (var dynProp in (prop as PropertyDynamicProperties).AllDynamicProperties)
  9.             {
  10.                 if (dynProp.InheritValue)
  11.                 {
  12.                     pom.Delete(dynProp.Name);
  13.                 }
  14.                 else
  15.                 {
  16.                     if (dynProp.Property.IsNull)
  17.                         pom.Delete(dynProp.Name);
  18.                     else
  19.                     {
  20.                         if (dynProp.Property.IsLanguageSpecific)
  21.                             pom.Save(dynProp.Name, DynProperyStoreValue.GetObjectFromProperty(dynProp.Property, e.Page.Property), PageObject.OwnerOption.PageLanguageBranch);
  22.                         else
  23.                             pom.Save(dynProp.Name, DynProperyStoreValue.GetObjectFromProperty(dynProp.Property, e.Page.Property), PageObject.OwnerOption.PageVersion);
  24.                     }
  25.                 }
  26.                 }
  27.             }
  28.         }
  29.     }
  30. }

So i do it like this. As you can see I use the different methods of storing into the Page Object store depending on the dynamic property is unique pr languages or not.

The full code can be found in the code section.

What you need to do is to create a property of type DynamicProperties on each page type, and you are good to go.

Mar 07, 2011

Comments

Please login to comment.
Latest blogs
Optimizely Forms: You cannot submit this form because an administrator has turned off data storage.

Do not let this error message scare you, the solution is quite simple!

Tomas Hensrud Gulla | Oct 4, 2024 | Syndicated blog

Add your own tools to the Optimizely CMS 12 admin menu

The menus in Optimizely CMS can be extended using a MenuProvider, and using the path parameter you decide what menu you want to add additional menu...

Tomas Hensrud Gulla | Oct 3, 2024 | Syndicated blog

Integrating Optimizely DAM with Your Website

This article is the second in a series about integrating Optimizely DAM with websites. It discusses how to install the necessary package and code t...

Andrew Markham | Sep 28, 2024 | Syndicated blog

Opticon 2024 - highlights

I went to Opticon in Stockholm and here are my brief highlights based on the demos, presentations and roadmaps  Optimizely CMS SaaS will start to...

Daniel Ovaska | Sep 27, 2024

Required fields support in Optimizely Graph

It's been possible to have "required" properties (value must be entered) in the CMS for a long time. The required metadata haven't been reflected i...

Jonas Bergqvist | Sep 25, 2024

How to write a bespoke notification management system

Websites can be the perfect vehicle for notifying customers of important information quickly, whether it’s the latest offer, an operational message...

Nicole Drath | Sep 25, 2024