我想设置一个工作流程,一旦用户进入某个状态,用户就无法编辑该项目。
根据Sitecore安全管理员食谱,工作流状态写权限 - 控制用户是否可以更新当前的项目 与特定工作流状态相关联。
我认为这将是完美的,但是,这是正确的,实际上也从项目中删除了所有工作流程命令。
基本上,在“正在审核”工作流状态中,用户应该只能选择“提交发布”或“拒绝”。拒绝操作,将项目返回到“草稿”的上一个工作流状态。提交发布,将工作流状态更改为“待批准”,发布者必须批准。编辑选项不应出现或被禁用。
我唯一的问题是,当项目处于“正在审核”时,编辑按钮仍然可用。当我修改“审阅”工作流状态的权限以拒绝编辑和/或工作流状态写入时,作者无法在项目上看到工作流程命令,并且他们会收到通知,表明他们没有对项目的编辑权限。
在某些时候,我能够以这样的方式设置权限,即我收到类似“此项目的工作流状态不允许编辑”的通知,但是我仍然可以看到并单击编辑按钮。我没有找到正确的安全设置来重新出现该通知。
谢谢,
诺娜
答案 0 :(得分:0)
在查看显示工作流状态命令的工作流面板的代码时,没有任何逻辑可以对工作流写入访问进行验证。
我被迫创建一个新类并为工作流状态添加一个isAllow检查。 https://github.com/NDurham12/Fmcti.SharedSource.Workflow。
我还要求Sitecore将此列为错误或功能请求。
答案 1 :(得分:0)
实际上,我刚才已经向Sitecore提出了这方面的支持,他们给了我以下解决方案:
当用户具有对项目的“读取”和“写入”访问权限以及“工作流状态写入”对工作流状态的访问权限时,可以在工作流中批准项目。 这些要求由设计规定。我将尝试注册一个关于允许开箱即用的这种行为的愿望。
现在,您可以使用和自定义Workbox来解决此设计决策。
您可以尝试使用以下解决方案:
例如:
private DataUri[] GetItems(WorkflowState state, IWorkflow workflow)
{
ArrayList list = new ArrayList();
DataUri[] items = workflow.GetItems(state.StateID);
if (items != null)
{
foreach (DataUri uri in items)
{
Item item = Context.ContentDatabase.Items[uri];
if (Sitecore.Context.User == "sitecore\Specific User")
{
if (((item != null) && item.Access.CanRead()) && (item.Access.CanReadLanguage() && item.Access.CanWriteLanguage()))
{
list.Add(uri);
}
}
else
{
if ((((item != null) && item.Access.CanRead()) && (item.Access.CanReadLanguage() && item.Access.CanWriteLanguage())) && ((Context.IsAdministrator || item.Locking.CanLock()) || item.Locking.HasLock()))
{
list.Add(uri);
}
}
}
}
return (list.ToArray(typeof(DataUri)) as DataUri[]);
}
注意,您可能还想在Workbox中隐藏“打开”项或覆盖它的行为。我可以看到两种方法来实现这一点,我将为每种方法提供说明,以便您可以选择使用哪种方法。
<WorkboxCommand Icon="Applications/16x16/document_view.png" Header="Open" Command="$Click"/>
但在这种情况下,所有用户都会隐藏“打开”按钮。
例如:
protected void Open(string id, string language, string version)
{
string sectionID = RootSections.GetSectionID(id);
UrlString str2 = new UrlString();
str2.Append("ro", sectionID);
str2.Append("fo", id);
str2.Append("id", id);
str2.Append("la", language);
str2.Append("vs", version);
var application = "/sitecore/content/Applications/Content editor";
Item item = Client.Site.Database.Items[application];
if (item == null) SheerResponse.Eval("alert('You do not have access to the Content Editor')");
else
Windows.RunApplication("Content editor", str2.ToString());
}
请注意,这些所有代码示例都只是示例,也许最好让用户能够编辑内容 - 但只能使用一些允许的部分。