diff --git a/build/Build.proj b/build/Build.proj
index 134bb668ed..a442c2bdd4 100644
--- a/build/Build.proj
+++ b/build/Build.proj
@@ -267,7 +267,7 @@
-
+
diff --git a/src/Umbraco.Core/Events/ExportEventArgs.cs b/src/Umbraco.Core/Events/ExportEventArgs.cs
new file mode 100644
index 0000000000..161a073615
--- /dev/null
+++ b/src/Umbraco.Core/Events/ExportEventArgs.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+using System.Xml.Linq;
+
+namespace Umbraco.Core.Events
+{
+ public class ExportEventArgs : CancellableObjectEventArgs>
+ {
+ ///
+ /// Constructor accepting a single entity instance
+ ///
+ ///
+ ///
+ ///
+ public ExportEventArgs(TEntity eventObject, XElement xml, bool canCancel)
+ : base(new List { eventObject }, canCancel)
+ {
+ Xml = xml;
+ }
+
+ ///
+ /// Constructor accepting a single entity instance
+ /// and cancellable by default
+ ///
+ ///
+ ///
+ public ExportEventArgs(TEntity eventObject, string elementName) : base(new List {eventObject}, true)
+ {
+ Xml = new XElement(elementName);
+ }
+
+ protected ExportEventArgs(IEnumerable eventObject, bool canCancel) : base(eventObject, canCancel)
+ {
+ }
+
+ protected ExportEventArgs(IEnumerable eventObject) : base(eventObject)
+ {
+ }
+
+ ///
+ /// Returns all entities that were exported during the operation
+ ///
+ public IEnumerable ExportedEntities
+ {
+ get { return EventObject; }
+ }
+
+ ///
+ /// Returns the xml relating to the export event
+ ///
+ public XElement Xml { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/ImportEventArgs.cs b/src/Umbraco.Core/Events/ImportEventArgs.cs
new file mode 100644
index 0000000000..3bdd6d6fcf
--- /dev/null
+++ b/src/Umbraco.Core/Events/ImportEventArgs.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.Xml.Linq;
+
+namespace Umbraco.Core.Events
+{
+ public class ImportEventArgs : CancellableObjectEventArgs>
+ {
+ ///
+ /// Constructor accepting an XElement with the xml being imported
+ ///
+ ///
+ public ImportEventArgs(XElement xml) : base(new List(), true)
+ {
+ Xml = xml;
+ }
+
+ ///
+ /// Constructor accepting a list of entities and an XElement with the imported xml
+ ///
+ ///
+ ///
+ ///
+ public ImportEventArgs(IEnumerable eventObject, XElement xml, bool canCancel)
+ : base(eventObject, canCancel)
+ {
+ Xml = xml;
+ }
+
+ protected ImportEventArgs(IEnumerable eventObject, bool canCancel) : base(eventObject, canCancel)
+ {
+ }
+
+ protected ImportEventArgs(IEnumerable eventObject) : base(eventObject)
+ {
+ }
+
+ ///
+ /// Returns all entities that were imported during the operation
+ ///
+ public IEnumerable ImportedEntities
+ {
+ get { return EventObject; }
+ }
+
+ ///
+ /// Returns the xml relating to the import event
+ ///
+ public XElement Xml { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs
index 478a90851b..c7e68e6eca 100644
--- a/src/Umbraco.Core/Services/IPackagingService.cs
+++ b/src/Umbraco.Core/Services/IPackagingService.cs
@@ -61,6 +61,15 @@ namespace Umbraco.Core.Services
/// An enumerable list of generated languages
IEnumerable ImportLanguages(XElement languageElementList, int userId = 0, bool raiseEvents = true);
+ ///
+ /// Imports and saves the 'Macros' part of a package xml as a list of
+ ///
+ /// Xml to import
+ /// Optional id of the User performing the operation
+ /// Optional parameter indicating whether or not to raise events
+ ///
+ IEnumerable ImportMacros(XElement element, int userId = 0, bool raiseEvents = true);
+
///
/// Imports and saves package xml as
///
diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs
index d96d6665ba..851420fa61 100644
--- a/src/Umbraco.Core/Services/PackagingService.cs
+++ b/src/Umbraco.Core/Services/PackagingService.cs
@@ -71,15 +71,15 @@ namespace Umbraco.Core.Services
/// containing the xml representation of the Content object
public XElement Export(IContent content, bool deep = false, bool raiseEvents = true)
{
- if (raiseEvents)
- {
- if (ExportingContent.IsRaisedEventCancelled(new SaveEventArgs(content), this))
- return default(XElement);
- }
-
//nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias);
var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck();
+ if (raiseEvents)
+ {
+ if (ExportingContent.IsRaisedEventCancelled(new ExportEventArgs(content, nodeName), this))
+ return new XElement(nodeName);
+ }
+
var xml = Export(content, nodeName);
xml.Add(new XAttribute("nodeType", content.ContentType.Id));
xml.Add(new XAttribute("creatorName", content.GetCreatorProfile().Name));
@@ -96,7 +96,7 @@ namespace Umbraco.Core.Services
}
if(raiseEvents)
- ExportedContent.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedContent.RaiseEvent(new ExportEventArgs(content, xml, false), this);
return xml;
}
@@ -114,6 +114,7 @@ namespace Umbraco.Core.Services
var xml = new XElement(nodeName,
new XAttribute("id", contentBase.Id),
+ new XAttribute("key", contentBase.Key.ToString("D")),
new XAttribute("parentID", contentBase.Level > 1 ? contentBase.ParentId : -1),
new XAttribute("level", contentBase.Level),
new XAttribute("creatorID", contentBase.CreatorId),
@@ -167,7 +168,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingContent.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ if (ImportingContent.IsRaisedEventCancelled(new ImportEventArgs(element), this))
return Enumerable.Empty();
}
@@ -184,7 +185,7 @@ namespace Umbraco.Core.Services
_contentService.Save(contents, userId);
if(raiseEvents)
- ImportedContent.RaiseEvent(new SaveEventArgs(contents, false), this);
+ ImportedContent.RaiseEvent(new ImportEventArgs(contents, element, false), this);
return contents;
}
@@ -198,7 +199,7 @@ namespace Umbraco.Core.Services
_contentService.Save(contents, userId);
if(raiseEvents)
- ImportedContent.RaiseEvent(new SaveEventArgs(contents, false), this);
+ ImportedContent.RaiseEvent(new ImportEventArgs(contents, element, false), this);
return contents;
}
@@ -335,8 +336,8 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this))
- return default(XElement);
+ if (ExportingContentType.IsRaisedEventCancelled(new ExportEventArgs(contentType, "DocumentType"), this))
+ return new XElement("DocumentType");
}
var info = new XElement("Info",
@@ -401,7 +402,7 @@ namespace Umbraco.Core.Services
tabs);
if (raiseEvents)
- ExportedContentType.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedContentType.RaiseEvent(new ExportEventArgs(contentType, xml, false), this);
return xml;
}
@@ -430,7 +431,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingContentType.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ if (ImportingContentType.IsRaisedEventCancelled(new ImportEventArgs(element), this))
return Enumerable.Empty();
}
@@ -481,7 +482,7 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ImportedContentType.RaiseEvent(new SaveEventArgs(list, false), this);
+ ImportedContentType.RaiseEvent(new ImportEventArgs(list, element, false), this);
return list;
}
@@ -726,6 +727,11 @@ namespace Umbraco.Core.Services
return contentType;
}
+ ///
+ /// Used during Content import to ensure that the ContentType of a content item exists
+ ///
+ ///
+ ///
private IContentType FindContentTypeByAlias(string contentTypeAlias)
{
using (var repository = _repositoryFactory.CreateContentTypeRepository(_uowProvider.GetUnitOfWork()))
@@ -778,12 +784,11 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingDataType.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinition), this))
- return default(XElement);
+ if (ExportingDataType.IsRaisedEventCancelled(new ExportEventArgs(dataTypeDefinition, "DataType"), this))
+ return new XElement("DataType");
}
var prevalues = new XElement("PreValues");
-
var prevalueList = _dataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeDefinition.Id)
.FormatAsDictionary();
@@ -807,7 +812,7 @@ namespace Umbraco.Core.Services
xml.Add(new XAttribute("DatabaseType", dataTypeDefinition.DatabaseType.ToString()));
if (raiseEvents)
- ExportedDataType.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedDataType.RaiseEvent(new ExportEventArgs(dataTypeDefinition, xml, false), this);
return xml;
}
@@ -823,7 +828,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingDataType.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ if (ImportingDataType.IsRaisedEventCancelled(new ImportEventArgs(element), this))
return Enumerable.Empty();
}
@@ -891,7 +896,7 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ImportedDataType.RaiseEvent(new SaveEventArgs(list, false), this);
+ ImportedDataType.RaiseEvent(new ImportEventArgs(list, element, false), this);
return list;
}
@@ -954,8 +959,8 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(dictionaryItem), this))
- return default(XElement);
+ if (ExportingDictionaryItem.IsRaisedEventCancelled(new ExportEventArgs(dictionaryItem, "DictionaryItem"), this))
+ return new XElement("DictionaryItem");
}
var xml = new XElement("DictionaryItem", new XAttribute("Key", dictionaryItem.ItemKey));
@@ -977,7 +982,7 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ExportedDictionaryItem.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedDictionaryItem.RaiseEvent(new ExportEventArgs(dictionaryItem, xml, false), this);
return xml;
}
@@ -992,7 +997,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(dictionaryItemElementList), this))
+ if (ImportingDictionaryItem.IsRaisedEventCancelled(new ImportEventArgs(dictionaryItemElementList), this))
return Enumerable.Empty();
}
@@ -1007,7 +1012,7 @@ namespace Umbraco.Core.Services
items.AddRange(ImportDictionaryItem(dictionaryItemElement, languages, raiseEvents));
if (raiseEvents)
- ImportedDictionaryItem.RaiseEvent(new SaveEventArgs(items, false), this);
+ ImportedDictionaryItem.RaiseEvent(new ImportEventArgs(items, dictionaryItemElementList, false), this);
return items;
}
@@ -1100,8 +1105,8 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingLanguage.IsRaisedEventCancelled(new SaveEventArgs(language), this))
- return default(XElement);
+ if (ExportingLanguage.IsRaisedEventCancelled(new ExportEventArgs(language, "Language"), this))
+ return new XElement("Language");
}
var xml = new XElement("Language",
@@ -1110,7 +1115,7 @@ namespace Umbraco.Core.Services
new XAttribute("FriendlyName", language.CultureName));
if (raiseEvents)
- ExportedLanguage.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedLanguage.RaiseEvent(new ExportEventArgs(language, xml, false), this);
return xml;
}
@@ -1126,7 +1131,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingLanguage.IsRaisedEventCancelled(new SaveEventArgs(languageElementList), this))
+ if (ImportingLanguage.IsRaisedEventCancelled(new ImportEventArgs(languageElementList), this))
return Enumerable.Empty();
}
@@ -1147,7 +1152,7 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ImportedLanguage.RaiseEvent(new SaveEventArgs(list, false), this);
+ ImportedLanguage.RaiseEvent(new ImportEventArgs(list, languageElementList, false), this);
return list;
}
@@ -1167,7 +1172,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingMacro.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ if (ImportingMacro.IsRaisedEventCancelled(new ImportEventArgs(element), this))
return Enumerable.Empty();
}
@@ -1177,45 +1182,11 @@ namespace Umbraco.Core.Services
throw new ArgumentException("The passed in XElement is not valid! It does not contain a root element called 'Macros' for multiple imports or 'macro' for a single import.");
}
- var macros = new List();
var macroElements = name.Equals("Macros")
? (from doc in element.Elements("macro") select doc).ToList()
: new List { element };
- foreach (var macroElement in macroElements)
- {
- var macroName = macroElement.Element("name").Value;
- var macroAlias = macroElement.Element("alias").Value;
- var controlType = macroElement.Element("scriptType").Value;
- var controlAssembly = macroElement.Element("scriptAssembly").Value;
- var xsltPath = macroElement.Element("xslt").Value;
- var scriptPath = macroElement.Element("scriptingFile").Value;
- var useInEditor = macroElement.Element("useInEditor").Value;
- var cacheDuration = macroElement.Element("refreshRate").Value;
-
- var macro = new Macro(macroAlias, macroName, controlType, controlAssembly, xsltPath, scriptPath);
-
- var properties = macroElement.Element("properties");
- if (properties != null)
- {
- int sortOrder = 0;
- foreach (var property in properties.Elements())
- {
- var propertyName = property.Attribute("name").Value;
- var propertyAlias = property.Attribute("alias").Value;
- var editorAlias = property.Attribute("propertyType").Value;
- var sortOrderAttribute = property.Attribute("sortOrder");
- if (sortOrderAttribute != null)
- {
- sortOrder = int.Parse(sortOrderAttribute.Value);
- }
-
- macro.Properties.Add(new MacroProperty(propertyAlias, propertyName, sortOrder, editorAlias));
- sortOrder++;
- }
- }
- macros.Add(macro);
- }
+ var macros = macroElements.Select(ParseMacroElement).ToList();
foreach (var macro in macros)
{
@@ -1223,11 +1194,77 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ImportedMacro.RaiseEvent(new SaveEventArgs(macros, false), this);
+ ImportedMacro.RaiseEvent(new ImportEventArgs(macros, element, false), this);
return macros;
}
+ private IMacro ParseMacroElement(XElement macroElement)
+ {
+ var macroName = macroElement.Element("name").Value;
+ var macroAlias = macroElement.Element("alias").Value;
+ var controlType = macroElement.Element("scriptType").Value;
+ var controlAssembly = macroElement.Element("scriptAssembly").Value;
+ var xsltPath = macroElement.Element("xslt").Value;
+ var scriptPath = macroElement.Element("scriptingFile").Value;
+
+ //Following xml elements are treated as nullable properties
+ var useInEditorElement = macroElement.Element("useInEditor");
+ var useInEditor = false;
+ if (useInEditorElement != null && string.IsNullOrEmpty(useInEditorElement.Value) == false)
+ {
+ useInEditor = bool.Parse(useInEditorElement.Value);
+ }
+ var cacheDurationElement = macroElement.Element("refreshRate");
+ var cacheDuration = 0;
+ if (cacheDurationElement != null && string.IsNullOrEmpty(cacheDurationElement.Value) == false)
+ {
+ cacheDuration = int.Parse(cacheDurationElement.Value);
+ }
+ var cacheByMemberElement = macroElement.Element("cacheByMember");
+ var cacheByMember = false;
+ if (cacheByMemberElement != null && string.IsNullOrEmpty(cacheByMemberElement.Value) == false)
+ {
+ cacheByMember = bool.Parse(cacheByMemberElement.Value);
+ }
+ var cacheByPageElement = macroElement.Element("cacheByPage");
+ var cacheByPage = false;
+ if (cacheByPageElement != null && string.IsNullOrEmpty(cacheByPageElement.Value) == false)
+ {
+ cacheByPage = bool.Parse(cacheByPageElement.Value);
+ }
+ var dontRenderElement = macroElement.Element("dontRender");
+ var dontRender = true;
+ if (dontRenderElement != null && string.IsNullOrEmpty(dontRenderElement.Value) == false)
+ {
+ dontRender = bool.Parse(dontRenderElement.Value);
+ }
+
+ var macro = new Macro(macroAlias, macroName, controlType, controlAssembly, xsltPath, scriptPath,
+ cacheByPage, cacheByMember, dontRender, useInEditor, cacheDuration);
+
+ var properties = macroElement.Element("properties");
+ if (properties != null)
+ {
+ int sortOrder = 0;
+ foreach (var property in properties.Elements())
+ {
+ var propertyName = property.Attribute("name").Value;
+ var propertyAlias = property.Attribute("alias").Value;
+ var editorAlias = property.Attribute("propertyType").Value;
+ var sortOrderAttribute = property.Attribute("sortOrder");
+ if (sortOrderAttribute != null)
+ {
+ sortOrder = int.Parse(sortOrderAttribute.Value);
+ }
+
+ macro.Properties.Add(new MacroProperty(propertyAlias, propertyName, sortOrder, editorAlias));
+ sortOrder++;
+ }
+ }
+ return macro;
+ }
+
///
/// Exports a list of items to xml as an
///
@@ -1254,8 +1291,8 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingMacro.IsRaisedEventCancelled(new SaveEventArgs(macro), this))
- return default(XElement);
+ if (ExportingMacro.IsRaisedEventCancelled(new ExportEventArgs(macro, "macro"), this))
+ return new XElement("macro");
}
var xml = new XElement("macro");
@@ -1263,10 +1300,13 @@ namespace Umbraco.Core.Services
xml.Add(new XElement("alias", macro.Alias));
xml.Add(new XElement("scriptType", macro.ControlType));
xml.Add(new XElement("scriptAssembly", macro.ControlAssembly));
+ xml.Add(new XElement("scriptingFile", macro.ScriptPath));
xml.Add(new XElement("xslt", macro.XsltPath));
xml.Add(new XElement("useInEditor", macro.UseInEditor.ToString()));
+ xml.Add(new XElement("dontRender", macro.DontRender.ToString()));
xml.Add(new XElement("refreshRate", macro.CacheDuration.ToString(CultureInfo.InvariantCulture)));
- xml.Add(new XElement("scriptingFile", macro.ScriptPath));
+ xml.Add(new XElement("cacheByMember", macro.CacheByMember.ToString()));
+ xml.Add(new XElement("cacheByPage", macro.CacheByPage.ToString()));
var properties = new XElement("properties");
foreach (var property in macro.Properties)
@@ -1280,7 +1320,7 @@ namespace Umbraco.Core.Services
xml.Add(properties);
if (raiseEvents)
- ExportedMacro.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedMacro.RaiseEvent(new ExportEventArgs(macro, xml, false), this);
return xml;
}
@@ -1323,15 +1363,15 @@ namespace Umbraco.Core.Services
/// containing the xml representation of the Media object
public XElement Export(IMedia media, bool deep = false, bool raiseEvents = true)
{
- if (raiseEvents)
- {
- if (ExportingMedia.IsRaisedEventCancelled(new SaveEventArgs(media), this))
- return default(XElement);
- }
-
//nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias);
var nodeName = UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema ? "node" : media.ContentType.Alias.ToSafeAliasWithForcingCheck();
+ if (raiseEvents)
+ {
+ if (ExportingMedia.IsRaisedEventCancelled(new ExportEventArgs(media, nodeName), this))
+ return new XElement(nodeName);
+ }
+
var xml = Export(media, nodeName);
xml.Add(new XAttribute("nodeType", media.ContentType.Id));
xml.Add(new XAttribute("writerName", media.GetCreatorProfile().Name));
@@ -1348,7 +1388,7 @@ namespace Umbraco.Core.Services
}
if(raiseEvents)
- ExportedMedia.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedMedia.RaiseEvent(new ExportEventArgs(media, xml, false), this);
return xml;
}
@@ -1456,7 +1496,7 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ImportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ if (ImportingTemplate.IsRaisedEventCancelled(new ImportEventArgs(element), this))
return Enumerable.Empty();
}
@@ -1529,7 +1569,7 @@ namespace Umbraco.Core.Services
_fileService.SaveTemplate(templates, userId);
if(raiseEvents)
- ImportedTemplate.RaiseEvent(new SaveEventArgs(templates, false), this);
+ ImportedTemplate.RaiseEvent(new ImportEventArgs(templates, element, false), this);
return templates;
}
@@ -1576,8 +1616,8 @@ namespace Umbraco.Core.Services
{
if (raiseEvents)
{
- if (ExportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(template), this))
- return default(XElement);
+ if (ExportingTemplate.IsRaisedEventCancelled(new ExportEventArgs(template, "Template"), this))
+ return new XElement("Template");
}
var xml = new XElement("Template");
@@ -1597,7 +1637,7 @@ namespace Umbraco.Core.Services
}
if (raiseEvents)
- ExportedTemplate.RaiseEvent(new SaveEventArgs(xml, false), this);
+ ExportedTemplate.RaiseEvent(new ExportEventArgs(template, xml, false), this);
return xml;
}
@@ -1611,152 +1651,152 @@ namespace Umbraco.Core.Services
///
/// Occurs before Importing Content
///
- public static event TypedEventHandler> ImportingContent;
+ public static event TypedEventHandler> ImportingContent;
///
/// Occurs after Content is Imported and Saved
///
- public static event TypedEventHandler> ImportedContent;
+ public static event TypedEventHandler> ImportedContent;
///
/// Occurs before Exporting Content
///
- public static event TypedEventHandler> ExportingContent;
+ public static event TypedEventHandler> ExportingContent;
///
/// Occurs after Content is Exported to Xml
///
- public static event TypedEventHandler> ExportedContent;
+ public static event TypedEventHandler> ExportedContent;
///
/// Occurs before Exporting Media
///
- public static event TypedEventHandler> ExportingMedia;
+ public static event TypedEventHandler> ExportingMedia;
///
/// Occurs after Media is Exported to Xml
///
- public static event TypedEventHandler> ExportedMedia;
+ public static event TypedEventHandler> ExportedMedia;
///
/// Occurs before Importing ContentType
///
- public static event TypedEventHandler> ImportingContentType;
+ public static event TypedEventHandler> ImportingContentType;
///
/// Occurs after ContentType is Imported and Saved
///
- public static event TypedEventHandler> ImportedContentType;
+ public static event TypedEventHandler> ImportedContentType;
///
/// Occurs before Exporting ContentType
///
- public static event TypedEventHandler> ExportingContentType;
+ public static event TypedEventHandler> ExportingContentType;
///
/// Occurs after ContentType is Exported to Xml
///
- public static event TypedEventHandler> ExportedContentType;
+ public static event TypedEventHandler> ExportedContentType;
///
/// Occurs before Importing DataType
///
- public static event TypedEventHandler> ImportingDataType;
+ public static event TypedEventHandler> ImportingDataType;
///
/// Occurs after DataType is Imported and Saved
///
- public static event TypedEventHandler> ImportedDataType;
+ public static event TypedEventHandler> ImportedDataType;
///
/// Occurs before Exporting DataType
///
- public static event TypedEventHandler> ExportingDataType;
+ public static event TypedEventHandler> ExportingDataType;
///
/// Occurs after DataType is Exported to Xml
///
- public static event TypedEventHandler> ExportedDataType;
+ public static event TypedEventHandler> ExportedDataType;
///
/// Occurs before Importing DictionaryItem
///
- public static event TypedEventHandler> ImportingDictionaryItem;
+ public static event TypedEventHandler> ImportingDictionaryItem;
///
/// Occurs after DictionaryItem is Imported and Saved
///
- public static event TypedEventHandler> ImportedDictionaryItem;
+ public static event TypedEventHandler> ImportedDictionaryItem;
///
/// Occurs before Exporting DictionaryItem
///
- public static event TypedEventHandler> ExportingDictionaryItem;
+ public static event TypedEventHandler> ExportingDictionaryItem;
///
/// Occurs after DictionaryItem is Exported to Xml
///
- public static event TypedEventHandler> ExportedDictionaryItem;
+ public static event TypedEventHandler> ExportedDictionaryItem;
///
/// Occurs before Importing Macro
///
- public static event TypedEventHandler> ImportingMacro;
+ public static event TypedEventHandler> ImportingMacro;
///
/// Occurs after Macro is Imported and Saved
///
- public static event TypedEventHandler> ImportedMacro;
+ public static event TypedEventHandler> ImportedMacro;
///
/// Occurs before Exporting Macro
///
- public static event TypedEventHandler> ExportingMacro;
+ public static event TypedEventHandler> ExportingMacro;
///
/// Occurs after Macro is Exported to Xml
///
- public static event TypedEventHandler> ExportedMacro;
+ public static event TypedEventHandler> ExportedMacro;
///
/// Occurs before Importing Language
///
- public static event TypedEventHandler> ImportingLanguage;
+ public static event TypedEventHandler> ImportingLanguage;
///
/// Occurs after Language is Imported and Saved
///
- public static event TypedEventHandler> ImportedLanguage;
+ public static event TypedEventHandler> ImportedLanguage;
///
/// Occurs before Exporting Language
///
- public static event TypedEventHandler> ExportingLanguage;
+ public static event TypedEventHandler> ExportingLanguage;
///
/// Occurs after Language is Exported to Xml
///
- public static event TypedEventHandler> ExportedLanguage;
+ public static event TypedEventHandler> ExportedLanguage;
///
/// Occurs before Importing Template
///
- public static event TypedEventHandler> ImportingTemplate;
+ public static event TypedEventHandler> ImportingTemplate;
///
/// Occurs after Template is Imported and Saved
///
- public static event TypedEventHandler> ImportedTemplate;
+ public static event TypedEventHandler> ImportedTemplate;
///
/// Occurs before Exporting Template
///
- public static event TypedEventHandler> ExportingTemplate;
+ public static event TypedEventHandler> ExportingTemplate;
///
/// Occurs after Template is Exported to Xml
///
- public static event TypedEventHandler> ExportedTemplate;
+ public static event TypedEventHandler> ExportedTemplate;
#endregion
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index bf6fcda1e3..18cd086cbe 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -287,6 +287,8 @@
+
+
diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs
index a53edac3a4..17b092c16b 100644
--- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs
+++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs
@@ -234,8 +234,7 @@ namespace Umbraco.Tests.Services.Importing
Assert.That(contents.Any(), Is.True);
Assert.That(contents.Count(), Is.EqualTo(numberOfDocs));
}
-
-
+
[Test]
public void PackagingService_Can_Import_CheckboxList_Content_Package_Xml_With_Property_Editor_Aliases()
{
@@ -482,6 +481,51 @@ namespace Umbraco.Tests.Services.Importing
}
}
+ [Test]
+ public void PackagingService_Can_Import_Macros()
+ {
+ // Arrange
+ string strXml = ImportResources.uBlogsy_Package;
+ var xml = XElement.Parse(strXml);
+ var macrosElement = xml.Descendants("Macros").First();
+ var packagingService = ServiceContext.PackagingService;
+
+ // Act
+ var macros = packagingService.ImportMacros(macrosElement).ToList();
+
+ // Assert
+ Assert.That(macros.Any(), Is.True);
+
+ var allMacros = ServiceContext.MacroService.GetAll().ToList();
+ foreach (var macro in macros)
+ {
+ Assert.That(allMacros.Any(x => x.Alias == macro.Alias), Is.True);
+ }
+ }
+
+ [Test]
+ public void PackagingService_Can_Import_Macros_With_Properties()
+ {
+ // Arrange
+ string strXml = ImportResources.XsltSearch_Package;
+ var xml = XElement.Parse(strXml);
+ var macrosElement = xml.Descendants("Macros").First();
+ var packagingService = ServiceContext.PackagingService;
+
+ // Act
+ var macros = packagingService.ImportMacros(macrosElement).ToList();
+
+ // Assert
+ Assert.That(macros.Any(), Is.True);
+ Assert.That(macros.First().Properties.Any(), Is.True);
+
+ var allMacros = ServiceContext.MacroService.GetAll().ToList();
+ foreach (var macro in macros)
+ {
+ Assert.That(allMacros.Any(x => x.Alias == macro.Alias), Is.True);
+ }
+ }
+
private void AddLanguages()
{
var norwegian = new Core.Models.Language("nb-NO");
diff --git a/src/Umbraco.Tests/Services/PackagingServiceTests.cs b/src/Umbraco.Tests/Services/PackagingServiceTests.cs
index 0124b4ca1a..f1da377d4d 100644
--- a/src/Umbraco.Tests/Services/PackagingServiceTests.cs
+++ b/src/Umbraco.Tests/Services/PackagingServiceTests.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using NUnit.Framework;
@@ -22,6 +23,23 @@ namespace Umbraco.Tests.Services
base.TearDown();
}
+ [Test]
+ public void PackagingService_Can_Export_Macro()
+ {
+ // Arrange
+ var macro = new Macro("test1", "Test", "~/usercontrol/blah.ascx", "MyAssembly", "test.xslt", "~/views/macropartials/test.cshtml");
+ ServiceContext.MacroService.Save(macro);
+
+ // Act
+ var element = ServiceContext.PackagingService.Export(macro);
+
+ // Assert
+ Assert.That(element, Is.Not.Null);
+ Assert.That(element.Element("name").Value, Is.EqualTo("Test"));
+ Assert.That(element.Element("alias").Value, Is.EqualTo("test1"));
+ Console.Write(element.ToString());
+ }
+
[Test]
public void PackagingService_Can_Export_DictionaryItems()
{