diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs
index e8e58ca9ba..49d62db1bf 100644
--- a/src/Umbraco.Core/Models/ContentExtensions.cs
+++ b/src/Umbraco.Core/Models/ContentExtensions.cs
@@ -671,7 +671,7 @@ namespace Umbraco.Core.Models
/// Xml representation of the passed in
public static XElement ToXml(this IMember member)
{
- return ApplicationContext.Current.Services.PackagingService.Export(member);
+ return ((PackagingService)(ApplicationContext.Current.Services.PackagingService)).Export(member);
}
#endregion
diff --git a/src/Umbraco.Core/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs
index 5acaf0fccf..9f318988d7 100644
--- a/src/Umbraco.Core/Services/IPackagingService.cs
+++ b/src/Umbraco.Core/Services/IPackagingService.cs
@@ -12,16 +12,18 @@ namespace Umbraco.Core.Services
/// Xml to import
/// Optional parent Id for the content being imported
/// Optional Id of the user performing the import
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated content
- IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0);
+ IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0, bool raiseEvents = true);
///
/// Imports and saves package xml as
///
/// Xml to import
/// Optional id of the User performing the operation. Default is zero (admin).
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated ContentTypes
- IEnumerable ImportContentTypes(XElement element, int userId = 0);
+ IEnumerable ImportContentTypes(XElement element, int userId = 0, bool raiseEvents = true);
///
/// Imports and saves package xml as
@@ -29,46 +31,52 @@ namespace Umbraco.Core.Services
/// Xml to import
/// Boolean indicating whether or not to import the
/// Optional id of the User performing the operation. Default is zero (admin).
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated ContentTypes
- IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0);
+ IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0, bool raiseEvents = true);
///
/// Imports and saves package xml as
///
/// Xml to import
///
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated DataTypeDefinitions
- IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0);
+ IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0, bool raiseEvents = true);
///
/// Imports and saves package xml as
///
/// Xml to import
/// Optional user id
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated Templates
- IEnumerable ImportTemplates(XElement element, int userId = 0);
+ IEnumerable ImportTemplates(XElement element, int userId = 0, bool raiseEvents = true);
///
/// Exports an to xml as an
///
/// ContentType to export
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the ContentType item.
- XElement Export(IContentType contentType);
+ XElement Export(IContentType contentType, bool raiseEvents = true);
///
/// Exports an item to xml as an
///
/// Content to export
/// Optional parameter indicating whether to include descendents
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the Content object
- XElement Export(IContent content, bool deep = false);
+ XElement Export(IContent content, bool deep = false, bool raiseEvents = true);
///
/// Exports an item to xml as an
///
/// Media to export
/// Optional parameter indicating whether to include descendents
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the Media object
- XElement Export(IMedia media, bool deep = false);
+ XElement Export(IMedia media, bool deep = false, bool raiseEvents = true);
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs
index e59bb9df7b..970a278c3b 100644
--- a/src/Umbraco.Core/Services/PackagingService.cs
+++ b/src/Umbraco.Core/Services/PackagingService.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Umbraco.Core.Configuration;
+using Umbraco.Core.Events;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
@@ -103,9 +104,16 @@ namespace Umbraco.Core.Services
///
/// Content to export
/// Optional parameter indicating whether to include descendents
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the Content object
- public XElement Export(IContent content, bool deep = false)
+ 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();
@@ -124,6 +132,9 @@ namespace Umbraco.Core.Services
AddChildXml(descendants, currentChildren, xml);
}
+ if(raiseEvents)
+ ContentExported.RaiseEvent(new SaveEventArgs(xml, false), this);
+
return xml;
}
@@ -187,9 +198,16 @@ namespace Umbraco.Core.Services
/// Xml to import
/// Optional parent Id for the content being imported
/// Optional Id of the user performing the import
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated content
- public IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0)
+ public IEnumerable ImportContent(XElement element, int parentId = -1, int userId = 0, bool raiseEvents = true)
{
+ if (raiseEvents)
+ {
+ if (ImportingContent.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ return Enumerable.Empty();
+ }
+
var name = element.Name.LocalName;
if (name.Equals("DocumentSet"))
{
@@ -202,6 +220,8 @@ namespace Umbraco.Core.Services
if (contents.Any())
_contentService.Save(contents, userId);
+ if(raiseEvents)
+ ContentImported.RaiseEvent(new SaveEventArgs(contents, false), this);
return contents;
}
@@ -214,6 +234,8 @@ namespace Umbraco.Core.Services
if (contents.Any())
_contentService.Save(contents, userId);
+ if(raiseEvents)
+ ContentImported.RaiseEvent(new SaveEventArgs(contents, false), this);
return contents;
}
@@ -344,9 +366,16 @@ namespace Umbraco.Core.Services
/// Exports an to xml as an
///
/// ContentType to export
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the ContentType item.
- public XElement Export(IContentType contentType)
+ public XElement Export(IContentType contentType, bool raiseEvents = true)
{
+ if (raiseEvents)
+ {
+ if (ExportingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this))
+ return default(XElement);
+ }
+
var info = new XElement("Info",
new XElement("Name", contentType.Name),
new XElement("Alias", contentType.Alias),
@@ -407,6 +436,10 @@ namespace Umbraco.Core.Services
structure,
genericProperties,
tabs);
+
+ if (raiseEvents)
+ ContentTypeExported.RaiseEvent(new SaveEventArgs(xml, false), this);
+
return xml;
}
@@ -415,8 +448,9 @@ namespace Umbraco.Core.Services
///
/// Xml to import
/// Optional id of the User performing the operation. Default is zero (admin).
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated ContentTypes
- public IEnumerable ImportContentTypes(XElement element, int userId = 0)
+ public IEnumerable ImportContentTypes(XElement element, int userId = 0, bool raiseEvents = true)
{
return ImportContentTypes(element, true, userId);
}
@@ -427,9 +461,16 @@ namespace Umbraco.Core.Services
/// Xml to import
/// Boolean indicating whether or not to import the
/// Optional id of the User performing the operation. Default is zero (admin).
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated ContentTypes
- public IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0)
+ public IEnumerable ImportContentTypes(XElement element, bool importStructure, int userId = 0, bool raiseEvents = true)
{
+ if (raiseEvents)
+ {
+ if (ImportingContentType.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ return Enumerable.Empty();
+ }
+
var name = element.Name.LocalName;
if (name.Equals("DocumentTypes") == false && name.Equals("DocumentType") == false)
{
@@ -476,6 +517,9 @@ namespace Umbraco.Core.Services
_contentTypeService.Save(updatedContentTypes, userId);
}
+ if (raiseEvents)
+ ContentTypeImported.RaiseEvent(new SaveEventArgs(list, false), this);
+
return list;
}
@@ -750,7 +794,7 @@ namespace Umbraco.Core.Services
///
///
///
- internal XElement Export(IEnumerabledataTypeDefinitions)
+ internal XElement Export(IEnumerable dataTypeDefinitions)
{
var container = new XElement("DataTypes");
foreach (var d in dataTypeDefinitions)
@@ -794,9 +838,16 @@ namespace Umbraco.Core.Services
///
/// Xml to import
///
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated DataTypeDefinitions
- public IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0)
+ public IEnumerable ImportDataTypeDefinitions(XElement element, int userId = 0, bool raiseEvents = true)
{
+ if (raiseEvents)
+ {
+ if (ImportingDataType.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ return Enumerable.Empty();
+ }
+
var name = element.Name.LocalName;
if (name.Equals("DataTypes") == false && name.Equals("DataType") == false)
{
@@ -859,6 +910,10 @@ namespace Umbraco.Core.Services
SavePrevaluesFromXml(list, dataTypeElements);
}
+
+ if (raiseEvents)
+ DataTypeImported.RaiseEvent(new SaveEventArgs(list, false), this);
+
return list;
}
@@ -934,9 +989,16 @@ namespace Umbraco.Core.Services
///
/// Media to export
/// Optional parameter indicating whether to include descendents
+ /// Optional parameter indicating whether or not to raise events
/// containing the xml representation of the Media object
- public XElement Export(IMedia media, bool deep = false)
+ 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();
@@ -955,6 +1017,9 @@ namespace Umbraco.Core.Services
AddChildXml(descendants, currentChildren, xml);
}
+ if(raiseEvents)
+ MediaExported.RaiseEvent(new SaveEventArgs(xml, false), this);
+
return xml;
}
@@ -1055,9 +1120,16 @@ namespace Umbraco.Core.Services
///
/// Xml to import
/// Optional user id
+ /// Optional parameter indicating whether or not to raise events
/// An enumrable list of generated Templates
- public IEnumerable ImportTemplates(XElement element, int userId = 0)
+ public IEnumerable ImportTemplates(XElement element, int userId = 0, bool raiseEvents = true)
{
+ if (raiseEvents)
+ {
+ if (ImportingTemplate.IsRaisedEventCancelled(new SaveEventArgs(element), this))
+ return Enumerable.Empty();
+ }
+
var name = element.Name.LocalName;
if (name.Equals("Templates") == false && name.Equals("Template") == false)
{
@@ -1126,6 +1198,9 @@ namespace Umbraco.Core.Services
if (templates.Any())
_fileService.SaveTemplate(templates, userId);
+ if(raiseEvents)
+ TemplateImported.RaiseEvent(new SaveEventArgs(templates, false), this);
+
return templates;
}
@@ -1146,5 +1221,77 @@ namespace Umbraco.Core.Services
}
#endregion
+
+ #region Event Handlers
+ ///
+ /// Occurs before Importing Content
+ ///
+ public static event TypedEventHandler> ImportingContent;
+
+ ///
+ /// Occurs after Content is Imported and Saved
+ ///
+ public static event TypedEventHandler> ContentImported;
+
+ ///
+ /// Occurs before Exporting Content
+ ///
+ public static event TypedEventHandler> ExportingContent;
+
+ ///
+ /// Occurs after Content is Exported to Xml
+ ///
+ public static event TypedEventHandler> ContentExported;
+
+ ///
+ /// Occurs before Exporting Media
+ ///
+ public static event TypedEventHandler> ExportingMedia;
+
+ ///
+ /// Occurs after Media is Exported to Xml
+ ///
+ public static event TypedEventHandler> MediaExported;
+
+ ///
+ /// Occurs before Importing ContentType
+ ///
+ public static event TypedEventHandler> ImportingContentType;
+
+ ///
+ /// Occurs after ContentType is Imported and Saved
+ ///
+ public static event TypedEventHandler> ContentTypeImported;
+
+ ///
+ /// Occurs before Exporting ContentType
+ ///
+ public static event TypedEventHandler> ExportingContentType;
+
+ ///
+ /// Occurs after ContentType is Exported to Xml
+ ///
+ public static event TypedEventHandler> ContentTypeExported;
+
+ ///
+ /// Occurs before Importing DataType
+ ///
+ public static event TypedEventHandler> ImportingDataType;
+
+ ///
+ /// Occurs after DataType is Imported and Saved
+ ///
+ public static event TypedEventHandler> DataTypeImported;
+
+ ///
+ /// Occurs before Importing Template
+ ///
+ public static event TypedEventHandler> ImportingTemplate;
+
+ ///
+ /// Occurs after Template is Imported and Saved
+ ///
+ public static event TypedEventHandler> TemplateImported;
+ #endregion
}
}
\ No newline at end of file