如何将Sitecore语言写入仅限于内容树的某些部分

wil*_*end 4 security permissions localization sitecore content-management-system

在我们的Sitecore实施中,我们有分支编辑,他们需要对英语及其母语(例如德语)进行语言写入访问.但是,我们的内容树的某些部分中的英文版本不应由这些分支编辑器编辑,但母语版本应该可以编辑.

举一个具体的例子,如果我们有一个产品页面上有一些全局信息(例如一个部件号),以及它上面的一些可本地化的信息(例如描述字段),我们正在使用字段级安全性来锁定全局(部件号)字段,但需要一种方法来确保德国编辑器可以创建项目的德语版本并放入其翻译的可本地化(描述)文本,但不能无意中切换到并更新英文版本那个描述.

我理解在某些角色的系统>语言上设置语言读/写.我们已经涵盖了这一部分.我想知道的是,如果有一种方法可以有效地完成以下类型的场景,对于具有英语和德语版本的写入权限的假设内容编辑器:

    • 第1项(编辑器具有英语和德语版本的写入权限)
    • ......子项目1
    • ......子项目2
    • 第2项(编辑器只能写入德语版本)
    • ......子项目1
    • ......子项目2

在此先感谢您的任何建议.

tec*_*414 5

据我所知,本地Sitecore安全模型在这方面存在缺陷.语言读/写访问权限无法本地化到内容树的给定部分.也就是说,如果您可以编辑语言,则可以对您具有写入权限的所有内容项执行此操作.

但是,我认为您可以使用saveUi管道和getContentEditorWarnings管道的组合来完成您的需求.

saveUi

在此管道中,您将需要一个处理器来检查用户是否应该能够使用当前语言编辑给定内容.我将告诉你如何配置/确定(XML配置?用户访问内容树分支中特定于语言的项目?),但是如果拒绝用户访问,则可以阻止保存.

public class CheckLanguageWritePermission
    {
        public string WorkflowStateID { get; set; }

        public void Process(SaveArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
            Assert.IsNotNull(args.Items, "args.Items");
            foreach (SaveArgs.SaveItem item in args.Items)
            {
                Item item2 = Sitecore.Client.ContentDatabase.Items[item.ID, item.Language];
                    if (/* user should not have permission*/)
                    {
                        AbortSave(args);
                        return;
                    }
            }
        }

        protected void AbortSave(SaveArgs args)
        {
            if (args.HasSheerUI)
            {
                SheerResponse.Alert("You do not have permission to edit this item in the current language.");
                SheerResponse.SetReturnValue("failed");
            }
            args.AbortPipeline();
        }
    }
Run Code Online (Sandbox Code Playgroud)

getContentEditorWarnings

由于您不能阻止用户使用这种方法实际编辑内容(只是保存它),您应该提供一个警告,说明同样多.

public class CheckLanguageWritePermission
{
    // Methods
    public void Process(GetContentEditorWarningsArgs args)
    {
        Item item = args.Item;
        if (/* user should not have permission*/)
        {
            GetContentEditorWarningsArgs.ContentEditorWarning warning = args.Add();
            warning.Title = "You do not have permission to edit this item in the current language.";
            warning.IsExclusive = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它不是一个完美的解决方案,但确实可以防止对内容进行不良编辑.如果正在进行版本控制/工作流程,您可以通过覆盖项目的UI命令来完全阻止添加新版本:addversion和item:checkout.

确定访问权限可能很棘手,最好的方法取决于您的特定业务规则.