Permissions 如果由于权限原因,在Sitecore多列表选定项目中抑制[Item not found]的方法?

Permissions 如果由于权限原因,在Sitecore多列表选定项目中抑制[Item not found]的方法?,permissions,sitecore,Permissions,Sitecore,我们的Sitecore内容树通常分为全球和本地(或特定国家/地区)页面,以服务于我们分支机构的客户。正如您所期望的,全球页面将为我们网站的所有观众显示,而不管他们的地理位置如何,但我们在全球页面上实现了可本地化的某些字段,例如横幅广告、特色内容等 我们已经设置了安全性,这样,对于多列表,给定的内容编辑器只能看到左侧有权访问的项目。我们遇到的问题是,其他分支内容编辑器选择的项目显示在多列表的右侧“选定”区域中,如果当前查看该项目的内容编辑器没有这些项目的权限,则它们显示为[未找到项目]。我们曾经有

我们的Sitecore内容树通常分为全球和本地(或特定国家/地区)页面,以服务于我们分支机构的客户。正如您所期望的,全球页面将为我们网站的所有观众显示,而不管他们的地理位置如何,但我们在全球页面上实现了可本地化的某些字段,例如横幅广告、特色内容等

我们已经设置了安全性,这样,对于多列表,给定的内容编辑器只能看到左侧有权访问的项目。我们遇到的问题是,其他分支内容编辑器选择的项目显示在多列表的右侧“选定”区域中,如果当前查看该项目的内容编辑器没有这些项目的权限,则它们显示为[未找到项目]。我们曾经有过一些好心的内容编辑错误地双击这些内容来删除它们,却没有意识到他们删除了其他编辑故意放在那里的内容。下面是使用我们的一位德国内容编辑器的视图显示的屏幕截图:


我试图确定的是,是否有一种方法,使用安全性或其他方法,完全禁止当前内容编辑器没有权限访问的项目的[Item not found]消息。如果您能提供任何好方法的提示(如果可行的话),我们将不胜感激。

您可以创建自己的
Multilist
类,该类继承自
Sitecore.Shell.Applications.ContentEditor.MultilistEx
类并重写该类的
DoRender()
方法。在显示文本
[未找到项目]
的位置,检查项目是否存在但用户没有访问权限(通过尝试使用
SecurityDisabler
检索项目),并显示正确的消息

然后您需要转到
core
数据库并注册字段类型:

最后,将字段的类型切换为新创建的类型-您的字段将如下所示:

下面的代码是原始反映的
MultilistEx
代码,您需要对其进行更改:

使用系统集合;
使用System.Web.UI;
使用Sitecore;
使用Sitecore.Data.Items;
使用Sitecore.Diagnostics;
使用Sitecore。全球化;
使用Sitecore.Resources;
使用Sitecore.SecurityModel;
命名空间My.Assembly.namespace
{
公共类MyMultiListX:Sitecore.Shell.Applications.ContentEditor.MultiListX
{
受保护的覆盖void DoRender(HtmlTextWriter输出)
{
Assert.ArgumentNotNull(输出,“输出”);
选择ArrayList;
未选择的词典;
GetSelectedItems(GetItems(Sitecore.Context.ContentDatabase.GetItem(ItemID)),未选中,未选中);
ServerProperties[“ID”]=ID;
string disabledMessage=string.Empty;
如果(只读)
disabledMessage=“disabled=\”disabled\”;
输出。写入(“”);
输出。写入(“”);
输出。写入(“”);
output.Write(“+Translate.Text(“全部”)+”);
output.Write(“+Images.GetSpacer(20,1)+”);
output.Write(“+”Translate.Text(“选定”)+”);
output.Write(“+Images.GetSpacer(20,1)+”);
输出。写入(“”);
输出。写入(“”);
输出。写入(“”);
输出。写入(“”);
foreach(字典输入字典输入未选中)
{
Item unselectedItem=字典入口值作为项;
if(unselectedItem!=null)
output.Write(“+unselectedItem.DisplayName+”);
}
输出。写入(“”);
输出。写入(“”);
输出。写入(“”);
RenderButton(输出,“Core/16x16/arrow_blue_right.png”,“javascript:scContent.multilistMoveRight(“+ID+”)”)”;
输出。写入(“
”); RenderButton(输出,“Core/16x16/arrow_blue_left.png”,“javascript:scContent.multilistMoveLeft(“+ID+”)”)”; 输出。写入(“”); 输出。写入(“”); 输出。写入(“”); 对于(int index=0;index