【问题标题】:Way to suppress [Item not found] in Sitecore multilist selected items if due to permissions?如果由于权限,在 Sitecore 多列表选定项目中抑制 [未找到项目] 的方法?
【发布时间】:2013-11-22 20:30:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: permissions sitecore


    【解决方案1】:

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

    然后你需要去core数据库注册你的字段类型:

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

    下面的代码是您需要更改的原始反映的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());
            }
    
        }
    }
    

    【讨论】:

    • +1 “我们有好心的内容编辑器错误地双击这些内容以将其删除” - 您可能希望在用户的选项上设置&lt;option disabled="disabled"&gt;无权访问,因此他们无法将其从所选列表中删除
    • 这看起来是个不错的选择——非常感谢;会试一试的!
    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多