diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs
index d6b8f837d2..4999bc779a 100644
--- a/src/Umbraco.Web/PublishedContentExtensions.cs
+++ b/src/Umbraco.Web/PublishedContentExtensions.cs
@@ -814,6 +814,64 @@ namespace Umbraco.Web
#endregion
+ #region Axes: breadcrumbs
+
+ ///
+ /// Gets the breadcrumbs (ancestors and self, top to bottom) for the specified .
+ ///
+ /// The content.
+ /// Indicates whether the specified content should be included.
+ ///
+ /// The breadcrumbs (ancestors and self, top to bottom) for the specified .
+ ///
+ public static IEnumerable Breadcrumbs(this IPublishedContent content, bool andSelf = true)
+ {
+ return content.AncestorsOrSelf(andSelf, null).Reverse();
+ }
+
+ ///
+ /// Gets the breadcrumbs (ancestors and self, top to bottom) for the specified at a level higher or equal to .
+ ///
+ /// The content.
+ /// The minimum level.
+ /// Indicates whether the specified content should be included.
+ ///
+ /// The breadcrumbs (ancestors and self, top to bottom) for the specified at a level higher or equal to .
+ ///
+ public static IEnumerable Breadcrumbs(this IPublishedContent content, int minLevel, bool andSelf = true)
+ {
+ return content.AncestorsOrSelf(andSelf, n => n.Level >= minLevel).Reverse();
+ }
+
+ ///
+ /// Gets the breadcrumbs (ancestors and self, top to bottom) for the specified at a level higher or equal to the specified root content type .
+ ///
+ /// The root content type.
+ /// The content.
+ /// Indicates whether the specified content should be included.
+ ///
+ /// The breadcrumbs (ancestors and self, top to bottom) for the specified at a level higher or equal to the specified root content type .
+ ///
+ public static IEnumerable Breadcrumbs(this IPublishedContent content, bool andSelf = true)
+ where T : class, IPublishedContent
+ {
+ static IEnumerable TakeUntil(IEnumerable source, Func predicate)
+ {
+ foreach (var item in source)
+ {
+ yield return item;
+ if (predicate(item))
+ {
+ yield break;
+ }
+ }
+ }
+
+ return TakeUntil(content.AncestorsOrSelf(andSelf, null), n => n is T).Reverse();
+ }
+
+ #endregion
+
#region Axes: descendants, descendants-or-self
///
@@ -1155,8 +1213,8 @@ namespace Umbraco.Web
{ "NodeTypeAlias", n.ContentType.Alias },
{ "CreateDate", n.CreateDate },
{ "UpdateDate", n.UpdateDate },
- { "CreatorName", n.CreatorName },
- { "WriterName", n.WriterName },
+ { "CreatorName", n.CreatorName(services.UserService) },
+ { "WriterName", n.WriterName(services.UserService) },
{ "Url", n.Url() }
};
@@ -1271,15 +1329,37 @@ namespace Umbraco.Web
#region Axes: custom
///
- /// Gets the root content for this content.
+ /// Gets the root content (ancestor or self at level 1) for the specified .
///
/// The content.
- /// The 'site' content ie AncestorOrSelf(1).
+ ///
+ /// The root content (ancestor or self at level 1) for the specified .
+ ///
+ ///
+ /// This is the same as calling with maxLevel set to 1.
+ ///
public static IPublishedContent Root(this IPublishedContent content)
{
return content.AncestorOrSelf(1);
}
+ ///
+ /// Gets the root content (ancestor or self at level 1) for the specified if it's of the specified content type .
+ ///
+ /// The content type.
+ /// The content.
+ ///
+ /// The root content (ancestor or self at level 1) for the specified of content type .
+ ///
+ ///
+ /// This is the same as calling with maxLevel set to 1.
+ ///
+ public static T Root(this IPublishedContent content)
+ where T : class, IPublishedContent
+ {
+ return content.AncestorOrSelf(1);
+ }
+
#endregion
#region PropertyAliasesAndNames