From b19621c07bf3979e0a3ac1836e177e67d43aaedb Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Wed, 22 May 2013 11:06:21 -0200 Subject: [PATCH] Improving tree performance for Content and Media trees using the new EntityService and the thin IUmbracoEntity object. Updating a few internal overloads as well as adding new ones to ensure backwards compatibility for events used by the tree. Fixing issue with the Published/Unpublished/Saved/Pending Changes states shown in the content tree. --- src/Umbraco.Core/Models/UmbracoEntity.cs | 2 +- .../Factories/UmbracoEntityFactory.cs | 9 +- .../Repositories/EntityRepository.cs | 2 +- .../umbraco/Trees/BaseContentTree.cs | 300 ++++++++++++++---- .../umbraco/Trees/BaseMediaTree.cs | 16 +- .../umbraco/Trees/BaseTree.cs | 34 ++ src/umbraco.cms/businesslogic/CMSNode.cs | 17 +- src/umbraco.cms/businesslogic/Content.cs | 5 +- src/umbraco.cms/businesslogic/media/Media.cs | 9 +- .../businesslogic/media/MediaType.cs | 2 +- src/umbraco.cms/businesslogic/web/Document.cs | 17 +- .../businesslogic/web/DocumentType.cs | 2 +- 12 files changed, 316 insertions(+), 99 deletions(-) diff --git a/src/Umbraco.Core/Models/UmbracoEntity.cs b/src/Umbraco.Core/Models/UmbracoEntity.cs index f3ab2b71e0..5b0696bec1 100644 --- a/src/Umbraco.Core/Models/UmbracoEntity.cs +++ b/src/Umbraco.Core/Models/UmbracoEntity.cs @@ -171,7 +171,7 @@ namespace Umbraco.Core.Models public bool IsDraft { - get { return _isPublished; } + get { return _isDraft; } set { SetPropertyValueAndDetectChanges(o => diff --git a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs index e26b43f5a6..28c21d5ec9 100644 --- a/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/UmbracoEntityFactory.cs @@ -28,12 +28,9 @@ namespace Umbraco.Core.Persistence.Factories UmbracoFile = dto.UmbracoFile ?? string.Empty }; - entity.IsPublished = dto.PublishedVersion != default(Guid) || - (dto.NewestVersion != default(Guid) && dto.PublishedVersion == dto.NewestVersion); - entity.IsDraft = dto.NewestVersion != default(Guid) && - (dto.PublishedVersion == default(Guid) || dto.PublishedVersion != dto.NewestVersion); - entity.HasPendingChanges = dto.PublishedVersion != default(Guid) && dto.NewestVersion != default(Guid) && - dto.PublishedVersion != dto.NewestVersion; + entity.IsPublished = dto.PublishedVersion != default(Guid) || (dto.NewestVersion != default(Guid) && dto.PublishedVersion == dto.NewestVersion); + entity.IsDraft = dto.NewestVersion != default(Guid) && (dto.PublishedVersion == default(Guid) || dto.PublishedVersion != dto.NewestVersion); + entity.HasPendingChanges = (dto.PublishedVersion != default(Guid) && dto.NewestVersion != default(Guid)) && dto.PublishedVersion != dto.NewestVersion; return entity; } diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index 2a898006e4..7dc4286a44 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -262,7 +262,7 @@ namespace Umbraco.Core.Persistence.Repositories [Column("publishedVerison")] public Guid PublishedVersion { get; set; } - [Column("newestVerison")] + [Column("newestVersion")] public Guid NewestVersion { get; set; } [Column("alias")] diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseContentTree.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseContentTree.cs index 369d681629..fe91131981 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseContentTree.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseContentTree.cs @@ -1,27 +1,15 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Data; -using System.IO; +using System.Globalization; +using System.Linq; using System.Text; using System.Web; -using System.Xml; -using System.Configuration; +using Umbraco.Core.Models; using umbraco.BasePages; using umbraco.BusinessLogic; -using umbraco.cms.businesslogic; -using umbraco.cms.businesslogic.cache; -using umbraco.cms.businesslogic.contentitem; -using umbraco.cms.businesslogic.datatype; -using umbraco.cms.businesslogic.language; -using umbraco.cms.businesslogic.media; -using umbraco.cms.businesslogic.member; -using umbraco.cms.businesslogic.property; using umbraco.cms.businesslogic.web; using umbraco.interfaces; -using umbraco.DataLayer; using umbraco.BusinessLogic.Actions; -using umbraco.IO; namespace umbraco.cms.presentation.Trees @@ -72,31 +60,74 @@ function openContent(id) { } } - /// - /// Creates the link for the current document - /// - /// - /// - protected string CreateNodeLink(Document dd) + /// Renders the specified tree item. + /// + /// The tree. + /*public override void Render(ref XmlTree Tree) { - string nodeLink = library.NiceUrl(dd.Id); - if (nodeLink == "") + //get documents to render + Document[] docs = Document.GetChildrenForTree(m_id); + + var args = new TreeEventArgs(Tree); + OnBeforeTreeRender(docs, args); + + foreach (Document dd in docs) { - nodeLink = "/" + dd.Id; - if (!GlobalSettings.UseDirectoryUrls) - nodeLink += ".aspx"; + List allowedUserOptions = GetUserActionsForNode(dd); + if (CanUserAccessNode(dd, allowedUserOptions)) + { + + XmlTreeNode node = CreateNode(dd, allowedUserOptions); + + OnRenderNode(ref node, dd); + + OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); + if (node != null) + { + Tree.Add(node); + OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); + } + } } - return nodeLink; + OnAfterTreeRender(docs, args); + }*/ + public override void Render(ref XmlTree Tree) + { + //get documents to render + var entities = Services.EntityService.GetChildren(m_id, UmbracoObjectTypes.Document).ToArray(); + + var args = new TreeEventArgs(Tree); + OnBeforeTreeRender(entities, args, true); + + foreach (var entity in entities) + { + var e = entity as UmbracoEntity; + List allowedUserOptions = GetUserActionsForNode(e); + if (CanUserAccessNode(e, allowedUserOptions)) + { + XmlTreeNode node = CreateNode(e, allowedUserOptions); + + OnRenderNode(ref node, new Document(entity)); + + OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); + if (node != null) + { + Tree.Add(node); + OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); + } + } + } + OnAfterTreeRender(entities, args, true); } + #region Tree Create-node-helper Methods - Legacy /// - /// Inheritors override this method to modify the content node being created + /// Creates an XmlTreeNode based on the passed in Document /// - /// - /// - protected virtual void OnRenderNode(ref XmlTreeNode xNode, Document doc) { } - + /// + /// + /// protected XmlTreeNode CreateNode(Document dd, List allowedUserOptions) { XmlTreeNode node = XmlTreeNode.Create(this); @@ -121,6 +152,30 @@ function openContent(id) { return node; } + + /// + /// Creates the link for the current document + /// + /// + /// + protected string CreateNodeLink(Document dd) + { + string nodeLink = library.NiceUrl(dd.Id); + if (nodeLink == "") + { + nodeLink = "/" + dd.Id; + if (GlobalSettings.UseDirectoryUrls == false) + nodeLink += ".aspx"; + } + return nodeLink; + } + + /// + /// Inheritors override this method to modify the content node being created + /// + /// + /// + protected virtual void OnRenderNode(ref XmlTreeNode xNode, Document doc) { } /// /// Determins if the user has access to view the node/document @@ -149,47 +204,99 @@ function openContent(id) { List actions = umbraco.BusinessLogic.Actions.Action.FromString(CurrentUser.GetPermissions(dd.Path)); // A user is allowed to delete their own stuff - if (dd.UserId == CurrentUser.Id && !actions.Contains(ActionDelete.Instance)) + if (dd.UserId == CurrentUser.Id && actions.Contains(ActionDelete.Instance) == false) actions.Add(ActionDelete.Instance); return actions; } + #endregion + + #region Tree Create-node-helper Methods - UmbracoEntity equivalent /// - /// Renders the specified tree item. - /// - /// The tree. - public override void Render(ref XmlTree Tree) + /// Creates an XmlTreeNode based on the passed in UmbracoEntity + /// + /// + /// + /// + internal XmlTreeNode CreateNode(UmbracoEntity dd, List allowedUserOptions) { - //get documents to render - Document[] docs = Document.GetChildrenForTree(m_id); - - var args = new TreeEventArgs(Tree); - OnBeforeTreeRender(docs, args); - - foreach (Document dd in docs) + XmlTreeNode node = XmlTreeNode.Create(this); + SetMenuAttribute(ref node, allowedUserOptions); + node.NodeID = dd.Id.ToString(); + node.Text = dd.Name; + SetNonPublishedAttribute(ref node, dd); + SetProtectedAttribute(ref node, dd); + SetActionAttribute(ref node, dd); + SetSourcesAttributes(ref node, dd); + if (dd.ContentTypeIcon != null) { - List allowedUserOptions = GetUserActionsForNode(dd); - if (CanUserAccessNode(dd, allowedUserOptions)) - { - - XmlTreeNode node = CreateNode(dd, allowedUserOptions); - - OnRenderNode(ref node, dd); - - OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); - if (node != null) - { - Tree.Add(node); - OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); - } - } + node.Icon = dd.ContentTypeIcon; + node.OpenIcon = dd.ContentTypeIcon; } - //args = new TreeEventArgs(Tree); - OnAfterTreeRender(docs, args); + + if (dd.IsPublished == false) + node.Style.DimNode(); + + if (dd.HasPendingChanges) + node.Style.HighlightNode(); + + return node; } - #region Tree Attribute Setter Methods + /// + /// Creates the link for the current UmbracoEntity + /// + /// + /// + internal string CreateNodeLink(UmbracoEntity dd) + { + string nodeLink = library.NiceUrl(dd.Id); + if (nodeLink == "") + { + nodeLink = "/" + dd.Id; + if (GlobalSettings.UseDirectoryUrls == false) + nodeLink += ".aspx"; + } + return nodeLink; + } + + /// + /// Determins if the user has access to view the node/document + /// + /// The Document to check permissions against + /// A list of IActions that the user has permissions to execute on the current document + /// By default the user must have Browse permissions to see the node in the Content tree + /// + internal virtual bool CanUserAccessNode(UmbracoEntity doc, List allowedUserOptions) + { + if (allowedUserOptions.Contains(ActionBrowse.Instance)) + return true; + + return false; + } + + /// + /// Builds a string of actions that the user is able to perform on the current document. + /// The list of actions is subject to the user's rights assigned to the document and also + /// is dependant on the type of node. + /// + /// + /// + internal List GetUserActionsForNode(UmbracoEntity dd) + { + List actions = umbraco.BusinessLogic.Actions.Action.FromString(CurrentUser.GetPermissions(dd.Path)); + + // A user is allowed to delete their own stuff + if (dd.CreatorId == CurrentUser.Id && actions.Contains(ActionDelete.Instance) == false) + actions.Add(ActionDelete.Instance); + + return actions; + } + #endregion + + #region Tree Attribute Setter Methods - Legacy + protected void SetNonPublishedAttribute(ref XmlTreeNode treeElement, Document dd) { treeElement.NotPublished = false; @@ -202,6 +309,7 @@ function openContent(id) { else treeElement.NotPublished = true; } + protected void SetProtectedAttribute(ref XmlTreeNode treeElement, Document dd) { if (Access.IsProtected(dd.Id, dd.Path)) @@ -209,6 +317,7 @@ function openContent(id) { else treeElement.IsProtected = false; } + protected void SetActionAttribute(ref XmlTreeNode treeElement, Document dd) { @@ -244,6 +353,7 @@ function openContent(id) { } } } + protected void SetSourcesAttributes(ref XmlTreeNode treeElement, Document dd) { treeElement.HasChildren = dd.ContentType.IsContainerContentType == false && dd.HasChildren; @@ -258,6 +368,72 @@ function openContent(id) { #endregion + #region Tree Attribute Setter Methods - UmbracoEntity equivalent + + internal void SetNonPublishedAttribute(ref XmlTreeNode treeElement, UmbracoEntity dd) + { + treeElement.NotPublished = false; + if (dd.IsPublished) + treeElement.NotPublished = dd.HasPendingChanges; + else + treeElement.NotPublished = true; + } + + internal void SetProtectedAttribute(ref XmlTreeNode treeElement, UmbracoEntity dd) + { + if (Access.IsProtected(dd.Id, dd.Path)) + treeElement.IsProtected = true; + else + treeElement.IsProtected = false; + } + + internal void SetActionAttribute(ref XmlTreeNode treeElement, UmbracoEntity dd) + { + + // Check for dialog behaviour + if (this.DialogMode == TreeDialogModes.fulllink) + { + string nodeLink = CreateNodeLink(dd); + treeElement.Action = String.Format("javascript:openContent('{0}');", nodeLink); + } + else if (this.DialogMode == TreeDialogModes.locallink) + { + string nodeLink = string.Format("{{localLink:{0}}}", dd.Id); + string nodeText = dd.Name.Replace("'", "\\'"); + // try to make a niceurl too + string niceUrl = umbraco.library.NiceUrl(dd.Id).Replace("'", "\\'"); ; + if (niceUrl != "#" || niceUrl != "") + { + nodeLink += "|" + niceUrl + "|" + HttpContext.Current.Server.HtmlEncode(nodeText); + } + else + { + nodeLink += "||" + HttpContext.Current.Server.HtmlEncode(nodeText); + } + + treeElement.Action = String.Format("javascript:openContent('{0}');", nodeLink); + } + else if (this.DialogMode == TreeDialogModes.id || this.DialogMode == TreeDialogModes.none) + { + treeElement.Action = String.Format("javascript:openContent('{0}');", dd.Id.ToString(CultureInfo.InvariantCulture)); + } + else if (this.IsDialog == false || (this.DialogMode == TreeDialogModes.id)) + { + if (CurrentUser.GetPermissions(dd.Path).Contains(ActionUpdate.Instance.Letter.ToString(CultureInfo.InvariantCulture))) + { + treeElement.Action = String.Format("javascript:openContent({0});", dd.Id); + } + } + } + + internal void SetSourcesAttributes(ref XmlTreeNode treeElement, UmbracoEntity dd) + { + treeElement.HasChildren = dd.HasChildren; + treeElement.Source = IsDialog == false ? GetTreeServiceUrl(dd.Id) : GetTreeDialogUrl(dd.Id); + } + + #endregion + /// /// The returned list is filtered based on the IActions that the user is allowed to perform based on the actions /// that are allowed for the current tree. diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseMediaTree.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseMediaTree.cs index ab25a34e13..b81f9290d2 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseMediaTree.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseMediaTree.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Text; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -58,15 +59,14 @@ function openMedia(id) { //Updated Render method for improved performance, but currently not usable because of backwards compatibility //with the OnBeforeTreeRender/OnAfterTreeRender events, which sends an array for legacy Media items. - /*public override void Render(ref XmlTree tree) + public override void Render(ref XmlTree tree) { _timer = DisposableTimer.Start(x => LogHelper.Debug("Media tree loaded" + " (took " + x + "ms)")); - var service = base.Services.EntityService; - var entities = service.GetChildren(m_id, UmbracoObjectTypes.Media); + var entities = Services.EntityService.GetChildren(m_id, UmbracoObjectTypes.Media).ToArray(); var args = new TreeEventArgs(tree); - OnBeforeTreeRender(entities, args); + OnBeforeTreeRender(entities, args, false); foreach (UmbracoEntity entity in entities) { @@ -124,10 +124,10 @@ function openMedia(id) { //stop the timer and log the output _timer.Dispose(); - OnAfterTreeRender(entities, args); - }*/ + OnAfterTreeRender(entities, args, false); + } - public override void Render(ref XmlTree tree) + /*public override void Render(ref XmlTree tree) { //_timer = DisposableTimer.Start(x => LogHelper.Debug("Media tree loaded" + " (took " + x + "ms)")); @@ -202,7 +202,7 @@ function openMedia(id) { } //_timer.Dispose(); OnAfterTreeRender(docs, args); - } + }*/ /// /// Returns the value for a link in WYSIWYG mode, by default only media items that have a diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs index 3ea88f38b8..08038f0421 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs @@ -1,12 +1,16 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using System.Text; using System.Xml; using Umbraco.Core; +using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; using umbraco.BusinessLogic; using umbraco.BusinessLogic.Actions; +using umbraco.cms.businesslogic.media; +using umbraco.cms.businesslogic.web; using umbraco.interfaces; namespace umbraco.cms.presentation.Trees @@ -523,6 +527,36 @@ namespace umbraco.cms.presentation.Trees AfterTreeRender(sender, e); } + protected internal virtual void OnBeforeTreeRender(IEnumerable sender, TreeEventArgs e, bool isContent) + { + if (BeforeTreeRender != null) + { + if (isContent) + { + BeforeTreeRender(sender.Select(x => new Document(x, false)).ToArray(), e); + } + else + { + BeforeTreeRender(sender.Select(x => new Media(x, false)).ToArray(), e); + } + } + } + + protected internal virtual void OnAfterTreeRender(IEnumerable sender, TreeEventArgs e, bool isContent) + { + if (AfterTreeRender != null) + { + if (isContent) + { + AfterTreeRender(sender.Select(x => new Document(x, false)).ToArray(), e); + } + else + { + AfterTreeRender(sender.Select(x => new Media(x, false)).ToArray(), e); + } + } + } + /// /// Event that is raised once actions are assigned to nodes /// diff --git a/src/umbraco.cms/businesslogic/CMSNode.cs b/src/umbraco.cms/businesslogic/CMSNode.cs index 1087a5b5ae..76455c1361 100644 --- a/src/umbraco.cms/businesslogic/CMSNode.cs +++ b/src/umbraco.cms/businesslogic/CMSNode.cs @@ -1105,7 +1105,7 @@ order by level,sortOrder"; _isTrashed = dr.GetBoolean("trashed"); } - internal protected void PopulateCMSNodeFromContentBase(IContentBase content, Guid objectType) + internal protected void PopulateCMSNodeFromUmbracoEntity(IUmbracoEntity content, Guid objectType) { _uniqueID = content.Key; _nodeObjectType = objectType; @@ -1120,21 +1120,6 @@ order by level,sortOrder"; _entity = content; } - internal protected void PopulateCMSNodeFromContentTypeBase(IContentTypeBase contentType, Guid objectType) - { - _uniqueID = contentType.Key; - _nodeObjectType = objectType; - _level = contentType.Level; - _path = contentType.Path; - _parentid = contentType.ParentId; - _text = contentType.Name; - _sortOrder = contentType.SortOrder; - _userId = contentType.CreatorId; - _createDate = contentType.CreateDate; - _isTrashed = false; - _entity = contentType; - } - #endregion #region Private Methods diff --git a/src/umbraco.cms/businesslogic/Content.cs b/src/umbraco.cms/businesslogic/Content.cs index 8babb076fd..786a7b2f6b 100644 --- a/src/umbraco.cms/businesslogic/Content.cs +++ b/src/umbraco.cms/businesslogic/Content.cs @@ -6,6 +6,7 @@ using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Models.EntityBase; using umbraco.cms.businesslogic.property; using umbraco.DataLayer; using System.Runtime.CompilerServices; @@ -53,6 +54,8 @@ namespace umbraco.cms.businesslogic protected Content(Guid id, bool noSetup) : base(id, noSetup) { } + protected internal Content(IUmbracoEntity entity) : base(entity) { } + protected internal Content(IContentBase contentBase) : base(contentBase) { @@ -121,7 +124,7 @@ namespace umbraco.cms.businesslogic if (o == null) return null; int contentTypeId; - if (!int.TryParse(o.ToString(), out contentTypeId)) + if (int.TryParse(o.ToString(), out contentTypeId) == false) return null; try { diff --git a/src/umbraco.cms/businesslogic/media/Media.cs b/src/umbraco.cms/businesslogic/media/Media.cs index 302e01cc47..252d8cd799 100644 --- a/src/umbraco.cms/businesslogic/media/Media.cs +++ b/src/umbraco.cms/businesslogic/media/Media.cs @@ -54,6 +54,13 @@ namespace umbraco.cms.businesslogic.media public Media(Guid id, bool noSetup) : base(id, noSetup) { } + internal Media(IUmbracoEntity entity, bool noSetup = true) + : base(entity) + { + if (noSetup == false) + setupNode(); + } + internal Media(IMedia media) : base(media) { SetupNode(media); @@ -376,7 +383,7 @@ namespace umbraco.cms.businesslogic.media MediaItem = media; //Setting private properties from IContentBase replacing CMSNode.setupNode() / CMSNode.PopulateCMSNodeFromReader() - base.PopulateCMSNodeFromContentBase(MediaItem, _objectType); + base.PopulateCMSNodeFromUmbracoEntity(MediaItem, _objectType); //If the version is empty we update with the latest version from the current IContent. if (Version == Guid.Empty) diff --git a/src/umbraco.cms/businesslogic/media/MediaType.cs b/src/umbraco.cms/businesslogic/media/MediaType.cs index f3b41415ed..12059a7a20 100644 --- a/src/umbraco.cms/businesslogic/media/MediaType.cs +++ b/src/umbraco.cms/businesslogic/media/MediaType.cs @@ -182,7 +182,7 @@ namespace umbraco.cms.businesslogic.media _mediaType = mediaType; base.PopulateContentTypeFromContentTypeBase(_mediaType); - base.PopulateCMSNodeFromContentTypeBase(_mediaType, _objectType); + base.PopulateCMSNodeFromUmbracoEntity(_mediaType, _objectType); } #endregion diff --git a/src/umbraco.cms/businesslogic/web/Document.cs b/src/umbraco.cms/businesslogic/web/Document.cs index 3ddfd31d18..7cb7c9090d 100644 --- a/src/umbraco.cms/businesslogic/web/Document.cs +++ b/src/umbraco.cms/businesslogic/web/Document.cs @@ -106,6 +106,21 @@ namespace umbraco.cms.businesslogic.web } } + /// + /// Internal initialization of a legacy Document object using the new IUmbracoEntity object + /// + /// + /// + internal Document(IUmbracoEntity entity, bool noSetup = true) : base(entity) + { + if(noSetup == false) + setupNode(); + } + + /// + /// Internal initialization of a legacy Document object using the new IContent object + /// + /// internal Document(IContent content) : base(content) { SetupNode(content); @@ -1384,7 +1399,7 @@ namespace umbraco.cms.businesslogic.web { Content = content; //Setting private properties from IContentBase replacing CMSNode.setupNode() / CMSNode.PopulateCMSNodeFromReader() - base.PopulateCMSNodeFromContentBase(Content, _objectType); + base.PopulateCMSNodeFromUmbracoEntity(Content, _objectType); //If the version is empty we update with the latest version from the current IContent. if (Version == Guid.Empty) diff --git a/src/umbraco.cms/businesslogic/web/DocumentType.cs b/src/umbraco.cms/businesslogic/web/DocumentType.cs index d27f07cd93..1a9e203ada 100644 --- a/src/umbraco.cms/businesslogic/web/DocumentType.cs +++ b/src/umbraco.cms/businesslogic/web/DocumentType.cs @@ -642,7 +642,7 @@ namespace umbraco.cms.businesslogic.web _defaultTemplate = _contentType.DefaultTemplate.Id; base.PopulateContentTypeFromContentTypeBase(_contentType); - base.PopulateCMSNodeFromContentTypeBase(_contentType, _objectType); + base.PopulateCMSNodeFromUmbracoEntity(_contentType, _objectType); } #endregion