如何在Presentation Details的Controls列表中隐藏Sublayout?
可行解决方案
针对你提到的需求——保留旧Sublayout供历史页面版本使用,但在编辑器的可用Sublayout列表中隐藏它,以下是几种实用方法:
方法1:启用__HideInEditor隐藏字段
这是最直接的内置方案:
- 在Content Editor中打开目标Sublayout项,切换到Standard Fields视图
- 展开Appearance分组,找到
__HideInEditor字段 - 勾选该字段的复选框并保存
设置后,该Sublayout会从编辑器的可用控件列表中消失,但已关联到旧页面版本的实例不受影响,系统仍能正常渲染它们。
方法2:通过权限控制隐藏
利用Sitecore的权限体系限制编辑用户的可见性:
- 打开Security Editor,定位到待退役的Sublayout项
- 针对普通编辑角色(如
Sitecore\Author),设置Read权限为拒绝 - 确保系统内置账户(如
Sitecore\Anonymous、Sitecore\System)仍保留读取权限,避免旧页面加载失败
这种方法的优势是可以精准控制哪些角色看不到该Sublayout,适合需要区分用户权限的场景。
方法3:自定义管道处理器过滤
如果以上方法无法满足需求,可以通过自定义代码过滤可用列表:
- 创建一个继承自
GetAvailableRenderingsProcessor的处理器类,添加过滤逻辑:
using Sitecore.Pipelines.GetAvailableRenderings; using Sitecore.Data; public class FilterRetiredSublayout : GetAvailableRenderingsProcessor { // 配置待退役Sublayout的ID public string RetiredSublayoutId { get; set; } public override void Process(GetAvailableRenderingsArgs args) { if (string.IsNullOrEmpty(RetiredSublayoutId) || args.Renderings == null) return; var targetId = new ID(RetiredSublayoutId); // 从可用列表中移除目标Sublayout args.Renderings = args.Renderings.Where(rendering => rendering.ID != targetId).ToList(); } }
- 在Sitecore配置文件中注册该处理器,插入到
getAvailableRenderings管道的合适位置:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <getAvailableRenderings> <processor type="YourNamespace.FilterRetiredSublayout, YourAssembly" patch:after="processor[@type='Sitecore.Pipelines.GetAvailableRenderings.GetRenderingDatasource, Sitecore.Kernel']"> <RetiredSublayoutId>{待退役Sublayout的ID}</RetiredSublayoutId> </processor> </getAvailableRenderings> </pipelines> </sitecore> </configuration>
注意事项
- 优先使用方法1,无需代码改动,操作简单
- 权限控制需谨慎,避免误设置导致系统无法访问该Sublayout
- 自定义代码需要部署到Sitecore实例,并充分测试确保不影响现有功能
内容的提问来源于stack exchange,提问作者Ron Ritchie
相关产品推荐
相关产品推荐

