SharePoint中一般用List 来存储数据,用Library来存储文件,最近做的项目中,由于List中的Column实在太多,每次填个表单都要花很多时间,用户也由此感受,每个单子中,很多信息都是一样的,如何才能实现快速填写表单呢?
如果可以基于旧的表单复制一份,然后修改不同的信息,不就达到要求嘛。
SharePoint2010中的CustomAction+COM让这种想法成为可能。
先看效果(选中一条记录的时候,按钮才可用)
实现思路:获取选中Item的ID,然后根据ID可以获取当前Item,新建一个Item,将选中的Item信息赋给New Item.
实现步骤:
1.定义Action显示位置
<CommandUIDefinition Location="Ribbon.ListItem.Manage.Controls._children">
<Button Id="Ribbon.CustomTab.CopyItem"
Image32by32="/_layouts/images/CATLG.gif"
Command="CopyItem"
Description="Copy Document"
LabelText="Copy Document"
Sequence="3"
TemplateAlias="o1"/>
</CommandUIDefinition>
2.定义Action功能
CA(CustomAction)的功能由CommandUIHandler中的CommandAction属性来定义。
CommandAction="javascript:
function CopyItem() {
var items = SP.ListOperation.Selection.getSelectedItems();
if (items.length == 0) return;
var id;
for (var i in items) {
id = items[i].id;
break;
} //获取选中Item的Id
var listId = SP.ListOperation.Selection.getSelectedList();
//Get current web
var myWeb = myContext.get_web();
//Get list
var myList = myWeb.get_lists().getById(listId);
//Get Item
var curItem = myList.getItemById(id); //获取选中的Item
var contentType = curItem.get_contentType();
var fields = contentType.get_fields();
myContext.load(curItem);
myContext.load(fields);
myContext.executeQueryAsync
(
function () {
var newItem = myList.addItem(new SP.ListItemCreationInformation()); //通过COM 创建一条Item
var fieldEnumerator = fields.getEnumerator();
var myDate=new Date();
while (fieldEnumerator.moveNext()) { //开始赋值
var field = fieldEnumerator.get_current();
if (field.get_readOnlyField()) continue;
var name = field.get_internalName();
if (name == 'ContentType') name = 'ContentTypeId';
var value = curItem.get_item(name);
newItem.set_item(name, value);
}
newItem.update();
myContext.load(newItem);
myContext.executeQueryAsync(
function () {
alert('New document has been created.'); // NewItem赋值完毕
var id = newItem.get_id(); //获取刚创建的 Item Id
OpenSubMenuDialog('/Lists/Test/EditForm.aspx?ID='+id+'&ContentTypeId=0x01003b7743e4960c4618865f01f122aeb900');//打开刚才赋值的Item
//因为Item已经创建完毕,所以是跳转到EditForm而不是NewForm
},
function () { alert('CopyItem() failed:' + args.get_message()); });
},
function () {
alert('CopyItem() failed:' + args.get_message());
});
}
CopyItem();"
3.根据上下文来控制CustomAction(必须只选中一条记录,才可用)
EnabledScript="javascript:
function enableDelegates()
{
var items = SP.ListOperation.Selection.getSelectedItems();
var viewName = getcurrurlFileName();
if (items.length != 1)
return false;
else
return true;
}
enableDelegates();"
至此CopyListItem核心功能开发完毕,如果想进一步的拓展,比如结合权限控制,只有相应权限的用户/组才能用,可以自行扩展。
思路很简单,在EnabledScript中,加一个条件来判断权限的.