|
2 | 2 | using System.Collections.Generic;
|
3 | 3 | using System.Globalization;
|
4 | 4 | using System.Linq;
|
| 5 | +using System.Reflection; |
5 | 6 | using System.Text;
|
6 | 7 | using System.Web;
|
| 8 | +using Umbraco.Core; |
7 | 9 | using Umbraco.Core.Models;
|
8 | 10 | using umbraco.BasePages;
|
9 | 11 | using umbraco.BusinessLogic;
|
@@ -73,61 +75,64 @@ function openContent(id) {
|
73 | 75 | /// Renders the specified tree item.
|
74 | 76 | /// </summary>
|
75 | 77 | /// <param name="Tree">The tree.</param>
|
76 |
| - /*public override void Render(ref XmlTree Tree) |
| 78 | + public override void Render(ref XmlTree Tree) |
77 | 79 | {
|
78 |
| - //get documents to render |
79 |
| - Document[] docs = Document.GetChildrenForTree(m_id); |
| 80 | + if (UseOptimizedRendering == false) |
| 81 | + { |
| 82 | + //We cannot run optimized mode since there are subscribers to events/methods that require document instances |
| 83 | + // so we'll render the original way by looking up the docs. |
80 | 84 |
|
81 |
| - var args = new TreeEventArgs(Tree); |
82 |
| - OnBeforeTreeRender(docs, args); |
| 85 | + //get documents to render |
| 86 | + var docs = Document.GetChildrenForTree(m_id); |
83 | 87 |
|
84 |
| - foreach (Document dd in docs) |
85 |
| - { |
86 |
| - List<IAction> allowedUserOptions = GetUserActionsForNode(dd); |
87 |
| - if (CanUserAccessNode(dd, allowedUserOptions)) |
| 88 | + var args = new TreeEventArgs(Tree); |
| 89 | + OnBeforeTreeRender(docs, args); |
| 90 | + |
| 91 | + foreach (var dd in docs) |
88 | 92 | {
|
| 93 | + var allowedUserOptions = GetUserActionsForNode(dd); |
| 94 | + if (CanUserAccessNode(dd, allowedUserOptions)) |
| 95 | + { |
89 | 96 |
|
90 |
| - XmlTreeNode node = CreateNode(dd, allowedUserOptions); |
| 97 | + var node = CreateNode(dd, allowedUserOptions); |
91 | 98 |
|
92 |
| - OnRenderNode(ref node, dd); |
| 99 | + OnRenderNode(ref node, dd); |
93 | 100 |
|
94 |
| - OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); |
95 |
| - if (node != null) |
96 |
| - { |
97 |
| - Tree.Add(node); |
98 |
| - OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 101 | + OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 102 | + if (node != null) |
| 103 | + { |
| 104 | + Tree.Add(node); |
| 105 | + OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 106 | + } |
99 | 107 | }
|
100 | 108 | }
|
| 109 | + OnAfterTreeRender(docs, args); |
101 | 110 | }
|
102 |
| - OnAfterTreeRender(docs, args); |
103 |
| - }*/ |
104 |
| - public override void Render(ref XmlTree Tree) |
105 |
| - { |
106 |
| - //get documents to render |
107 |
| - var entities = Services.EntityService.GetChildren(m_id, UmbracoObjectTypes.Document).ToArray(); |
108 |
| - |
109 |
| - var args = new TreeEventArgs(Tree); |
110 |
| - OnBeforeTreeRender(entities, args, true); |
111 |
| - |
112 |
| - foreach (var entity in entities) |
| 111 | + else |
113 | 112 | {
|
114 |
| - var e = entity as UmbracoEntity; |
115 |
| - List<IAction> allowedUserOptions = GetUserActionsForNode(e); |
116 |
| - if (CanUserAccessNode(e, allowedUserOptions)) |
117 |
| - { |
118 |
| - XmlTreeNode node = CreateNode(e, allowedUserOptions); |
119 | 113 |
|
120 |
| - OnRenderNode(ref node, new Document(entity, LoadMinimalDocument)); |
| 114 | + //We ARE running in optmized mode, this means we will NOT be raising the BeforeTreeRender or AfterTreeRender |
| 115 | + // events and NOT calling the OnRenderNode method - we've already detected that there are not subscribers or implementations |
| 116 | + // to call so that is fine. |
121 | 117 |
|
122 |
| - OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); |
123 |
| - if (node != null) |
| 118 | + var entities = Services.EntityService.GetChildren(m_id, UmbracoObjectTypes.Document).ToArray(); |
| 119 | + foreach (var entity in entities) |
| 120 | + { |
| 121 | + var e = entity as UmbracoEntity; |
| 122 | + var allowedUserOptions = GetUserActionsForNode(e); |
| 123 | + if (CanUserAccessNode(e, allowedUserOptions)) |
124 | 124 | {
|
125 |
| - Tree.Add(node); |
126 |
| - OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 125 | + var node = CreateNode(e, allowedUserOptions); |
| 126 | + |
| 127 | + OnBeforeNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 128 | + if (node != null) |
| 129 | + { |
| 130 | + Tree.Add(node); |
| 131 | + OnAfterNodeRender(ref Tree, ref node, EventArgs.Empty); |
| 132 | + } |
127 | 133 | }
|
128 | 134 | }
|
129 | 135 | }
|
130 |
| - OnAfterTreeRender(entities, args, true); |
131 | 136 | }
|
132 | 137 |
|
133 | 138 | #region Tree Create-node-helper Methods - Legacy
|
@@ -475,5 +480,35 @@ protected List<IAction> RemoveDuplicateMenuDividers(List<IAction> actions)
|
475 | 480 | return umbraco.BusinessLogic.Actions.Action.FromString(fullMenu);
|
476 | 481 | }
|
477 | 482 |
|
| 483 | + /// <summary> |
| 484 | + /// Returns true if we can use the EntityService to render the tree or revert to the original way |
| 485 | + /// using normal documents |
| 486 | + /// </summary> |
| 487 | + /// <remarks> |
| 488 | + /// We determine this by: |
| 489 | + /// * If there are any subscribers to the events: BeforeTreeRender or AfterTreeRender - then we cannot run optimized |
| 490 | + /// * If there are any overrides of the method: OnRenderNode - then we cannot run optimized |
| 491 | + /// </remarks> |
| 492 | + internal bool UseOptimizedRendering |
| 493 | + { |
| 494 | + get |
| 495 | + { |
| 496 | + if (HasEntityBasedEventSubscribers) |
| 497 | + { |
| 498 | + return false; |
| 499 | + } |
| 500 | + |
| 501 | + //now we need to check if the current tree type has OnRenderNode overridden with a custom implementation |
| 502 | + //Strangely - this even works in med trust! |
| 503 | + var method = this.GetType().GetMethod("OnRenderNode", BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(XmlTreeNode).MakeByRefType(), typeof(Document) }, null); |
| 504 | + if (TypeHelper.IsOverride(method)) |
| 505 | + { |
| 506 | + return false; |
| 507 | + } |
| 508 | + |
| 509 | + return true; |
| 510 | + } |
| 511 | + } |
| 512 | + |
478 | 513 | }
|
479 | 514 | }
|
0 commit comments