Orchardcms 从“设置”菜单中隐藏项目

Orchardcms 从“设置”菜单中隐藏项目,orchardcms,Orchardcms,我创建了一个自定义部件,并通过部件处理程序中的ActivatingFilter将其附加到站点部件/内容项(类似于所描述的内容)。我还添加了一个设置菜单项,通过覆盖处理程序的GetItemMetadata方法并为其添加GroupInfo对象来编辑该部件。这是可行的,我可以按预期编辑我的角色 以下是我的部件处理程序的外观: public class ProductSettingsPartHandler : ContentHandler { public ProductSettings

我创建了一个自定义部件,并通过部件处理程序中的ActivatingFilter将其附加到站点部件/内容项(类似于所描述的内容)。我还添加了一个设置菜单项,通过覆盖处理程序的GetItemMetadata方法并为其添加GroupInfo对象来编辑该部件。这是可行的,我可以按预期编辑我的角色

以下是我的部件处理程序的外观:

public class ProductSettingsPartHandler : ContentHandler {
        public ProductSettingsPartHandler() {
            T = NullLocalizer.Instance;
            Filters.Add(new ActivatingFilter<ProductSettingsPart>("Site"));
        }

        public Localizer T { get; set; }

        protected override void GetItemMetadata(GetContentItemMetadataContext context) {
            if (context.ContentItem.ContentType != "Site")
                return;
            base.GetItemMetadata(context);

            // If I remove the following call, I can't use the site settings AdminController anymore.
            // But if I make this call, a menu item will be added to the Settings section - which I don't want.
            context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Pricing")) {
                Id = "Pricing",
                Position = "4.2"
            });
        }
    }
公共类产品设置SpartHandler:ContentHandler{
公共产品设置Sparthandler(){
T=NullLocalizer.Instance;
过滤器。添加(新激活过滤器(“站点”);
}
公共定位器T{get;set;}
受保护的覆盖无效GetItemMetadata(GetContentItemMetadataContext上下文){
if(context.ContentItem.ContentType!=“站点”)
返回;
base.GetItemMetadata(上下文);
//如果删除以下调用,我将无法再使用站点设置AdminController。
//但是,如果我打这个电话,一个菜单项将被添加到设置部分-这是我不想要的。
context.Metadata.EditorGroupInfo.Add(新的GroupInfo(T(“定价”)){
Id=“定价”,
Position=“4.2”
});
}
}
现在我想把菜单项移到另一个部分。我可以通过实现INavigationProvider并为其提供到我的部件设置的路径来创建新菜单项。但是,当我尝试从设置菜单中删除原始菜单项时(不再添加GroupInfo对象),我的新菜单项链接不再起作用

根据我的研究,看起来设置正在进行显式检查,以确保已为零件添加GroupInfo对象,否则不会返回视图进行编辑。这似乎使得无法使用设置AdminController编辑附加到站点内容部分的部分,但无法在设置菜单部分中显示它们

有没有关于如何解决这个问题的建议或想法?我的最终目标是将此站点设置部分与其他部分一样处理,但将用于更新它的菜单项显示在管理菜单的另一部分中

如果果园1.x分支有什么区别的话,我正在开发它


谢谢

要仅在特定组上显示给定零件编辑器,请替换

ContentShape("<your editor name>", () => ...);
ContentShape(“,()=>…);

ContentShape(“,()=>…).OnGroup(“定价”);
在部件驱动程序的编辑器方法中。除了您已经对上面的处理程序执行的操作之外

更新:

在再次阅读你的问题两遍之后,我想我最初误解了这个问题。您希望AdminController继续工作,但提供的组不应显示在“设置”下

如果不重写默认的Orchard行为,这是不可能的。默认设置AdminController要求该组存在,从而使其始终显示在菜单中


最简单的解决方案是创建您自己的控制器,您将指向该控制器的管理链接。复制和粘贴当前AdminController并从中删除所有与GroupInfo相关的检查应该可以做到这一点。

感谢您的回复。实际上我已经有了它,但它仍然显示设置组中的菜单项。似乎管理员设置是经过特殊处理的。除非我想出更好的方法,否则我倾向于抑制Orchard.Core.settings.AdminMenu,并使用我自己的版本跳过呈现定价菜单项。这看起来合理吗?@joshb,这样行得通,但看起来相当肮脏。最好推出自己的控制器。如果您想添加额外的权限检查、更多的逻辑等,它也会很有用。我同意它是肮脏的。创建自己的控制器效果很好。非常有帮助@piotr-谢谢!
ContentShape("<your editor name>", () => ...).OnGroup("Pricing");