我创建了一个自定义部件,并通过我部件处理程序中的ActivatingFilter将其附加到Site部件/内容项(类似于所描述的here)。我还添加了一个Settings菜单项,通过覆盖处理程序的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"
});
}
}
现在我想把菜单项移到另一个部分。我可以通过实现INavigationProvider创建新的菜单项,并为我提供设置AdminController的路径。但是,当我尝试从“设置”菜单中删除原始菜单项时(不再添加GroupInfo对象),我的新菜单项链接不再起作用。
根据我的研究,看起来设置AdminController正在进行显式检查,以确保为部件添加了GroupInfo对象,或者它不会返回视图进行编辑。这似乎使得无法使用AdminController设置来编辑附加到网站内容部分的部分,但不能在“设置”菜单部分中显示它们。
有关如何解决此问题的任何建议或想法?我的最终目标是像对待任何其他网站一样处理此网站设置部分,但是在管理菜单的另一部分中显示用于更新它的菜单项。
如果有任何不同,我正在开发Orchard 1.x分支。
谢谢!
答案 0 :(得分:2)
要仅在特定组上显示给定的零件编辑器,请替换
ContentShape("<your editor name>", () => ...);
与
ContentShape("<your editor name>", () => ...).OnGroup("Pricing");
在你的部分驱动程序的Editor方法中。除了你已经使用上面的处理程序做的事情。
更新:
再次重读你的问题后,我想我最初误解了这个问题。您希望AdminController继续工作,但提供的组不应出现在“设置”下。
如果不覆盖默认的Orchard行为,这是不可能的。默认设置AdminController要求组存在,这反过来使它始终显示在菜单中。
最简单的解决方案是创建您自己的控制器,您将指向管理员链接。复制并粘贴当前的AdminController并从中删除所有与GroupInfo相关的检查应该可以解决问题。