();
+ contentNavigator = UmbracoContext.Current.ContentCache.GetXPathNavigator() as NavigableNavigator;
+ var mediaNavigator = UmbracoContext.Current.MediaCache.GetXPathNavigator() as NavigableNavigator;
+ foreach (var prop in macro.Model.Properties)
+ {
+ AddMacroParameter(parameters, contentNavigator, mediaNavigator, prop.Key, prop.Type, prop.Value);
+ }
+ macroNavigator = new MacroNavigator(parameters);
}
if (HttpContext.Current.Request.QueryString["umbDebug"] != null && GlobalSettings.DebugMode)
{
- var outerXml = macroXml.OuterXml;
+ var outerXml = macroXml == null ? macroNavigator.OuterXml : macroXml.OuterXml;
return
new LiteralControl("Debug from " +
macro.Name +
@@ -889,7 +910,9 @@ namespace umbraco
{
try
{
- var transformed = GetXsltTransformResult(macroXml, xsltFile);
+ var transformed = canNavigate
+ ? GetXsltTransformResult(macroNavigator, contentNavigator, xsltFile) // better?
+ : GetXsltTransformResult(macroXml, xsltFile); // document
var result = CreateControlsFromText(transformed);
return result;
@@ -1323,6 +1346,101 @@ namespace umbraco
macroXml.FirstChild.AppendChild(macroXmlNode);
}
+ // add parameters to the macro parameters collection
+ private void AddMacroParameter(ICollection parameters,
+ NavigableNavigator contentNavigator, NavigableNavigator mediaNavigator,
+ string macroPropertyAlias,string macroPropertyType, string macroPropertyValue)
+ {
+ // if no value is passed, then use the current "pageID" as value
+ var contentId = macroPropertyValue == string.Empty ? UmbracoContext.Current.PageId.ToString() : macroPropertyValue;
+
+ TraceInfo("umbracoMacro",
+ "Xslt node adding search start (" + macroPropertyAlias + ",'" +
+ macroPropertyValue + "')");
+
+ // beware! do not use the raw content- or media- navigators, but clones !!
+
+ switch (macroPropertyType)
+ {
+ case "contentTree":
+ parameters.Add(new MacroNavigator.MacroParameter(
+ macroPropertyAlias,
+ contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty
+ attributes: new Dictionary { { "nodeID", contentId } }));
+
+ break;
+
+ case "contentPicker":
+ parameters.Add(new MacroNavigator.MacroParameter(
+ macroPropertyAlias,
+ contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty
+ 0));
+ break;
+
+ case "contentSubs":
+ parameters.Add(new MacroNavigator.MacroParameter(
+ macroPropertyAlias,
+ contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty
+ 1));
+ break;
+
+ case "contentAll":
+ parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, contentNavigator.Clone()));
+ break;
+
+ case "contentRandom":
+ var nav = contentNavigator.Clone();
+ if (nav.MoveToId(contentId))
+ {
+ var descendantIterator = nav.Select("./* [@isDoc]");
+ if (descendantIterator.MoveNext())
+ {
+ // not empty - and won't change
+ var descendantCount = descendantIterator.Count;
+
+ int index;
+ var r = library.GetRandom();
+ lock (r)
+ {
+ index = r.Next(descendantCount);
+ }
+
+ while (index > 0 && descendantIterator.MoveNext())
+ index--;
+
+ var node = descendantIterator.Current.UnderlyingObject as INavigableContent;
+ if (node != null)
+ {
+ nav = contentNavigator.CloneWithNewRoot(node.Id.ToString(CultureInfo.InvariantCulture));
+ parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, nav, 0));
+ }
+ else
+ throw new InvalidOperationException("Iterator contains non-INavigableContent elements.");
+ }
+ else
+ TraceWarn("umbracoMacro",
+ "Error adding random node - parent (" + macroPropertyValue +
+ ") doesn't have children!");
+ }
+ else
+ TraceWarn("umbracoMacro",
+ "Error adding random node - parent (" + macroPropertyValue +
+ ") doesn't exists!");
+ break;
+
+ case "mediaCurrent":
+ parameters.Add(new MacroNavigator.MacroParameter(
+ macroPropertyAlias,
+ mediaNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty
+ 0));
+ break;
+
+ default:
+ parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, HttpContext.Current.Server.HtmlDecode(macroPropertyValue)));
+ break;
+ }
+ }
+
#endregion
///