在SharePoint2013中,经常需要对用户界面进行定制以满足特定的业务需求。一个常见的需求是控制用户对列表项的删除权限。例如,可能希望在用户选择列表项时禁用删除图标,但当用户登录到SharePoint站点并选择他们自己创建的列表项时,如果只选择了一个,他们应该能够看到删除选项。这可以通过自定义权限级别来实现,删除权限被移除,并且使用项目级别或文件夹级别的权限,但这可能会导致权限继承管理上的问题。另一种方法是编写事件处理程序来防止删除该项,但最佳实践是使用jQuery/CSOM/REST API来实现。
以下是实现上述需求的步骤:
首先,访问SharePoint2013网站。
从该页面,选择“站点操作”|“编辑页面”。编辑页面后,转到Ribbon上的“插入”选项卡,点击“Web部件”。在“Web部件”选择器区域,转到“媒体和内容”类别,选择“脚本编辑器”Web部件并按下“添加”按钮。
一旦Web部件被插入到页面中,会看到一个“编辑代码片段”链接;点击它。可以插入以下HTML和/或JavaScript代码:
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
ExecuteOrDelayUntilScriptLoaded(init_HideButton, "sp.ribbon.js");
});
function init_HideButton() {
setInterval(function() {
HideDeleteIconRibbomButton();
}, 1000);
}
function HideDeleteIconRibbomButton() {
$('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').hide();
var cc = new SP.ClientContext.get_current();
var web = cc.get_web();
var listId = SP.ListOperation.Selection.getSelectedList();
var selectedItems = SP.ListOperation.Selection.getSelectedItems();
if (selectedItems.length == 1) {
var flag = CheckCreatedAuthor(listId, selectedItems[0].id, _spPageContextInfo.userId);
if (flag) {
$('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').show();
}
} else {
$('a[id*="Ribbon.ListItem.Manage.Delete-Medium"]').hide();
}
}
function CheckCreatedAuthor(ListId, ItemID, AuthorID) {
var result = false;
var url = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbyid('" + ListId + "')/items?$filter=((ID eq '" + ItemID + "') and (ApprovalStatus eq 'Draft') and (Author/ID eq '" + AuthorID + "')";
getListItems(url, function(data) {
var items = data.d.results;
if (items.length > 0) {
result = true;
} else {
result = false;
}
}, function(data) {
result = false;
});
return result;
}
function getListItems(siteurl, success, failure) {
$.ajax({
async: false,
url: siteurl,
method: "GET",
headers: {
"Accept": "application/json; odata=verbose"
},
success: function(data) {
success(data);
},
error: function(data) {
failure(data);
}
});
}
</script>
在没有任何列表项选择的情况下隐藏Ribbon上的删除图标: