November Happy Hour will be moved to Thursday December 5th.

Anders Hattestad
Jan 26, 2011
  5636
(0 votes)

Just for fun

Deane Barker (@gadgetopia) tweeted about some code he had done just for fun to extend the PropertyDataGet handler. The concept is cool, and you should take a look @ http://pastie.org/1493264 

But the problem is of course that its not strong typed, so we have problems with magic strings. But sometimes you can live with that, and Deane code is a nice extension if you can find a use :)

You can extend properties with extension methods. Those will be strong typed from the backend code. So I made myself a method that found every extension methods that worked on PropertyData or PageData and returned PropertyData or string that exists in the dll’s and makes them available for use thou the PropertyDataCollection.GetHandler.

The trick Deane used to exclude assembly's that started with System work great.

Code Snippet
  1. public static void Initialize(int optionFlags)
  2. {
  3.     extendProperties = new Hashtable();
  4.     extendPageData = new Hashtable();
  5.     HelpText = new StringBuilder();
  6.     AddText(HelpText, "<ul>");
  7.     foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
  8.     {
  9.         // This cuts the number of assemblies to be iterated by about 75%.  If your assembly starts with "System" for some reason (really bad idea, for the record), you need to remove this.
  10.         if (assembly.FullName.StartsWith("System"))
  11.             continue;
  12.         foreach (Type type in assembly.GetTypes())
  13.         {
  14.             foreach (MethodInfo method in type.GetMethods())
  15.             {
  16.                 bool isExtension = method.IsDefined(typeof(ExtensionAttribute), true);
  17.                 if (isExtension)
  18.                 {
  19.                     var parameters = method.GetParameters();
  20.                     Add<PropertyData, PropertyData>("PropertyData [PropertyData]:", HelpText, method, parameters, extendProperties);
  21.                     Add<PropertyData, string>("string [PropertyData]:", HelpText, method, parameters, extendProperties);
  22.                     Add<PageData, PropertyData>("PropertyData [PageData]:", HelpText, method, parameters, extendPageData);
  23.                     Add<PageData, string>("string [PageData]:", HelpText, method, parameters, extendPageData);
  24.                 }
  25.             }
  26.         }
  27.     }
  28.     AddText(HelpText, "</ul>");
  29.     PropertyDataCollection.GetHandler = DiscoverExtensionMethods.GetProperty;
  30. }
for instance this extension methods
Code Snippet
  1. public static string TimeAgo(this PropertyData prop)
  2. {
  3.     TimeSpan dif = DateTime.Now - ((DateTime)prop.Value);
  4.     if (dif.Days > 0)
  5.         return string.Format("{0} day{1} ago ", dif.Days, dif.Days == 1 ? "" : "s");
  6.     else if (dif.Hours > 0)
  7.         return string.Format("{0} hour{1} ago ", dif.Hours, dif.Hours == 1 ? "" : "s");
  8.     else if (dif.Minutes > 0)
  9.         return string.Format("{0} minute{1} ago ", dif.Minutes, dif.Minutes == 1 ? "" : "s");
  10.     return string.Format("{0} second{1} ago ", dif.Seconds, dif.Seconds == 1 ? "" : "s");
  11. }

can be used with PageCreated like this

Code Snippet
  1. CurrentPage.Property["PageCreated"].TimeAgo();

or

Code Snippet
  1. PageCreated=<EPiServer:Property ID="PageCreated" PropertyName="PageCreated:TimeAgo" EnableViewState="false" runat="server" />

and will result in code like this

image

The extension method that exists in the demo template

image

can also be used like this

Code Snippet
  1. GetPreviewText=<EPiServer:Property ID="Property2" PropertyName="GetPreviewText(100)" EnableViewState="false" runat="server" />

and will render like this

image

I even made myself a help function, so if you use propertyname !help! you will get an overview of methods that exists

Code Snippet
  1. Help=<EPiServer:Property ID="Property1" PropertyName="!help!" EnableViewState="false" runat="server" />

 

image

Code is available in the code section

and any ideas where this can be used would be appreciated :)

Jan 26, 2011

Comments

Please login to comment.
Latest blogs
Optimizely SaaS CMS + Coveo Search Page

Short on time but need a listing feature with filters, pagination, and sorting? Create a fully functional Coveo-powered search page driven by data...

Damian Smutek | Nov 21, 2024 | Syndicated blog

Optimizely SaaS CMS DAM Picker (Interim)

Simplify your Optimizely SaaS CMS workflow with the Interim DAM Picker Chrome extension. Seamlessly integrate your DAM system, streamlining asset...

Andy Blyth | Nov 21, 2024 | Syndicated blog

Optimizely CMS Roadmap

Explore Optimizely CMS's latest roadmap, packed with developer-focused updates. From SaaS speed to Visual Builder enhancements, developer tooling...

Andy Blyth | Nov 21, 2024 | Syndicated blog

Set Default Culture in Optimizely CMS 12

Take control over culture-specific operations like date and time formatting.

Tomas Hensrud Gulla | Nov 15, 2024 | Syndicated blog