私の知る限り、ネイティブの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();
}
}
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;
}
}
}
これは完璧なソリューションではありませんが、コンテンツへの望ましくない編集を防ぎます。バージョン管理/ワークフローが機能している場合は、item:addversionおよびitem:checkoutのUIコマンドをオーバーライドすることで、新しいバージョンの追加を完全に防ぐことができる場合があります。
アクセス権の決定には注意が必要な場合があります。そのための最善の方法は、特定のビジネスルールによって異なります。