我有一个列表(假设问题列表),并且有一个与之关联的工作流程。工作流程可以将项目的状态列调整为“已关闭”。关闭项目的状态后,我想将其设置为只读,以便没有人可以编辑该项目或为该项目创建另一个工作流程实例。
实现这一目标的最佳方式是什么?
答案 0 :(得分:4)
可以设置项级权限,因此您可以逐项覆盖列表级权限。将此功能添加到现有工作流程中可能最有意义,但当然SharePoint没有为您提供任何开箱即用的功能。
幸运的是,您可以通过创建自己的自定义操作来扩展SharePoint的工作流程。在SP2010中执行此操作的过程与2007年基本相同;看看this MSDN tutorial for an overview of the process。
在名为SPDActivities at CodePlex的开源产品中还提供了一个方便的自定义活动包。您特别感兴趣的是Grant Permission on Item activity。即使您选择不使用整个软件包,也可以检查源代码并查看实现自己的版本(我为过去的项目做了类似的事情)。
一旦您有用于设置项目权限级别的工作流操作,只需在现有工作流程中添加一个步骤,即可为受影响的受众群体或群组设置Read
权限。
答案 1 :(得分:2)
你看过SPUtility.js了吗?您可以获取状态字段的值,然后如果它是Closed
,则将其他字段设为只读(或隐藏它们)。这是使用在EditForm.aspx上的内容编辑器Web部件中添加的JavaScript完成的。
var myChoiceField = SPUtility.GetSPField('Single Choice Field');
if (myChoiceField.GetValue() == 'Closed') {
SPUtility.GetSPField('Field A').MakeReadOnly();
SPUtility.GetSPField('Field B').MakeReadOnly();
SPUtility.GetSPField('Field C').MakeReadOnly();
// etc..
}
完全公开..这是我维护的开源库。我仅使用SharePoint 2007对其进行了测试,但它也可以与SharePoint 2010一起使用(遗憾的是我无法访问要测试的SharePoint 2010环境)。
答案 2 :(得分:1)
我会用两种方式攻击它:
就个人而言,我更喜欢第一个选项,因为它符合SharePoint的安全理念,即不让用户尝试他们没有权限做的事情。以下代码是在列表项上设置只读权限的示例:
item.BreakRoleInheritance(false);
SPRoleDefinition role = web.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleAssignment assignment = new SPRoleAssignment(web.AssociatedVisitorGroup);
assignment.RoleDefinitionBindings.Add(role);
item.RoleAssignments.Add(assignment);
答案 3 :(得分:0)
尝试创建事件接收器并处理删除事件。
答案 4 :(得分:0)
Idea(未经测试):将自定义内容类型添加到列表中(这将允许您控制以后以管理员身份进行编辑)。工作流程切换到自定义CT,项目是"关闭"。将项目数据的只读视图添加到EditForm.aspx,并在Designer中添加类"隐藏"到你的只读视图。然后在页面上的CDWP中添加自定义css,用于类.hidden display:none。然后使用JavaScript根据CT添加/删除该类,以便只读视图仅对自定义CT可见,而编辑wp对所有其他视图都可见。
或者使用自定义InfoPath表单根据状态切换到只读视图...