Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
You're calling base.OnPreRender() on the EditTree, which calls RegisterRightClickScripts() which in turn unfortunately calls Render() on the RightClickMenu.
One way could be to do a public new RightClickMenuItemCollection Items { get; } and fiddle around with it a bit.
Yeah, i just saw the Render inside the RegisterRightClickScripts. I've been digging around trying to do it on the client but I couldn't there either. Could you elaborate on your idea with the Items collection? Seems like a good idea, but I don't see how I could get the RegisterRightClickScripts method to behave differently with it.
I was thinking something like this:
Subclass both EditTree and RightClickMenu, then modify your EditTrees Menu property to return your own implementation of RightClickMenu.
Modify your own implementation of RightClickMenu to exclude "setaccesscaption" (or a list of strings from a nice property :)) from Items.
I haven't tried it, but from looking through Reflector it should work. The alternative would be lots of copy and paste coding, I think. :(
Had only the RegisterRightClickScripts method used the Menu property and not the _menu field... And RegisterRightClickScripts is itself of course private. How could they make something so simple so hard? :) I guess i could subclass EditTree and divert the call to RegisterRightClickScripts to a method of my own, but I'll have a hard time with the base.OnPreRender call...
What if you also modify the constructor to initialize _menu to your implementation of RightClickMenu?
And I agree, this feels like a very hacky way to do it... :)
You certainly can with reflection!
Type t = this.GetType();
FieldInfo field = t.GetField("_menu", BindingFlags.NonPublic);
field.SetValue(t, new SuperDuperMenu());
You might have to change the BindingFlags.
Yeah, but that's a reeeeeally nasty hack :) I might have to though, thanks for the suggestion!
Bleh, it will work as long as they don't change the name of the private field... :) Good luck!
I have previously successfully removed items from the edit panel / page context menu. Now I'm trying to do it for the EditTree context menu but the items I remove somehow magically reappear. I've been digging around in reflector but can't figure out where they come from.
I have used the mapping VPP to redirect the EditTree.aspx to use my custom implementation. The original EditTree.aspx inherits EPiServer.UI.Edit.EditTree while I have the hierarchy CustomEditTree.aspx : MyLib.EditTree : EPiServer.UI.Edit.EditTree. Note that CustomEditTree.aspx doesn't have a codebehind, MyLib.EditTree is a class sitting in a different project, if that could matter.
MyLib.EditTree contains this:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// Remove change access rights menu item
if (Menu != null && Menu.Items.Contains("setaccesscaption"))
{
Menu.Items.Remove("setaccesscaption");
}
}
I can step through the code and see that base.OnPreRender results in 10 items being added to Menu.Items (it is empty before this call). I can also see that the "setaccesscaption" does exist and that it is remove, leaving 9 items when the method returns.
But still, all ten items are rendered in the menu. Even if I do Clear() on the collection and verify that it is indeed empty, the context menu will appear the same.
Any hints or suggestions?
Thanks in advance,
Magnus