From 00141ba8018b884588cede5abd142445d40e4eaa Mon Sep 17 00:00:00 2001 From: "agrath@gmail.com" Date: Sun, 19 Jun 2011 08:19:11 -0200 Subject: [PATCH] Added a new feature for plugin developers to create a model class that DynamicNode will return for their data type instead of the underlying type --- .../RazorDynamicNode/DynamicNode.cs | 31 +++++++++++++++++++ .../RazorDynamicNode/IRazorDataTypeModel.cs | 12 +++++++ .../RazorDynamicNode/RazorDataTypeModel.cs | 21 +++++++++++++ .../umbraco.MacroEngines.csproj | 2 ++ 4 files changed, 66 insertions(+) create mode 100644 umbraco.MacroEngines.Juno/RazorDynamicNode/IRazorDataTypeModel.cs create mode 100644 umbraco.MacroEngines.Juno/RazorDynamicNode/RazorDataTypeModel.cs diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs index ffa2aae42e..0f42b00802 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs @@ -16,6 +16,7 @@ using System.Xml; using System.Xml.Linq; using umbraco.cms.businesslogic.media; using umbraco.MacroEngines.Library; +using umbraco.BusinessLogic.Utils; @@ -363,6 +364,7 @@ namespace umbraco.MacroEngines } return list; } + static Dictionary RazorDataTypeModelTypes = null; public override bool TryGetMember(GetMemberBinder binder, out object result) { @@ -393,6 +395,35 @@ namespace umbraco.MacroEngines Guid dataType = ContentType.GetDataType(n.NodeTypeAlias, data.Alias); + if (RazorDataTypeModelTypes == null) + { + RazorDataTypeModelTypes = new Dictionary(); + + TypeFinder.FindClassesMarkedWithAttribute(typeof(RazorDataTypeModel)) + .ToList() + .FindAll(type => typeof(IRazorDataTypeModel).IsAssignableFrom(type)) + .ConvertAll(type => + { + RazorDataTypeModel RazorDataTypeModelAttribute = (RazorDataTypeModel)Attribute.GetCustomAttribute(type, typeof(RazorDataTypeModel)); + Guid g = RazorDataTypeModelAttribute.DataTypeEditorId; + return new KeyValuePair(g, type); + }) + .ForEach(item => RazorDataTypeModelTypes.Add(item.Key, item.Value)); + } + if (RazorDataTypeModelTypes.ContainsKey(dataType)) + { + Type dataTypeType = RazorDataTypeModelTypes[dataType]; + IRazorDataTypeModel razorDataTypeModel = Activator.CreateInstance(dataTypeType, false) as IRazorDataTypeModel; + if (razorDataTypeModel != null) + { + if (razorDataTypeModel.Init(n.Id, result)) + { + result = razorDataTypeModel; + return true; + } + } + } + //convert the string value to a known type return ConvertPropertyValueByDataType(ref result, name, dataType); diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/IRazorDataTypeModel.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/IRazorDataTypeModel.cs new file mode 100644 index 0000000000..6da3df032c --- /dev/null +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/IRazorDataTypeModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace umbraco.MacroEngines +{ + public interface IRazorDataTypeModel + { + bool Init(int CurrentNodeId, object PropertyData); + } +} diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/RazorDataTypeModel.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/RazorDataTypeModel.cs new file mode 100644 index 0000000000..b5f2e16bf6 --- /dev/null +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/RazorDataTypeModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace umbraco.MacroEngines +{ + [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)] + public sealed class RazorDataTypeModel : Attribute + { + public readonly Guid DataTypeEditorId; + + public RazorDataTypeModel(string DataTypeEditorId) + { + this.DataTypeEditorId = new Guid(DataTypeEditorId); + } + + + } + +} diff --git a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj index 89b314a3b2..00224ceb49 100644 --- a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj +++ b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj @@ -86,7 +86,9 @@ + +