permissions - 如果由于权限,如何在 Sitecore 多列表选定项目中抑制 [Item not found]?

标签 permissions sitecore

我们的 Sitecore 内容树通常分为全局和本地(或特定国家/地区)页面,为我们分支机构的客户提供服务。正如您所期望的,我们网站的所有浏览者都会看到全局页面,无论他们的地理区域如何,但我们已经在可本地化的全局页面上实现了某些字段,例如横幅广告、特色内容等。

我们已经设置了安全性,因此对于多列表,给定的内容编辑器只能看到他们有权访问的左侧项目。我们遇到的问题是其他分支内容编辑器选择的项目显示在多列表的右侧“选定”区域,如果当前查看项目的内容编辑器没有权限,它们显示为 [找不到项目]。我们有一些善意的内容编辑者错误地双击这些内容将其删除,而没有意识到他们正在删除其他编辑者故意放置在那里的内容。使用我们的一位德国内容编辑器的 View ,其外观的屏幕截图如下:

Example of Item not found presentation

我试图确定的是,是否有办法使用安全性或其他方法来完全抑制当前内容编辑器没有权限的项目的 [Item not found] 消息。任何有关执行此操作的好方法的提示(如果可行)将不胜感激。

最佳答案

您可以创建自己的 Multilist继承自 Sitecore.Shell.Applications.ContentEditor.MultilistEx 的类类和覆盖 DoRender()这个类的方法。在文字[Item Not Found]的地方显示,检查该项目是否存在但用户没有访问权限(通过尝试使用 SecurityDisabler 检索该项目)并显示正确的消息。

那么你需要去core数据库并注册您的字段类型:

sitecore my multilist ex

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

sitecore custom multilist field result

下面的代码是原始反射(reflect)MultilistEx您需要更改的代码:

using System.Collections;
using System.Web.UI;
using Sitecore;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Resources;
using Sitecore.SecurityModel;

namespace My.Assembly.Namespace
{
    public class MyMultilistEx : Sitecore.Shell.Applications.ContentEditor.MultilistEx
    {
        protected override void DoRender(HtmlTextWriter output)
        {
            Assert.ArgumentNotNull(output, "output");
            ArrayList selected;
            IDictionary unselected;
            GetSelectedItems(GetItems(Sitecore.Context.ContentDatabase.GetItem(ItemID)), out selected, out unselected);
            ServerProperties["ID"] = ID;
            string disabledMessage = string.Empty;
            if (ReadOnly)
                disabledMessage = " disabled=\"disabled\"";
            output.Write("<input id=\"" + ID + "_Value\" type=\"hidden\" value=\"" + StringUtil.EscapeQuote(Value) + "\" />");
            output.Write("<table" + GetControlAttributes() + ">");
            output.Write("<tr>");
            output.Write("<td class=\"scContentControlMultilistCaption\" width=\"50%\">" + Translate.Text("All") + "</td>");
            output.Write("<td width=\"20\">" + Images.GetSpacer(20, 1) + "</td>");
            output.Write("<td class=\"scContentControlMultilistCaption\" width=\"50%\">" + Translate.Text("Selected") + "</td>");
            output.Write("<td width=\"20\">" + Images.GetSpacer(20, 1) + "</td>");
            output.Write("</tr>");
            output.Write("<tr>");
            output.Write("<td valign=\"top\" height=\"100%\">");
            output.Write("<select id=\"" + ID + "_unselected\" class=\"scContentControlMultilistBox\" multiple=\"multiple\" size=\"10\"" + disabledMessage + " ondblclick=\"javascript:scContent.multilistMoveRight('" + ID + "')\" onchange=\"javascript:document.getElementById('" + ID + "_all_help').innerHTML=selectedIndex>=0?options[selectedIndex].innerHTML:''\" >");
            foreach (DictionaryEntry dictionaryEntry in unselected)
            {
                Item unselectedItem = dictionaryEntry.Value as Item;
                if (unselectedItem != null)
                    output.Write("<option value=\"" + GetItemValue(unselectedItem) + "\">" + unselectedItem.DisplayName + "</option>");
            }
            output.Write("</select>");
            output.Write("</td>");
            output.Write("<td valign=\"top\">");
            RenderButton(output, "Core/16x16/arrow_blue_right.png", "javascript:scContent.multilistMoveRight('" + ID + "')");
            output.Write("<br />");
            RenderButton(output, "Core/16x16/arrow_blue_left.png", "javascript:scContent.multilistMoveLeft('" + ID + "')");
            output.Write("</td>");
            output.Write("<td valign=\"top\" height=\"100%\">");
            output.Write("<select id=\"" + ID + "_selected\" class=\"scContentControlMultilistBox\" multiple=\"multiple\" size=\"10\"" + disabledMessage + " ondblclick=\"javascript:scContent.multilistMoveLeft('" + ID + "')\" onchange=\"javascript:document.getElementById('" + ID + "_selected_help').innerHTML=selectedIndex>=0?options[selectedIndex].innerHTML:''\">");
            for (int index = 0; index < selected.Count; ++index)
            {
                Item selectedItem = selected[index] as Item;
                if (selectedItem != null)
                {
                    output.Write("<option value=\"" + GetItemValue(selectedItem) + "\">" + selectedItem.DisplayName + "</option>");
                }
                else
                {
                    string path = selected[index] as string;
                    if (path != null)
                    {
                        string optionDisabled = string.Empty;
                        Item linkedItem = Sitecore.Context.ContentDatabase.GetItem(path);
                        Item notAccessibleItem;
                        using (new SecurityDisabler())
                        {
                            notAccessibleItem = Sitecore.Context.ContentDatabase.GetItem(path);
                        }

                        string text;

                        if (linkedItem == null && notAccessibleItem != null)
                        {
                            text = notAccessibleItem.DisplayName + " [You don't have access rights to this item]";
                            optionDisabled = " disabled=\"disabled\"";
                        }
                        else
                        {
                            text = linkedItem == null
                                              ? path + ' ' + Translate.Text("[Item not found]")
                                              : linkedItem.DisplayName + ' ' + Translate.Text("[Not in the selection List]");
                        }
                        output.Write("<option value=\"" + path + "\"" + optionDisabled + ">" + text + "</option>");
                    }
                }
            }
            output.Write("</select>");
            output.Write("</td>");
            output.Write("<td valign=\"top\">");
            RenderButton(output, "Core/16x16/arrow_blue_up.png", "javascript:scContent.multilistMoveUp('" + ID + "')");
            output.Write("<br />");
            RenderButton(output, "Core/16x16/arrow_blue_down.png", "javascript:scContent.multilistMoveDown('" + ID + "')");
            output.Write("</td>");
            output.Write("</tr>");
            output.Write("<tr>");
            output.Write("<td valign=\"top\">");
            output.Write("<div style=\"border:1px solid #999999;font:8pt tahoma;padding:2px;margin:4px 0px 4px 0px;height:14px\" id=\"" + ID + "_all_help\"></div>");
            output.Write("</td>");
            output.Write("<td></td>");
            output.Write("<td valign=\"top\">");
            output.Write("<div style=\"border:1px solid #999999;font:8pt tahoma;padding:2px;margin:4px 0px 4px 0px;height:14px\" id=\"" + ID + "_selected_help\"></div>");
            output.Write("</td>");
            output.Write("<td></td>");
            output.Write("</tr>");
            output.Write("</table>");
        }

        private void RenderButton(HtmlTextWriter output, string icon, string click)
        {
            Assert.ArgumentNotNull(output, "output");
            Assert.ArgumentNotNull(icon, "icon");
            Assert.ArgumentNotNull(click, "click");
            ImageBuilder imageBuilder = new ImageBuilder();
            imageBuilder.Src = icon;
            imageBuilder.Width = 16;
            imageBuilder.Height = 16;
            imageBuilder.Margin = "2px";
            if (!ReadOnly)
                imageBuilder.OnClick = click;
            output.Write((imageBuilder).ToString());
        }

    }
}

关于permissions - 如果由于权限,如何在 Sitecore 多列表选定项目中抑制 [Item not found]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153935/

相关文章:

linux - Symfony 权限被拒绝

python - 谷歌 colab/bin/bash : 'gdrive/My Drive/path/myfile : Permission denied

visual-studio-2010 - 在sitecore中跟踪NullReferenceExceptions

Sitecore 8、.NET 4.6、返回 404 的 bundle

linux - Docker - EACCES : permission denied, mkdir '/app/node_modules/.cache'

android - 为什么 Android VPN 应用程序不使用 BIND_VPN_SERVICE?

java - 无法在 API 级别 < 23 处正确检查权限

Sitecore 用户在内容树中看不到图像、富文本等字段的菜单按钮

sitecore - 访问其他语言网站

sitecore - RAZL是否可以比较不同版本的站点核心数据库