permissions - ¿Cómo se puede suprimir[Artículo no encontrado] en elementos seleccionados del multilista de Sitecore si se debe a permisos?
(1)
Nuestro árbol de contenido de Sitecore generalmente se divide en páginas globales y locales (o específicas de un país) para atender a los clientes de nuestras sucursales. Como era de esperar, las páginas globales aparecen para todos los visitantes de nuestro sitio, independientemente de su ubicación geográfica, pero hemos implementado ciertos campos en las páginas globales que son localizables, por ejemplo, anuncios publicitarios, contenido destacado, etc.
Ya hemos configurado la seguridad para que, para un multilista, un editor de contenido determinado solo vea los elementos en el lado izquierdo al que tienen acceso. Lo que nos encontramos es que los elementos elegidos por otros editores de contenido de la rama se muestran en el área "seleccionada" de la derecha del multilista y, si el editor de contenido que está viendo el elemento actualmente no tiene permisos para eso, se muestran como [Artículo no encontrado]. Hemos tenido editores de contenido con buenas intenciones que hacen doble clic erróneamente para eliminarlos, sin darse cuenta de que están eliminando el contenido intencionalmente colocado por otros editores. A continuación se muestra una captura de pantalla de cómo se ve, utilizando la vista de uno de nuestros editores de contenido en alemán:
Lo que estoy tratando de determinar es si hay una manera, utilizando la seguridad u otros métodos, para suprimir por completo los mensajes [ítems no encontrados] para los elementos a los que el editor de contenido actual no tiene permisos. Cualquier sugerencia de una buena manera de hacer esto (si es factible) sería apreciada.
Puede crear su propia clase Multilist
heredando de la clase Sitecore.Shell.Applications.ContentEditor.MultilistEx
y anular el método DoRender()
de esta clase. En un lugar donde se muestra el texto [Item Not Found]
, verifique si el artículo existe pero el usuario no tiene derechos de acceso (tratando de recuperar el elemento con SecurityDisabler
) y muestre el mensaje adecuado.
Luego debe ir a la core
datos core
y registrar su tipo de campo:
Y finalmente cambie el tipo de su campo al tipo recién creado; su campo se verá así:
El código a continuación es el código MultilistEx
reflejado original que los cambios necesita:
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());
}
}
}